系列文章目录
- 前言
- SELECT子句
- SELECT后面之间跟列名
- DISTINCT,ALL
- 列表达式
- 列更名
- WHERE子句
- WHERE子句中可以使用的查询条件
- 比较运算
- 特殊比较运算符
- BETWEEN...AND...
- 集合查询:IN
- 模糊查询:LIKE
- 空值比较:IS NULL
- 多重条件查询
- ORDER BY子句排序
- 复杂查询:UNION [ALL]
- 限制:LIMIT(涉及分页)
- 分页的实现
- 总结:
前言
写代码时建议多行写,增强代码可读性
select
表示查询*
所有列
使用as起别名DISTINCT
去重FROM
后接表名,表示查询哪张表WHERE
是筛选条件,满足条件的会被查询出来BETWEEN AND
比较符号AND
:并且ORDER BY
排序limit
限定行,用到分页
聚集函数
:统计GROUP BY子句
:分组查询HAVING子句
:对分组结果筛选
SELECT子句
SELECT后面之间跟列名
【例】:查询 Student 表中的学号、姓名、班级
SELECT 学号,姓名,班级
FROM Student
【例】:查询 Student 表中全部数据
SELECT 学号,年龄,姓名,性别,联系方式,班级
FROM Student
等价于:(不建议写*)
SELECT * FROM Student
当想要选取一个表中全部列时,全部列可以用【*】表示
DISTINCT,ALL
如果在结果中重复的数据不想显示出来,可以使用distinct
关键字(查单列时使用)
对比结果:
【例】查出公司都有哪些的职位
SELECT job FROM emp --查出每个员工的职位
--因为有重复,所以在列名前面加DISTINCT,对比:
SELECT DISTINCT job FROM emp --查出公司都有哪些的职位
也可以指明不要去除重复元祖,使用ALL关键字
SELECT ALL sex FROM Student
怎么知道一个表里有哪些列?
DESCRIBE 表名;
列表达式
【例】查询每一本书九折后的价格
Book表
book_ID | name | price | |
1 | A1 | 计算机基础 | 28.00 |
2 | A2 | C语言 | 58.00 |
3 | A3 | JAVA | 25.00 |
SELECT book_ID,name,price*0.9 FROM Book
列更名
SQL 提供了为关系表和属性重新命名的机制
语法格式:旧列名 | 表达式 [ AS ] 新列名
或:新列名 =旧列名 | 表达式
就是起一个新名,又叫列别名,使用as
在有公式的时候用到的会多一些(美观)
【例】:
SELECT sno AS 学号,name AS 姓名,bno AS 班级
FROM Student
把第一行的sno改成新名字:学号
name改成了新名字:姓名
bno改成了新名字:班级
WHERE子句
语法格式:
SELECT 列名列表 FROM 表名
WHERE 条件表达式;
【例】查询成绩大于90分的学生的全部信息
SELECT * FROM Student
WHERE Score > 90;
WHERE子句中可以使用的查询条件
比较运算
SQL代码中的字符类型数据必须使用引号括起来
在MySQL中单双引号通用,建议单引号
MySQL字符数据,英文不区分大小写(Oracle区分)
【例】查询所有的女老师的信息
Select * from Teacher where sex='女';
【例】查询学生成绩在60到90分之间的学生
SELECT * FROM Student
WHERE Score >= 60 AND Score <= 90;
【例】查询“高等教育出版社”或者“清华大学出版社”出版的图书
SELECT * FROM Book
WHERE publish ='高等教育出版社' or publish = '清华大学出版社';
除比较运算符外还有算术运算符,他可以在SELECT语句中使用算术运算符,改变输出结果。
+ - * /
对应加减乘除
乘除优先于加减
相同优先权的表达式按照从左至右的顺序依次计算
括弧可以提高优先权,并使表达式的描述更为清晰
【例】查询1999年1月1日之前入职的员工姓名及入职日期。
SELECT ename , hiredate
FROM emp
WHERE hiredate<'1985-12-31';
日期越早,数值越小
特殊比较运算符
BETWEEN…AND…
判断要比较的值是否在某个范围内
用法:BETWEEN<下限值>AND<上限值>
【例】查询学生成绩在60到90分之间的学生
--第一种
SELECT * FROM Student
WHERE Score BETWEEN 60 AND 90;
等价于
--第二种
SELECT * FROM Student
WHERE Score >= 60 AND Score <= 90;
它可以查找上限值与下限值之间的元组,也可以查找不在上限值与下限值之间的元组
如果说查询学生成绩不在60到90分之间的学生,那只需要在第一种中的表名后加个Not
把第二种的等号去掉即可
【例】查询入职日期在82年至85年的员工姓名,入职日期。
SELECT ename, hiredate
FROM emp
WHERE hiredate BETWEEN '1982-1-1'AND '1985-12-31';
【例】查询工资不在1000到2500的员工
SELECT ename,sal
FROM emp
WHERE sal NOT BETWEEN 1000 AND 2500;
集合查询:IN
判断要比较的值是否和集合列表中的任何一个值相等。
【例】查找在1998,1999,2000年入职的经理(mrg)信息,其中包括编号,姓名,工资
SELECT 编号,姓名,工资
FROM emp
WHERE mrg IN (1998,1999,2000);
【例】查找不是“机械工业出版社”,“清华大学出版社”,“高等教育出版社”出版的全部图书
SELECT * FROM Book
WHERE publish NOT IN ('机械工业出版社','清华大学出版社','高等教育出版社');
【例】查询部门在10或者20,并且工资在3000到5000之间的员工姓名、部门、工资。
SELECT 姓名,部门,工资
FROM emp
WHERE 部门 in (10,20) AND 工资 BETWEEN 3000 AND 5000;
模糊查询:LIKE
判断要比较的值是否满足部分匹配
多用在搜索的时候搜关键字
LIKE的用法列名 LIKE <字符串>
在字符串中我们可以使用通配符_
代表任意一个字符%
代表任意多个字符
【例】查询姓全部 “张” 的读者的信息。
SELECT * FROM Reader
WHERE name LIKE '张%';
【例】查询1999年之前的学生的信息
SELECT * FROM Student
WHERE birthdate LIKE '%1999%';
【例】查询员工名字第二个字是宇的
SELECT ename
FROM emp
WHERE ename LIKE "_宇%" ;
【例】查询名字里面没有A的员工
SELECT ename
FROM emp
WHERE ename NOT LIKE '%A%';
空值比较:IS NULL
查一些数据是不是空的
在代码中是is null
,不是 =null
空值是无效的,没有的,不是零或空格
列计算公式中,有空值情况,结果也是空
【例】查询性别为空的学生的信息
SELECT * FROM Student
WHERE sex IS NULL;
【例】查询出生日期不为空的学生的姓名
SELECT name FROM Student
WHERE birthdate IS NOT NULL;
多重条件查询
【例】查询1992年以后出生的女学生的姓名
SELECT name FROM Student
WHERE birthdate >= '1992-1-1' AND sex='女';
ORDER BY子句排序
语法格式:
SELECT [DISTINCT]
FROM 表名
[WHERE 条件]
ORDER BY <列名>|表达式|列别名[ASC|DESC];
ASC表示升序排序,DESC表示降序排序,默认为升序
空值在升序排列中排在最前面,在降序排列中排在最后。
• 注:对于空值,若按照升序排序,含空值的元组将最后显示。
若按降序排序,空值的元组将最先显示
【例】查询学生的信息按出生日期的升序显示
SELECT * FROM Student
ORDER BY birthdate ASC
【例】查询老师的信息按出生日期的"降序"显示
SELECT * FROM Teacher
ORDER BY birthdate DESC
【例】查询图书的信息,查询结果按照出版社的名称升序排序,同一出版社的按照价格的降序排序。
SELECT * FROM Book
ORDER BY publish ASC,price DESC
复杂查询:UNION [ALL]
使用UNION语句可以合并两个或多个查询的结果。
UNION语句用第二个查询结果合并第一个查询结果。
它不显示两个查询中的重复的行。
如果想显示所有行(包括重复行)则可以在UNION后面添加ALL谓词
union的语法格式:
SELECT <目标列名序列>
FROM <数据源>
[WHERE <检索条件表达式>]
[GROUP BY <分组依据列>]
[HAVING <组提取条件>]
UNION [ALL]
SELECT <目标列名序列>
FROM <数据源>
[WHERE <检索条件表达式>]
[GROUP BY <分组依据列>]
[HAVING <组提取条件>]
[ORDER BY <排序依据列> [ASC|DESC]]
注意:如果使用使用ORDER BY 字句进行排序,则该子句只出现最后一个查询的后面,如果不希望去除重复的元组,可以使用关键字ALL。
• 【例】从 “Book” 表中选择所有 “publish” 列为 ‘清华大学出版社’ 或者 “price” 列小于25的书籍,并将结果按照 “name” 列进行排序。
SELECT * FROM Book
WHERE publish='清华大学出版社'
UNION ALL
SELECT * FROM Book
WHERE price<25
ORDER BY name
因为使用了关键字ALL,结果中的重复元组被保留
在这个查询中的第二个查询后使用了ORDER BY 子句,使并集结果按书名name排序
限制:LIMIT(涉及分页)
限制记录的行数
使用select语句时,经常要返回前几条或者中间某几行记录,可以使用关键字limit
语法格式:
SELECT 字段列表
FROM 数据源
LIMIT [start,]length;
--start:表示从第几行记录开始输出,0代表第一行(不是 1)
--length:表示输出的记录行数,长度,取几行
limit接受一个或两个整数参数。
LIMIT (9,5):代表第十行开始数五行,(10,11,12,13,14)
为什么要限制行数呢?
当length等于10000时,不能直接展示,数据太多,不方便看,容易引起浏览器死机
这时候就用到分页了
分页查询:【当前页起始行号=(当前页码-1)*每页行数 】
SELECT ename
FROM emp
LIMIT 5,5
【例】怎么查询某次考试成绩最高的前五名同学的名字
SELECT sname,score
FROM stu
ORDER BY score DESC
LIMIT 0,5;
这里用到了TOPN查询
TOPN查询:先按照某列降序排列,再使用limit限定前N行,limit 0,N
分页的实现
利用MySQL数据库中的limit关键字来实现分页
分页所需要的数据
totalCount:总数据条数,因数据库的数据可以变化,因此该数据需要从后端获取。
pageSize: 每页数据条数,从前端获取的。
totalPage:总页数,需要在后端根据总数据条数和 每页数据条数计算获取。
currentPage:当前页,从前端获取。
start:当前页数据起始位置,需要在后端根据当前页和每页数据条数计算获取。
rows: 每页数据,从后台使用limit关键字查询获取
总结:
limit 限定关键字
分页查询:当前页起始的行数=(当前页码-1)*每页显示的行数
TOPN查询:先排序,再用limit
查询班级前三学生成绩
先按照成绩降序排列,再使用 limit 0,3