文章目录
1. sql语句的书写顺序
SELECT DISTINCT<Select_list>
FROM <left_table> <join_type>JOIN<right_table> ON<join_condition>
WHERE<where_condition>
GROUP BY<group_by_list> WITH {CUBE|ROLLUP} HAVING<having_condtion>
ORDER BY<order_by_list>
LIMIT<limit_number>
2. sql语句的执行顺序
(1) FROM <left_table>
(2) ON<join_condition> (3) <join_type>JOIN<right_table>
(4) WHERE<where_condition>
(5) GROUP BY<group_by_list> (6) WITH {CUBE|ROLLUP} (7) HAVING<having_condtion>
(8) SELECT (9)DISTINCT<Select_list>
(10) ORDER BY<order_by_list>
(11) LIMIT<limit_number>
关键词 distinct用于返回唯一不同的值。
on跟在join后面作为各种连接(例如:内连接,左外连接)的连接条件
3.聚合函数:
作用于一组数据,并对一组数据返回一个值
注意:
-- 这样写是错误的 学生学号有很多个,统计的学生个数count只有一个 ----其他聚合函数类似
SELECT stu.sno,COUNT(stu.sno) count
FROM student stu
- AVG 返回满足where条件的一列平均值 ,,也可以与group by配合使用
例子:
求SCORE成绩表中编号为1的所有学生平均成绩
SELECT AVG(score) AS 平均分
FROM score
WHERE subid = 1
- COUNT 返回某一列行的总数,,也可以与group by配合使用
例子:
统计参加了科目编号为1考试的学生编号
SELECT COUNT(*) 考试人数
FROM score
WHERE subid = 1
- MAX/MIN 返回满足where条件的一列的最大/最小值,,也可以与group by配合使用
- 例子:
求SCORE 成绩表中科目编号为2 的学生最高成绩和最低成绩
SELECT MAX(score),MIN(score)
FROM score
WHERE subid = 2
- SUM返回满足where条件的行的和,,也可以与group by配合使用
- 例子:
求SCORE成绩表中所有学生成绩的总和
SELECT SUM(score)
FROM score
4.where的使用:
1. where后面写的是数据库字段名,不能使用别名,聚合函数
2. 联表查询时,where提供连接条件 一个表的外键连接另一个表的主键
3.where后面使用比较运算符
操作符 | 含义 |
---|---|
= | 等于(不是 ==) |
> | 大于 |
>= | 大于,等于 |
< | 小于 |
<= | 小于,等于 |
<> 或 != | 不等于 |
4. 其他操作符
- between — and — 再两个之间 (包含边界)
- not between — and — 不在两个值之间
例子:
查询在1995-07-13到1995-07-15之间出生的学生信息
select * from student
where birthday BETWEEN '1995-07-13' AND '1995-07-15'
- IN(set) 等于值列表中的一个
- NOT IN(元素1,元素2,—,元素n)
例子:
查询班级编号是1或者是2的学员信息
SELECT * FROM student
WHERE cid IN(1,2)
查询班级编号不是1或者是2的学员信息
SELECT * FROM student WHERE cid NOT IN(1,2)
-
LIKE 模糊查询
% 代表任意个字符
_ 代表一个字符
例子:
查询姓张的学员信息
SELECT * FROM student
WHERE name LIKE '张%'
- is NULL 空值
- NOT is NULL
5.逻辑运算
操作符 | 含义 |
---|---|
AND | 逻辑并 |
OR | 逻辑或 |
NOT | 逻辑否 |
5. group by
group by 可以对一张表自定义的分成若干组,这样就可以分组统计数据
例子:
统计出各学科平均成绩
SELECT subid,AVG(score)
FROM score
GROUP BY subid
6.having
where和having的区别
1.因为where后面只能写数据库原始的字段名,不能写别名,聚合函数
2.having后面不能写数据库原始的字段名,只能写别名,聚合函数
3.where针对表中的列发挥作用,查询数据。。having针对查询结果的列发挥作用,筛选数据。
4.where在group by 之前,,having在group by之后
例子: 这个例子不是很规范知识说明
- 查询出所有成绩加5分后,成绩还是小于60分的学生学号
-- 错误的 WHERE后面不能写别名
SELECT cs.sno,cs.cj+5 AS jw
FROM cs
WHERE jw < 80
-- 正确的
SELECT cs.sno,cs.cj+5 AS jw
FROM cs
HAVING jw < 80
-- 当然这样写似乎更好 只有学号不带分数
SELECT cs.sno
FROM cs
WHERE cs.cj+5 < 80
-- 错误的 HAVING后面不能写数据库原始的字段名
SELECT cs.sno
FROM cs
HAVING cs.cj+5 < 80
- 查询出课程3成绩加5分后,成绩还是小于60分的学生学号
-- 不太恰当 携带成绩
SELECT cs.sno,cs.cj+5 AS jw
FROM cs
WHERE cs.cno = 4
HAVING jw < 85
-- 错误的 WHERE后面不能写别名
SELECT cs.sno,cs.cj+5 AS jw
FROM cs
WHERE cs.cno = 4 AND jw < 85
-- 错误的 HAVING后面不能写数据库原始的字段名
SELECT cs.sno,cs.cj+5 AS jw
FROM cs
HAVING jw < 85 AND cs.cno = 4
-- 这样似乎好点 只查询出学号
SELECT cs.sno
FROM cs
WHERE cs.cno = 4 AND cs.cj+5 < 85
- 获取平均成绩大于等于70的各科目的平均成绩
SELECT subid,AVG(score)
FROM score
GROUP BY subid HAVING AVG(score) >= 70
7. order by
Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。
Asc 升序、Desc 降序,默认升序
ORDER BY 不能用在子查询中
例子:
查询学生信息并按照班级编号升序
SELECT * FROM student
ORDER BY cid
8.limit
例子:
查询年龄最大的五名学生的信息
SELECT * FROM student
ORDER BY birthday
LIMIT 0, 5
查询学生表中第十名后面所有学生的信息
SELECT * FROM student
LIMIT 9, -1
待完成:联表