1.DQL语言
查询数据库 使用最多,最核心最重要的语句
主要语句是SELECT语句
简单的单表查询或多表的复杂查询和子查询
查询产生一个虚拟表。
看到的是表形式显示的结果,但结果并不真正存储。
每次执行查询只是从数据表中提取数据,并按照表格的形式显示出来。
2.SELECT 案例
1:查询表中所有的数据行和列,采用“*”符号。
SELECT * FROM 表名;
SELECT * FROM student;
2:查询表中指定列的数据。
SELECT 字段名1,字段名2,…字段名n FROM 表名;
SELECT studentno, studentname, phone FROM student;
3:在查询中使用别名,使用“AS”关键字。
可给数据列取一个新别名
可给表取一个新别名
可把经计算或总结的结果用另外一个新名称来代替
SELECT field1 [ AS alias1] [,field2 [AS alias2]] […,fieldn [AS aliasn]]
FROM table_name [ AS table_ alias ];
SELECT studentno AS “学号” FROM student;
SELECT s.studentno FROM student AS s;
SELECT CONCAT("S",studentno) FROM student;
4:在查询中使用常量列:如果需要将一些常量的默认信息添加到输出结果中,以方便统计或计算。可以使用常量列。
SELECT studentno AS “学号”, studentname AS “姓名”,
phone AS “手机号”,address AS “家庭住址”,
‘郑州翔天信鸽’ AS “学校名称”
FROM student;
5:DISTINCT关键字的使用:去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条。
SELECT DISTINCT field1 [ AS alias1] [,field2 [AS alias2]] […,fieldn [AS aliasn]]
FROM table_name [ AS table_ alias ];
#查询学生表中所包含的年级ID
SELECT DISTINCT gradeid FROM student;
3.WHER 条件
WHERE条件:用于检索数据表中符合条件的记录
搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
搜索条件的组成
逻辑操作符
比较操作符
4.比较运算符
操作符名称 |
语法 |
描述 |
IS NULL |
a IS NULL |
若操作符为NULL,则结果为真 |
IS NOT NULL |
a IS NOT NULL |
若操作符不为NULL,则结果为真 |
BETWEEN |
a BETWEEN b AND c |
若a范围在b与c之间则结果为真 |
LIKE |
a LIKE b |
SQL模式匹配,若a匹配b,则结果为真 |
IN |
a IN (a1,a2,a3,….) |
若a等于a1,a2…中的某一个,则结果为真 |
数值数据类型的记录之间才能进行算术运算
相同数据类型的数据之间才能进行比较
5.NULL空值条件查询
NULL
NULL代表“无值”
区别于零值0和空符串“”
只能出现在定义允许为NULL的字段
须使用 IS NULL 或 IS NOT NULL 比较操作符去比较
6.BETWEEN AND范围查询
BETWEEN AND范围查询:根据一个范围值来检索
等同于 >= 和 <= 联合使用
SELECT 字段1,字段2 ,…FROM 表名 WHERE 字段x BETWEEN 值1 AND 值2
#查询课程表中课时在110和120之间的所有记录
SELECT * FROM subject WHERE classhour BETWEEN 110 AND 120;
#等同于:
SELECT * FROM subject WHERE classhour >= 110 AND classhour <=120;
7.LIKE模糊查询
在WHERE子句中,使用LIKE关键字进行模糊查询
与“%”一起使用,表示匹配0或任意多个字符
与“_”一起使用,表示匹配单个字符
#查询包含“数学”的所有课程
SELECT * FROM subject WHERE SubjectName LIKE "%数学%";
#查询所有姓名为“李**”三个字的学生信息
SELECT StudentNo,StudentName FROM student
WHERE StudentName LIKE "李__";
8.使用IN范围查询
在WHERE子句中使用IN进行范围查询
查询的字段x的值,至少与括号中的一个值相同
多个值之间用英文逗号隔开
SELECT 字段1,字段2 ,…FROM 表名 WHERE 字段x IN ( 值1,值2,值3…值n)
SELECT * FROM subject where ClassHour = 100 OR ClassHour =110 OR ClassHour = 120; #普通处理方式
SELECT * FROM subject where ClassHour IN ( 100, 110,120 );
#使用IN进行查询方式,更为简洁,效率更高
9.Mysql函数
MySQL的函数
MySQL中的函数将一些常用的处理数据的操作封装起来,这样大大简化了程序员的工作,提高了开发效率。
因此,除了会使用SQL语句之外,还需要掌握一些常用函数。
MySQL中常用的函数
聚合函数
字符串函数
日期时间函数
数学函数
10.聚合函数
函数名 |
作用 |
AVG() |
返回某字段的平均值 |
COUNT() |
返回某字段的行数 |
MAX() |
返回某字段的最大值 |
MIN() |
返回某字段的最小值 |
SUM() |
返回某字段的和 |
11.数学函数
函数名 |
作 用 |
举 例 |
CEIL(x) |
返回大于或等于数值x的最小整数 |
SELECT CEIL(2.3) 返回:3 |
FLOOR(x) |
返回小于或等于数值x的最大整数 |
SELECT FLOOR(2.3) 返回:2 |
RAND() |
返回0~1间的随机数 |
SELECT RAND() 返回:0.5525468583708134 |
12.字符串函数
函 数 名 |
作 用 |
举 例 |
CONCAT(str1, str1...strn) |
字符串连接 |
SELECT CONCAT('My','S','QL'); 返回:MySQL |
INSERT(str,pos,len,newstr) |
字符串替换 |
SELECT INSERT( '这是SQL Server数据库', 3,10,'MySQL'); 返回:这是MySQL数据库 |
LOWER(str) |
将字符串转为小写 |
SELECT LOWER('MySQL'); 返回:mysql |
UPPER(str) |
将字符串转为大写 |
SELECT UPPER('MySQL'); 返回:MYSQL |
SUBSTRING (str,num,len) |
字符串截取 |
SELECT SUBSTRING( 'JavaMySQLOracle',5,5); 返回:MySQL |
13.日期函数
函数名 |
作用 |
举例(结果与当前时间有关) |
CURDATE() |
获取当前日期 |
SELECT CURDATE(); 返回:2016-08-08 |
CURTIME() |
获取当前时间 |
SELECT CURTIME(); 返回:19:19:26 |
NOW() |
获取当前日期和时间 |
SELECT NOW(); 返回:2016-08-08 19:19:26 |
WEEK(date) |
返回日期date为一年中的第几周 |
SELECT WEEK(NOW()); 返回:26 |
YEAR(date) |
返回日期date的年份 |
SELECT YEAR(NOW()); 返回:2016 |
HOUR(time) |
返回时间time的小时值 |
SELECT HOUR(NOW()); 返回:9 |
MINUTE(time) |
返回时间time的分钟值 |
SELECT MINUTE(NOW()); 返回:43 |
DATEDIFF(date1,date2) |
返回日期参数date1和date2之间相隔的天数 |
SELECT DATEDIFF(NOW(), '2008-8-8’); 返回:2881 |
ADDDATE(date,n) |
计算日期参数date加上n天后的日期 |
SELECT ADDDATE(NOW(),5); 返回:2016-09-02 09:37:07 |
14.SELECT语法 排序
SELECT [ALL | DISTINCT]
{ * | table.* | [ table.field1 [ as alias1] [, table.field2 [as alias2]][, …]] }
FROM table_name [ as table_ alias ]
[ left|out|inner join table_name2 ] #多表连接查询
[ WHERE … ] #指定结果需满足的条件
[ GROUP BY …] #指定结果按照哪几个字段来分组
[ HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT { [ offset,] row_count | row_count OFFSET offset }] ; #分页查询
15.ORDER BY子句
排序可以是升序(ASC)或者降序(DESC),如果不指定ASC或DESC,结果集默认按ASC升序排序。
#把成绩都降低10%后加5分,再查询及格成绩,并按照成绩从高到低排序。
SELECT studentno AS 学生编号,(studentresult*0.9+5 ) AS 综合成绩
FROM `result`
WHERE (`studentresult`*0.9+5) >=60
ORDER BY studentresult DESC;
16.分页查询
SELECT [ALL | DISTINCT]
{ * | table.* | [ table.field1 [ as alias1] [, table.field2 [as alias2]][, …]] }
FROM table_name [ as table_ alias ]
[ left|out|inner join table_name2 ] #多表连接查询
[ WHERE … ] #指定结果需满足的条件
[ GROUP BY …] #指定结果按照哪几个字段来分组
[ HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT { [ offset,] row_count | row_count OFFSET offset }] ; #分页查询
17.LIMIT子句
使用LIMIT限制结果集
#查询课程编号为1的,考试日期为2019年的考试的前5名同学的学号和成绩
#应用1:限制显示的结果集的行数(小说排行榜 新闻只显示最新的5条)
SELECT studentno,studentresult
FROM result
WHERE subjectno=1 AND YEAR(examdate)=2019
ORDER BY studentresult DESC
LIMIT 5
18.GROUP BY分组
GROUP BY作用:使用GROUP BY关键字对查询结果分组
对所有的数据进行分组统计
分组的依据字段可以有多个,并依次分组
与HAVING结合使用,进行分组后的数据筛选
GROUP BY子句经常和聚合函数结合使用完成分组统计功能
19.WHERE与HAVING对比:
WHERE子句
用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句
用来分组 WHERE 子句的输出
HAVING子句
用来从分组的结果中筛选行
20.子查询
子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询。
子查询在WHERE语句中的一般用法
SELECT … FROM 表名 WHERE 字段X 比较运算符(子查询)
习惯上,外层查询称为父查询,圆括号中嵌入的查询称为子查询
执行SQL语句时,先执行子查询,返回所有来自子查询的结果,再执行外围的父查询,返回查询的最终结果(即求解方式为由里及外)。
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个(否则会出现提示信息:错误代号1242 Subquery returns more than 1 row)。
SELECT studentno,studentname,phone FROM student WHERE studentno=
(SELECT studentno FROM result WHERE studentresult>60 AND
subjectno=(SELECT subjectno FROM `subject`WHERE subjectname='JAVAOOP'))
21.IN子查询
SELECT studentno,studentname,phone FROM student WHERE studentno=
(SELECT studentno FROM result WHERE studentresult>60 AND
subjectno=(SELECT subjectno FROM `subject`WHERE subjectname='JAVAOOP'))
IN后面的子查询可以返回多条记录。
常用IN替换等于(=)的子查询。
SELECT … FROM 表名 WHERE 字段X IN(子查询)
#查询课程名称为”JavaOOP”且考试分数大于60分的学生信息(学号、姓名和联系电话)。
SELECT studentno,studentname,phone FROM student WHERE studentno IN
(SELECT studentno FROM result WHERE studentresult>60 AND
subjectno=(SELECT subjectno FROM `subject`WHERE subjectname='JAVAOOP'))
22.EXISTS子查询
EXISTS 子查询:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”。
SELECT …… FROM 表名 WHERE EXISTS(子查询);
子查询有返回结果: EXISTS子查询结果为TRUE,执行外层查询;
子查询无返回结果: EXISTS子查询结果为FALSE, 外层查询不执行;
23.子查询注意
任何允许使用表达式的地方都可以使用子查询
嵌套在父查询SELECT语句的子查询可包括
SELECT子句
FROM子句
WHERE子句
GROUP BY子句
HAVING子句
只出现在子查询中而没有出现在父查询中的列不能包含在输出列中
24.多表连接查询
多表连接查询是通过各个表之间共同列的关联性(例如:外键)来查询的。
多表连接查询的分类
内连接(INNER JOIN) ,可简写为 JOIN;
左外连接(LEFT OUTER JOIN),可简写为LEFT JOIN;
右外连接(RIGHT OUTER JOIN),可简写为RIGHT JOIN;
自连接查询;
交叉连接(CROSS JOIN)也称为 笛卡儿乘积连接,基本上用不到。
25.内连接
内连接使用比较运算符根据每个表的通用列中的值匹配两个表中的行。
#第一种写法
SELECT 字段列表 FROM 表1 INNER JOIN 表2
ON 表1.通用字段名=表2.通用字段名
#第二种写法
SELECT 字段列表 FROM 表1 ,表2
WHERE 表1.通用字段名=表2.通用字段名
如果两个表中有相同的字段名,必须在列名前加表名。否则将出现 错误代码:1052 Column 'studentno' in field list is ambiguous
#第一种写法
SELECT s.studentno,s.studentname,r.studentresult FROM
student AS s INNER JOIN result AS r
ON s.studentno=r.studentno ORDER BY r.studentresult DESC
#第二种写法
SELECT s.studentno,s.studentname,r.studentresult FROM
student AS s,result AS r
WHERE s.studentno=r.studentno
ORDER BY r.studentresult DESC
我们可以在数据库中创建两个字段来存储id和类别名称,使用第三个字段存储类别的子类或者父类的id,最后通过自连接去查询想要的结果。
自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。
26.左外连接
#左外连接
SELECT 字段列表 FROM 表1 LEFT JOIN 表2
ON 表1.通用字段名=表2.通用字段名
左外连接:左表(表1)的记录将会全部表示出来,而右表(表2)只会显示符合匹配条件的记录。
1.匹配,返回到结果集
2.无匹配,NULL值返回到结果集
SELECT s.studentno,s.studentname,r.studentresult FROM
student AS s
LEFT JOIN
result AS r
ON s.studentno=r.studentno
ORDER BY r.studentresult DESC
27.右外连接
#右外连接
SELECT 字段列表 FROM 表1 RIGHT JOIN 表2
ON 表1.通用字段名=表2.通用字段名
右外连接:右表(表2)的记录将会全部表示出来,而左表(表1)只会显示符合匹配条件的记录。
1、匹配,返回到结果集
2、无匹配,NULL值返回到结果集
28.不同SQL JOIN对比
操作符名称 |
描述 |
INNER JOIN |
如果表中有至少一个匹配,则返回行 |
LEFT JOIN |
不论右表是否有匹配,都会返回左表的所有行 |
RIGHT JOIN |
不论左表是否有匹配,都会返回右表的所有行 |