格式:SELECT [选项子句] 字段表达式子句 [FROM子句] [WHERE子句] [GROUP BY子句] [HAVING子句] [ORDER BY子句] [LIMIT子句]
一共是8个子句,有[]表示是可以省略的
提示:8个子句的顺序是固定的,不允许颠倒
字段表达式子句
它的作用是指定查询出哪些内容
*表示查询出表中所有的字段
还可以使用函数及运算禾符
还可以使用as关键字给字段起别名(as关键字可以省略)
FROM子句
此子句作用主要是指定查询的数据源
除了指定一个数据表作为数据源外,还可以指定多个数据表作为数据源
数据源中的数据表也可以使用AS关键字给它起别名(AS关键可以省略)
WHERE子句
此子句的作用主要是进行设定查询条件以筛选数据
比较运算符
>
>=
<
<=
=
!= <>
逻辑运算符
&& and
|| or
! not
xor
like
可以使用通配符%_来匹配
这种也叫模糊查询。模糊查询的效率很低的!
In和not in
再使用not in
发现了一个奇怪的问题,就是数据为null的记录没有出现在查询结果中
原因:null是一种特殊的数据,不会参与普通的比较
Null数据也不会出现在索引中
Where 1的用法
就是在使用条件查询时,可以把条件表达式写一个1或者true,要把1或true认为是一个表达式。表示式的结果为真的。
Where 1后面可以跟任意个表达式,这个1不会影响后面表达式的运算结果。这是一个技巧。
GROUP BY子句
Group by是用于对where条件查询后的数据进行分组 统计用的。
比如我们想知道学生男女各有多少人,就可以使用group by来做
分组的目的在于统计
在group by后面出现的字段,应该写到字段表达式位置,而且它的值不会出现重复的,不同的值只会出现一次。
在字段表达式处,需要使用分组函数来配合。
统计函数
Count() 用于计算总数
Avg() 用于计算平均数
Sum() 用于计算和
Max() 用于计算最大值
Min() 用于计算最小值
提示:使用count()分组函数时如果用的不是*使用的是某个字段,则要关注一下此字段中数据有无null值,有null的记录不会计算在总数中的
可以使用多个字段进行分组
HAVING子句
此子句是用于对使用了where及group by之后的结果进行再次的筛选
如果查询语句中,没有where和group by子句,能不能使用having?
答案是可以。
但是要注意:此处的HAVING不是where!也不能代替where
ORDER BY子句
此子句主要用于对查询结果进行排序
ASC 正序 字段后省略不写时,默认是asc
DESC 倒序
这两个用在字段后面
还可以使用多个进行排序。
当第一个排序后,有相同内容的记录时,将使用第2个字段进行排序
提示:
使用一个字段进行排序时,如果有相同顺序(指排序字段)的记录时,它会按照主键的正序进行第二排序。
LIMIT子句
此子句主要用于分页
格式1:limit 起始记录位置,每页的条数 起始位置是从0开始的
格式2:limit 条数 注:相当于起始位置是第一条数据
选项子句
用于修饰整个查询的结果是否允许有重复数据
有两个参数
All 是默认参数,不写时就是all
Distinct 不能有重复记录
子查询,subquery
当一个查询语句出现在另一个查询语句中时,则称为子查询。
为什么要使用子查询
我们有一个学生信息表,相查出年龄最大的学生
因为不知道到底有几个学生是年龄最大,加大limit数量的方法也不好,只能用别的办法
方法就是使用子查询
相当于先用一条查询语句查到一个结果
因为不知道到底有几个学生是年龄最大,加大limit数量的方法也不好,只能用别的办法
方法就是使用子查询
相当于先用一条查询语句查到一个结果
结论:当一句sql查询语句无法得到结果时,可以使用子查询来辅助得到结果
子查询分类
子查询语句可以出现在另一个查询语句中,能够出现在哪些位置上?返回结果的情况是什么?
根据位置
FROM型子查询:子查询语句出现在FROM子句中,作为临时数据源
WHERE型子查询:子查询语句出现在WHERE子句中,作为条件
根据子查询返回结果
标量子查询:返回一行一列的记录
列子查询:返回多行一列的记录
行子查询:返回一行多列的记录
表子查询:返回多行多列的记录
FROM型子查询
注:子查询必须放在括号中
From子查询的结果作为临时数据源可以用AS起别名
WHERE型子查询
连接查询,join
当我们想获取学生信息+其班级信息时,从一个表是无法做到的。
此是就需要使用一种叫连接查询的方式,把信息全部取到。
如第1个表studentinfo有5个字段
第2个表classinfo有3个字段
连接以后的新结果集是5+3=8的字段
相当于把表加宽了。
连接查询必须是有多个表的情况下
连接查询有哪些方式?
Innerjoin 内连接
Left|rightOuter join 外连接(左外连接,右外连接)
Crossjoin交叉连接
Naturaljoin 自然连接
内连接和交叉连接
Select * from table1 inner join table2
在内连接不加连接条件时,会形成一个笛卡尔积
上面不加连接条件就是cross join一样(截图省略)
上面不加连接也和:Select * from table1,table2 结果一样也是28条记录
不加连接条件时,省略inner或cross结果也一样
下面看内连接下加连接条件的情况(连接条件使用on关键字)
Select * fromtable1 inner join table2 on 连接条件
有连接条件的内连接会返回所有成功连接的记录,不会有连接失败的记录。
外连接
外连接才是数据查询中主要使用的方式,必须熟练掌握
外连接分为:
Left [outer] join :左外连接,以左表为主,左表的数据将全部出现在结果中,包括和右表连接失败的记录,这些失败记录的右表部分用null补齐
Right [outer] join :右外连接,以右表为主,右表的数据将全部出现在结果中,连接失败的左表部分用null补齐
左外连接时右表的情况:
1. 右表中并不是所有记录都会出现(只有符合连接条件的才出现)
2. 右表中的记录有重复出现的情况
3. 右表中没有满足左表条件的记录时,用null补齐
再右外连接的表现
可以看到,现在是右表为主了
1. 左表不符合条件的记录没出现
2. 左表没有与右表连接的合适记录则补NULL
3. 右表的记录全部会出现
左外还是右外,是相对来看,一般我们都习惯左外连接,就是把主要的表放在左边。
提示:外连接必须要有连接条件,不能省略
总结:在这些连接方式中,是重要和最多使用的是left join