基础Sql语句之一

检索数据

  • 检索单列
    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
【基础Sql语句之一】

排序检索数据
  • 使用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...

    推荐阅读