一、where子句常用查询条件
谓词 | 查询条件 |
---|---|
确定范围 | between and, not between and |
确定集合 | in, not in |
字符匹配 | like, not like |
空值 | is null, is not null |
二、like关键字说明
1.like ‘刘%’ :查询所有姓刘学生的信息;
2.like '欧阳_' : 查询姓为欧阳三个汉字的学生信息;
3.like '_阳%' : 查询第二个字为阳的所有学生信息;
4.like 'DB\_abc' escape'\' :查询DB_abc的信息,'\'为换码字符(转义)
5.like 'DB\_%i__' escape'\' : 查询以“DB_”开头,且倒数第三个字符为i的信息;
三、order by 排序(跟where使用)
1.order by ‘xx属性’ asc : 升序;
2.order by ‘xx属性’ desc : 降序;
例:where xx = "xx" order by ‘xx属性’ asc ;
四、聚集函数
count( [distinct|all] <列名>) | 统计列个数 |
---|---|
sum( [distinctall] <列名>) | 计算总额 |
avg( [distinctall] <列名>) | 计算平均值 |
max( [distinctall] <列名>) | 最大值 |
min( [distinctall] <列名>) | 最小值 |
distinct:过滤重复项
all:查询所有值
聚集函数只能用于select语句和group by 中的having子句,where表达式不允许使用
五、group by 子句
例:where xx = "xx" group by Sno having count(*)>3;
根据条件进行分组,并判断分组中Sno是否超过3;
六、连接查询
1、等值连接和非等值连接:通过“=”连接起来,对于null的数据项忽略;
2、自身连接:同一个数据表定义不同别名,并通过条件连接起来;
3、外连接(对于null的数据项不忽略):
左连接(left join):以左边的表为基准连接右边的表;
右连接(right join): 以右边的表为基准连接左边的表;
例:from A join B on a.no=b.no //连接
from A left join B on a.no=b.no
from A right join B using(no)//去除no重复值
4、多表连接:
where A.no = B.no and C.co = B.co;
5、嵌套查询:
where no in(select no from xxx) //子查询语句不能使用order by
七、集合查询
主要包括并操作union、交操作intersect和差操作except;
例:查询语句1 union 查询语句2
八、带exists的谓词子查询
带exists的谓词子查询不返回任何数据,只产生逻辑“true”或”false“。
例:Student where exists (select * from SC where no = Student.no and cno ='1')
九、其他
1、常见按条件查询所有数据可以是按表间连接中某一字段等于进行查询。
2、having有且的意思。
3、解题技巧:
增加表减轻复杂度:可以重新定义表然后重命名,根据表中内容进行条件判断;
4、over函数可以直接跟在select属性后面,over函数里可以加order by进行排序,对于计算多个id的值需要进行排序计算。(比如ID,日期的加减,需要用到over对ID进行排序后才能进行计算)
5、row_number():获取当前行数(从1开始)。
6、count(1) and count(字段):
两者的主要区别是
(1) count(1) 会统计表中的所有的记录数,包含字段为null 的记录。
(2) count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
7、循序递增的id-循序递增是值 = 固定值
例:2-1=1,3-2=1。
8、IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
IFNULL() 函数语法格式为:
IFNULL(expression, alt_value)
9、LIMIT与OFFSET的使用
limit 与 offset:从下标0开始
offset X 是跳过X个数据
limit Y 是选取Y个数据
limit X,Y 中X表示跳过X个数据,读取Y个数据
from table limit 2,1;
//跳过2条取出1条数据,limit后面是从第2条开始读,读取1条信息,即读取第3条数据
from table limit 2 offset 1;
//从第1条(不包括)数据开始取出2条数据,limit后面跟的是2条数据,offset后面是从第1条开始读取,即读取第2,3条
10、SET N := N-1; “:=”表示覆盖之前的值
11、mysql中where后为什么不能使用select中定义的别名:
因为mysql中sql语句的书写顺序与执行顺序不同
sql书写顺序:select 查询内容 from 表 where 查询条件
sql执行顺序: from 表 where 查询条件 select 查询内容
12、limit 不支持子查询
错:select * from my_table where id in (select id from my_table limit 10)
解决方案:select * from my_table where id in (select t.id from (select * from my_table limit 10)as t)