第1节. sql语句DQL单表查询
select的其他作用
打印字符串:
数字运算:
select * from table_name
*表示这个表中所有的字段
挑列
1、挑选的字段,可以自定义顺序,所以设计表的时候,字段的前后顺序并不重要,只要查的时候把它改一下顺序就行了。
2、字段名大小写问题不大,注意规范就好。
别名-优化显示,配合页面的显示
as可写可不写
多表查询的时候的优化表名

挑行

非标准SQL比如!= 不等于的这种写法,别的数据库里就有可能不支持,mysql里是支持的。


不等于的写法

注意where里的表达式里,除了数字其他一般都需要加引号。

多条件选择

是真不区分大小写啊
登入的逻辑,
就是在网页里,输入用户名、密码,最终就表现为一个查询语句,
select * from students where username='admin' and password='centos';
查到了就是存在用户和密码匹配的,如果没查到,就是用户名或者密码不对



构建非法输入字符绕过常规select
利用下面的这个查询or的逻辑,加上面的手法,就可以绕过检查。
构建奇怪的密码

这就是sql注入,很多年前针对DB的安全攻击。大部分软件JAVA PHP都针对这种有相应的措施。

上图admin\'-- 是用户名,密码是一个单引号 \'

LIKE通配符 % _
% 前后都有的,这种是不推荐写的,因为会严重的影响数据库的性能,因为它不能利用索引。利用索引,才能提升性能。

当数据百万级别的时候,这个前后都有%%的写法就非常不好了!
RLIKE、REGEXP正则
也是不推荐使用的,影响性能

去重-distinct


查空置NULL



不为空

表中查询统计
分组统计,聚合函数,group和聚合函数通常成对出现
GROUP:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算 avg(), max(), min(), count(), sum()
HAVING: 对分组聚合运算后的结果指定过滤条件
函数在DB中都是要加()的,括号里放的就是函数的要求
count()统计非空记录数也就是行数



count(),括号里放字段,\就是所有字段,也就是所有列,不可能所有列都为空
所以也就是表的行数也就是记录数,所以统计表的记录数可以用count(*)还有count(主键),因为主键也不能为空

max() 和 min()以及avg()

分类汇总-分组汇总
针对性别分别做平均年龄

但是男女没有标明
做分组分类的时候肯定要带上分组的字段名,比如gender分组的,就要select上gender

group by 要注意下图的效果
如果group by不配合聚合函数,那么就是查的是第一个分组内容的信息,比如 group by gender就是性别分类,结果不配合聚合函数,就是第一个女生的信息和第一个男生的信息

所以,使用group by分组的时候,前面select后面跟的只有两个东西,一个是group by本身的字段,还一个就是聚合函数

where和group by的组合

要么where放前面,过滤之后再分组
要么改where 为having,分组之后再过滤,

as还是比较不错的👆

上面的where也是可以写成having如下👇

分组 再 分组

对上图进行班级分组后,再对性别进行分组

ORDER BY排序
升序ASC
降序DESC
针对数字型的有效


升序中,null石排在前面的

倒叙NULL虽然排到后面了,但是整个也倒叙了


group by 和 oder by组合使用
按班级分组统计学生年龄,按班级别号正序显示

如何去掉null,注意having和order by的前后次序

大概就是:group by 再 having 然后order by,但是having是group by分组汇总后的过滤,就不太好了,
运算减少的思路,就是,先过滤,改成👇

LIMIT限定记录数(行数)


跳过前2行,取后续的几行👆
in的语法

等价写法