项目中我们肯定是用表查询居多,但是还是先回顾下增删改的语法。
1>数据插入
语法
-->INSERT INTO 表名 VALUES (值1,值2,值3…值n); # 按列名顺序插入所有值
-->INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…); # 指定列插入值
-->INSERT INTO 表名 VALUES
(值1,值2,值3…值n),
(值1,值2,值3…值n),
(值1,值2,值3…值n); # 插入多条件记录
-->INSERT INTO 表名(字段1,字段2,字段3…字段n)
SELECT (字段1,字段2,字段3…字段n) FROM 表2
WHERE …; # 查询插入,前提是两张表列的属性必须一致
2>数据修改
语法 ,按条件修改单列记录或多了记录
UPDATE 表名 SET 字段1=值1,字段2=值2,...字段n=值n WHERE CONDITION;
3>数据删除
语法 ,按条件删除
DELETE FROM 表名 WHERE CONITION;
4>数据查询
4.1>单表查询的语法及各关键字执行优先级
如下,若存在多个关键字‘约束’查询结果,按下列排序写sql,
SELECT distinct 字段1,字段2... FROM 表名
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数
关键字执行顺序(相当重要)
from # 第一步,先找到表
where # 再拿着where指定的约束条件,去文件/表中取出一条条记录
group by # 将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
having # 将分组的结果进行having过滤
select # 执行select
distinct # 去重
order by # 将结果按条件排序
limit # 限制结果的显示条数
接下来对各个关键字分开解析。
4.2>简单查询一些注意的点
--->简单查询 SELECT * FROM 表;SELECT 字段1,字段2 FROM 表;
--->去重 SELECT distinct 字段1 FROM 表;
--->通过四则运算查询 SELECT 字段1*10 FROM 表;
--->自定义显示格式
SELECT 字段1 as 别名 FROM 表; # 指定列显示名称
CONCAT() 函数用于连接字符串
CONCAT_WS() 第一个参数为分隔符
SELECT CONCAT('<姓名: ',name,'> <年龄: ', age,'>') FROM 表; # 指定显示格式
SELECT CONCAT_WS('|',字段1,字段2) FROM 表; # 字段显示在一列里,以‘|’分隔
4.3>WHERE约束
where筛选条件中可以使用:
比较运算符:><>= <= <> !=between x and y # 效果等同于 x<= 取值 <=y
in(x,y,z) # 值为x或y或z
like 'x%'或者'x_' # %匹配0或任意个字符,_匹配1个字符
逻辑运算符:and or not # 多个条件中使用
其他需注意的点:
关键字IS NULL(判断某个字段是否为NULL不能用等号,需要用IS),更不能用=''(等于空字符串)
去判断值是否为空,is null是一种数据存储类型,表示没有存值,=''是一种数据类型,存了一个空值,
两个有本质的区别,根本不是一码事。
4.4>分组查询 GROUP BY
分组的概念及需要注意的点
-->分组发生在where之后,即分组是基于where之后得到的记录而进行的,
-->分组是将记录按照某个相同字段进行归类,可以按照任意字段分组,但是分组完毕后,
只能查看分组字段,如果想查看组内信息,需要借助于聚合函数。
聚合函数:SUM,MAX,MIN,AVG,COUNT
-->ONLY_FULL_GROUP_BY模式设定
set global sql_mode='ONLY_FULL_GROUP_BY';
当没有设置该模式时,分组之后依然可以查到除分组字段之外的其他字段,但这没有意义
设置了之后,只能查询分组字段或聚合函数的结果。
-->group by与group_concat()一起使用
group_concat():该函数返回带有来自一个组的连接的非NULL值的字符串结果,
简单来说,就是将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
group_concat()要与group by一起使用,才有实际效果。
例子:
4.5>HAVING过滤
having也是删选条件,跟where有何不同呢,
首先,where能用的一些运算符或关键字,having也支持,
其次,如之前所言,having是执行在group by之后,所以它可以也只能使用group by之后
的分组字段或者聚合函数的结果,不能使用其他字段,也就是基于分组字段或聚合函数再筛选,
但是where是能用表内的所有字段,但是无法使用聚合函数,---------执行顺序的原因。
4.6>查询排序 ORDER BY
-->单列排序:SELECT * FROM 表 ORDER BY 字段1;
-->多列排序:SELECT * from 表 ORDER BY 字段1 ASC,字段2 DESC;
适用场景:先按字段1排序,当出现字段1多个值相等的时候,按字段2排序。
-->升序还是降序:默认就是ASC,升序排序(由小到大),DESC为降序排序(由大到小)。
4.7>限制显示记录数LIMIT
SELECT * FROM 表 ORDER BY 字段1 LIMIT 3; # 默认初始位置为0
SELECT * FROM 表 ORDER BY 字段1 LIMIT 0,3; # 从0开始,即先查询出第1条,然后包含这一条在内往后查3条
SELECT * FROM 表 ORDER BY 字段1 LIMIT 3,3; #查询记录为 4,5,6