第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的语法
等价写法