MySQL 查询语句通用写法
1 SELECT
2 DISTINCT <select_list>
3 FROM <left_table>
4 <join_type> JOIN <right_table>
5 ON <join_condition>
6 WHERE <where_condition>
7 GROUP BY <group_by_list>
8 HAVING <having_condition>
9 ORDER BY <order_by_condition>
10 LIMIT <limit_number>
执行顺序是3 4 5 6 7 8 1 2 9 10
1、select查询
2、distinct 去重
<select_list>查询列表。表中字段列表,也可以是 常量 表达式 函数。可以使用as 关键字为查询列表起别名。
3 4 5。连接查询 表示进行操作的数据集。
连接查询 多表查询, 连接语法有92语法 和 99语法 没有有效的连接条件默认就是笛卡尔积
内连接 (等值连接 非等值连接 自连接) 外连接 (左外连接 右外连接 全外连接) 交叉连接
根据其中一张表中每一行与另一张表每一行匹配,就是笛卡尔积连接,然后根据连接条件筛选出有效的行,无效的行过滤掉。
查询时可谓表起别名 as 也可以省略 如 (table1 as t1 ) (table2 t2)。注起别名后,限定表时不能使用原始名称了。
sql92标准 mysql中仅仅支持内连接
- 等值连接 多表等值连接结果为多表的交集部分 n表连接至少需要n-1连接条件
- 非等值连接 连接条件不为 = 可以使 between and > <等
- 自连接 自表的等值连接。比如员工表中有员工编号字段和领导标号。可以为一张表起两次别名。
sql99标准(mysql中支持内连 外连(左外,右外不支持全外连接)交叉连接) 推荐
select 查询列表 from 表1 别名 【连接类型】 join 表2 别名 on 连接条件 。。。
内连接 连接类型 inner 等值连接 非等值连接 自连接 同92
外连接 左外(left outer) 右外(right out) 全外(full out) out可省。查询一张表中有而另一张表中没有的数据。
- 左外连接 左表为主表,会显示左表全部内容,右表中如果没有匹配内容会显示null
- 右外连接 类似左外 右表为主表
- 全外连接 MySQL不支持 就是两张表中每一行都会显示,匹配的正常显示,匹配不到的就显示null
交叉连接 (就是笛卡尔积)cross join
6、WHERE 条件查询
- 按条件表达式筛选 条件运算符: >, <, =, >=, <=, !=, <>(就是不等于)
- 按逻辑表达式筛选 逻辑运算符:&&, ||, ! 对应 and, or, not
- 模糊查询 like, between and, in, is null
- like一般和通配符搭配使用。通配符 %( 任意多个字符) _(一个字符)
- between and 包含临界值。
- in 判断某字段的值是否属于in 列表中某一项
- is null MySQL字段值中可能出现null。这是不能用 = null 做判断安全等与可以判断null,<=>null
7、group by分组查询。一般可以搭配分组函数使用。查询列表比较特殊(分组函数和group by后出现的字段)
select 分组函数,列(出现在group by后面) from 表 group by 分组的列表
可按多个字段进行分组
8、having 分组后筛选条件。
一般来说,分组函数做条件一定是放在hanving字句中。 能用where分组前筛选的尽量使用分组前筛选。
除了字段,group by 也可以按照表达式,函数进行分组。
9、order by 排序 可以按 字段(单个或多个),表达式,函数 排序 关键字 asc 升序(默认) desc 降序一般放在查询语句最后 ,除了limit。
10、limit offset,size 分页 offset要显示条目的起始索引(从0开始) size 要显示的条目个数
附1:常见函数。 使用 函数名(实参列表)
单行函数
字符函数
- length 获取参数值字节个数 length(“张三丰hahaha”) 结果15,所占字节数和charset有关
- concat 拼接字符串 concat(‘a’,’-’,‘b’) 结果 ‘a-b’
- substr,substring 截取字符串,共四个函数重载。索引从1开始 。常用
- substr(‘张无忌陆展元www’, 6) 截取指定索引处后面所有字符 结果 ‘元www’
- substr(‘张无忌陆展元www’, 6, 1) 截取指定索引处后指定长度字符 结果 ‘元’
- instr 返回子字符串在主串中起始索引 找不到返回 0 instr(‘abcb’, ‘b’) 结果 2
- trim 去除前后指定字符 默认 ’ ‘, trim(’ 张翠山 ') 结果 ‘张翠山’ trim(‘aaa张aaa翠山aaaa’) 结果 ‘张aaa翠山’
- upper 转大写 upper(‘aBc’) 结果 ABC
- lower 转小写lower(‘Abc’) 结果 abc
- lpad 用指定字符实现左填充指定长度 lpad(‘殷素素’, 5, ‘*’) 结果 ‘**殷素素’,若指定长度小于字符串长度,字符串从左截取指定长度
- rpad 用指定字符实现右填充指定长度 同上相反。。。
- replae 替换 replace(‘杨过爱上小龙女,小龙女’, ‘小龙女’, ‘黯然销魂’) 结果’杨过爱上黯然销魂,黯然销魂’
数学函数
- round 四舍五入 round(1.45) 结果1 round(-1.55) 结果-2。重载round(1.567, 2)结果 1.57
- ceil 向上取整 ceil(1.02) 1 返回 大于等于该参数的最小整数 ceil(-1.02) -1
- floor 向下取整 返回小于等于该参数的最大整数
- truncate 截断 小数点后保留位数 truncate(1.6999, 1) 1.6
- mod 取模/趋于 mod(10, 3) 1相当于 10%3 1。mod(-10,3) -1, mod(10,-3) 1。算法a-a/b*b
日期函数
- now 返回当前系统日期+时间
- curdate 返回当前系统日期
- curtime 返回当前系统时间
- year 返回年 year(now())
- month 返回月
- monthname 返回英文月名 monthname(now())
- day 返回日
- hour 返回时
- minute 返回分
- second 返回秒
- str_to_date 将日期格式字符串转换成指定格式的日期 str_to_date(“9-13-1999”, ‘%m-%d-%Y’) 1999-09-13。 格式符 %Y 四位年份 %y 两位年份 %m月份(01,02。。。12)%c月份(1,2。。。12)%d 日 (01,02。。。)%H 小时 24小时制 %h 12小时制 %i分钟(00,01,02。。。)%s秒(00,)
- date_format 将日期转换成字符date_format(now(), ‘%y年%m月%d日’) 19年07月29日
其他函数
- version mysql 版本
- database 当前使用数据库
- user 当前用户控制函数
- if if(条件表达式1, 表达式2,表达式3)当条件表达式1成立,返回表达式2的值,不成立返回表达式3的值。 if(10>5, 10, 5) 10。
- case 两种一种类似于switch case 一种类似于 if else if else
switch case 适合等值判断
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
。。。
else 要显示的值n或语句n;
if else if else
case
when 条件表达式1 then 显示的值1或语句1;
when 条件表达式1 then 显示的值1或语句1;
。。。
else 要显示的值n或语句n
多行函数(做统计使用)又称统计函数,聚合函数,组函数。 可以组合使用
sum avg一般用于处理数值型,max,min,count可以处理任何类型。可与distinct搭配如 sum(distinct 字段)
与分组函数搭配查询的字段有限制
- sum 求和 忽略null
- avg 求均值 忽略null
- max 求最大值 忽略null
- min 求最小值 忽略null
- count 求非空值数量忽略null 一般使用count(*) 统计行数
- count (*) 统计个数,
- count (1) 统计个数。相当于每列加一个 1 然后统计1 的个数
- 效率 myisam引擎中 count()效率最高 innodb中count()与count(1)效率差不多。
附2: 子查询 出现在其他语句中的select语句,称为子查询或内查询。
子查询放在小括号内 一般房在条件右侧 执行优先于主查询,主查询条件用到了子查询结果
按结果集的行列数不同:
- 标量子查询(结果集只有一行一列) 一般搭配单行操作符使用 > < >= <= <>
- 列子查询 结果只有一列多行 一般搭配多行操作符使用 in any/some all(括号内是查询语句)
- in not in 等于/不等于 列表中任意一个
- any | some 和子查询返回的某一个值比较 a>any(10, 20, 30) a大于其中任一个就可以查出结果
- all 和子查询返回的所有值比较 a>all(10,20,30) a大于括号中所有的才可以查询出
- 行子查询 (结果集有一行多列)
- 表子查询(结果集一般为多行多列)
按子查询出现位置
- select 后 仅仅支持标量子查询 就是一行一列
- from 后 支持表子查询
- where 或 having后 标量子查询(较多) 列子查询(较多) 也支持行子查询(使用较少)
- 标量子查询
- 列子查询搭配操作符使用时如果有 any|some/all 可以使用min,max相关语句代替
- 行子查询 (结果集是一行多列 或多行多列) 使用较少
- exists 后(相关子查询)查询结果集是否存在 也就是返回布尔型数据 查询可能涉及到了主查询相关字段,因此执行是在主查询之后,类似筛选条件。可以使用in 代替
附3 联合查询 union 将多条查询语句结果放在一起。
应用场景 要查询的结果来自多个表其多个表没有直接的连接关系,但查询的信息一致时
多条查询结果语句的查询列数一致
多条查询结果每一列对应的类型与顺序一致