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 将多条查询语句结果放在一起。
应用场景 要查询的结果来自多个表其多个表没有直接的连接关系,但查询的信息一致时
多条查询结果语句的查询列数一致
多条查询结果每一列对应的类型与顺序一致