检索数据
- 检索单列
select columnname from tablename- 检索多列
select column0, column1 from tablename- 检索所有列
select * from tablename- 没有明确排序查询,则返回的数据顺序没有特殊意义
- 使用 distinct检索不同行
select distinct column0 from tablename- distinct关键字会应用于所有列而不仅是前置他的列
- 使用limit限制检索结果
select column0 from tablename limit N //返回前N行 select column0 from tablename limit M, N //返回指定起始行M的N行 select column0 from tablename limit N offset M //返回指定起始行M的N行
- 使用完全限定表名的Sql
select TName.id from dbname.TName //select id from TName
排序检索数据
- 使用order by
select column0 form tablename order by column1- 为了按多个列排序,只要指定列名并用逗号分隔即可
- 排序默认使用升序,对应关键字为asc。也可以使用降序,对应关键字为desc
select column0 from tablename order by column1, column2 desc- desc 只应用于位于其前面的列名
过滤数据
- 使用where
select * from tablename where column1 = N- 同时使用where和order by时,order by应位于where后
- MySql执行匹配默认不区分大小写
- where子句操作符
select * from tablename where column0 between M and N
| 操作符 | 说明 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| != | 不等于 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
| between | 在指定的两个值之间 |
- NULL 用于表示无值
select * from tablename where column0 is null- 使用多个where,并用and与or连接(and优先级高于or)
select * from TName where C0 = N and (C1 = M or C2 = K)- 使用in指定条件范围
select * from TName where C0 in (N, M, K)- in操作符一般比or快且in可以包含其他select语句来建立动态where子句
- not 用来否定in、between、exists
select * from TName where C0 not in (N, M, K)- 使用binary区分大小写的匹配
select * from TName where C0 = binary "Szn"
使用通配符进行过滤
- 为了在搜索子句中使用通配符,必须使用like操作符。通配符可以在搜索模式中任意位置使用,且可以使用多个通配符
- %表示任何字符出现任意次数,%不可匹配null
- _表示能匹配任意单个字符,不能多也不能少
select * from TName where C0 like "%szn%"
select * from TName where C0 like "_szn%"- 显而易见的是,使用通配符会增加搜索时间,最好别将其放置于搜索的开始处
用正则表达式进行搜索
- 使用regexp进行正则搜索
select * from TName where C0 regexp N //将返回所有C0中包含N的行- .表示任意一个字符
select * from TName where C0 regexp ".szn"- |表示搜索为两个串之一
select * from TName where C0 regexp "szn|Hello"- []表示匹配给定的字符集合
select * from TName where C0 regexp "[123]Szn"- [^]表示匹配任何不包含的字符
select * from TName where C0 regexp "[^123]Szn"- [a-b]表示匹配a-b之间的所有字符
select * from TName where C0 regexp "[0-9a-zA-Z]Szn"- 使用正则表达式时,对于. [] | -等特殊字符的匹配需要用两个反斜杠进行转义
select * from TName where C0 regexp "\\[]"- 字符类
select * from TName where C0 regexp "[[:alnum:]]"
| 类 | 说明 |
|---|---|
| [:alnum:] | 任意字母与数字(同[a-zA-Z0-9]) |
| [:alpha:] | 任意字母(同[a-zA-Z]) |
| [:blank:] | 空格和制表 |
| [:cntrl:] | ASCII控制字符(ASCII 0-31和127) |
| [:digit:] | 任意数字(同[0-9]) |
| [:graph:] | 与[:printf:]相同,单不包括空格 |
| [:lower:] | 任意小写字母(同[a-z]) |
| [:print:] | 任意可打印字符 |
| [:punct:] | 不在[:alnum:]和[:cntrl:]中的任意字符 |
| [:upper:] | 任意大写字母(同[A-Z]) |
| [:xdigit:] | 任意十六进制数字(同[a-fA-F0-9]) |
- 匹配多个实例
select * from TName where C0 regexp "[a-z]{2}"
| 元字符 | 说明 |
|---|---|
| * | 0或多个匹配 |
| + | 1或多个匹配 |
| ? | 0或1个匹配 |
| {n} | 指定n个匹配 |
| {n,} | 不少于n的匹配 |
| {n, m} | 匹配数目的范围,m不超过255 |
- 定位符
select * from TName where C0 regexp "^szn"
| 元字符 | 说明 |
|---|---|
| ^ | 文本的开始 |
| $ | 文本的结尾 |
| [[:<:]] | 词的开始 |
| [[:>:]] | 词的结尾 |
- 在没有数据库的情况下测试正则表达式
select "hello world" regexp "[[:<:]]world" \\返回1
select "hello world" regexp "^world" \\返回0
创建计算字段
- 计算字段并不实际存在于数据库表中,而是在运行时由select语句内创建的
- concat函数来拼接两个列
- as赋予别名
select concat(C0, ",", C1) as Ct from TName
select concat("1", "2") as Re \\Re:"12"- 执行算术计算
select C0 + C1 as Sum from TName
使用数据处理函数
- 常用的文本处理函数
| 函数 | 说明 | 示例 | 结果 |
|---|---|---|---|
| left() | 返回串左边的字符 | select left("Hello", 2) |
"He" |
| right() | 返回串右边的字符 | select right("Hello", 2) |
"lo" |
| length() | 返回串的长度 | select length("Hello") |
5 |
| locate() | 得到字串的位置 | select locate("ll", "Hello") |
3 |
| lower() | 将串转为小写 | select lower("Hello") |
"hello" |
| upper() | 将串转为大写 | select upper("Hello") |
"HELLO" |
| ltrim() | 去掉串左边的空格 | select ltrim(" Hello ") |
"Hello " |
| rtirm() | 去掉串由边的空格 | select rtrim(" Hello ") |
" Hello" |
| trim() | 去掉串两边的空格 | select trim(" Hello ") |
"Hello" |
| substring() | 得到字串 |
select substring("Hello", 2)select substring("Hello" from 2)select substring("Hello", 2, 3)select substring("Hello", -2)select substring("Hello" from -4 for 3)
|
"ello" "ello" "ell" "lo" "ell" |
- 常用的日期和时间处理函数
- MySql的日期时间建议使用2000-01-02 03:04:05这种格式
- 以下列出的函数并不全,凑合着看吧
| 函数 | 说明 | 示例 | 结果 |
|---|---|---|---|
| addDate() | 增加一个日期(天、周等) | select addDate("2000-01-02 03:04:05", 2) |
2000-01-04 03:04:05 |
| addTime() | 增加一个时间(时、分等) |
select addTime("2000-01-02 03:04:05", "1:1:1")select addTime("2000-01-02 03:04:05", "1:1")select addTime("2000-01-02 03:04:05", 1)
|
2000-01-04 04:05:06 2000-01-04 04:05:05 2000-01-04 03:04:06 |
| curDate() | 返回当前日期 | select curdate() |
2018-3-18 |
| curTime() | 返回当前时间 | select curtime() |
21:53:45 |
| date() | 返回日期时间的日期部分 | select date("2000-01-02 03:04:06") |
2000-01-02 |
| time() | 返回日期时间的时间部分 | select time("2000-01-01 01:02:03") |
01:02:03 |
| dateDiff() | 计算日期之差 | select datediff("2000-01-01 01:02:03", "2000-01-03 01:02:03") |
-2 |
| date_Add() | 等效于addDate()使用interval标志后的效果 | 见下方表格 | 见下方表格 |
| date_Format() | 返回一个格式化的日期或时间串 | 格式化控制符一大堆不乐意记 | 懒得写 |
| year() | 类似 day() | 类似 day() | 类似 day() |
| month() | 类似 day() | 类似 day() | 类似 day() |
| day() | 返回时间的天数部分 | select day("2000-01-01 01:02:03") |
1 |
| hour() | 类似 day() | 类似 day() | 类似 day() |
| minute() | 类似 day() | 类似 day() | 类似 day() |
| second() | 类似 day() | 类似 day() | 类似 day() |
| dayOfWeek() | 对于一个日期,得到是星期几 | select dayofweek("2018-03-18 01:02:03") |
1 (备注:1代表周日) |
| now() | 得到当前时间 | select now() |
2018-03-18 22:05:10 |
- addDate(date, interval expr unit)
| 标识符 | 意义 | 示例 | 结果 |
|---|---|---|---|
| microsecond | microseconds | select addDate("2000-01-02 03:04:05", interval 1 microsecond) |
2000-01-02 03:04:05.000001 |
| second | seconds | select addDate("2000-01-02 03:04:05", interval 1 second) |
2000-01-02 03:04:06 |
| minute | minutes | select addDate("2000-01-02 03:04:05", interval 1 minute) |
2000-01-02 03:05:05 |
| hour | hours | select addDate("2000-01-02 03:04:05", interval 1 hour) |
2000-01-02 04:04:05 |
| day | days | select addDate("2000-01-02 03:04:05", interval 1 day) |
2000-01-03 03:04:05 |
| week | weeks | select addDate("2000-01-02 03:04:05", interval 1 week) |
2000-01-09 03:04:05 |
| month | months | select addDate("2000-01-02 03:04:05", interval 1 month) |
2000-02-02 03:04:05 |
| quarter | quarters | select addDate("2000-01-02 03:04:05", interval 1 quarter) |
2000-04-02 03:04:05 |
| year | years | select addDate("2000-01-02 03:04:05", interval 1 year) |
2001-01-02 03:04:05 |
| second_ microsecond |
seconds. microseconds |
select addDate("2000-01-02 03:04:05", interval 1.1 second_microsecond) |
2000-01-02 03:04:06.100000 |
| minute_ microsecond |
minutes:seconds. microseconds |
select addDate("2000-01-02 03:04:05", interval "1:1.000001" minute_microsecond) |
2000-01-02 03:05:06.000001 |
| minute_second | minutes:seconds | select addDate("2000-01-02 03:04:05", interval "1:1" minute_second) |
2000-01-02 03:05:06 |
| hour_ microsecond |
hours:miniutes: seconds. microseconds |
select addDate("2000-01-02 03:04:05", interval "1:1:1.1" hour_microsecond) |
2000-01-02 04:05:06.100000 |
| hour_second | hours:minutes: seconds |
类似用法 | 类似结果 |
| hour_miniute | hours:minutes | 类似用法 | 类似结果 |
| day_microsecond | days:hours: minutes: seconds. microsecond |
类似用法 | 类似结果 |
| day_second | 类似功能 | 类似用法 | 类似结果 |
| day_minute | 类似功能 | 类似用法 | 类似结果 |
| day_hour | 类似功能 | 类似用法 | 类似结果 |
| year_month | 类似功能 | 类似用法 | 类似结果 |
- 常用的数值处理函数
| 函数 | 说明 | 示例 | 结果 |
|---|---|---|---|
| abs() | 绝对值 | select abs(-1) |
1 |
| exp() | e的N次方 | select exp(1) |
2.71828... |
| sqrt() | 平方根 | select sqrt(4) |
2 |
| mod() | 取余数 | select mod(5, 3) |
2 |
| pi() | 圆周率 | select pi() |
3.1415926... |
| rand() | 随机值 | select rand() |
0.691745... |
| sin() | 正弦 | select sin(pi() / 6) |
0.499999... |
| cos | 余弦 | select cos(pi() / 3) |
0.500000... |
| tan() | 正切 | select tan(pi() / 4) |
0.99999... |