目录
DQL语言
单表查询
AS子句
DISTINCT关键字的使用
WHERE条件语句
逻辑操作符
比较操作符
BETWEEN范围查询
LIKE模糊查询
使用IN进行范围查询
NULL空值条件查询
连接查询(多表查询)
INNER JOIN内连接
等值和非等值的连接查询
外连接
JOIN对比
DQL语言
DQL(Data Query Language,数据查询语言)
- 用于查询数据库数据
- 简单的单表查询或多表的复杂查询和嵌套查询
- 是数据库语言中最核心、最重要的语句
- 使用频率最高的语句
单表查询
指定查询字段
查询表中的所有的数据列结果,采用 "*" 符号
select * from student;
指定查询结果的数据列
如只查询student表中的学号,姓名和性别;各数据列用逗号 "," 隔开
select id , name , sex from student;
查询时如有两个表有同名的字段,可以使用 "表名.数据列" 来区分
select id , student.`name` , sex from student;
AS子句
AS子句作用
- 可以给数据列取一个新别名
- 可以给表取一个新别名
- 可以把经过计算或总结的结果用另外一个新名称来代替
- 可以省略AS关键字直接在数据列后取新别名 ·
AS子句的用法
1、给数据列取一个新别名
查询student表中的学号,姓名、性别和年纪并给数据列取别名
select id as '学号' , name as '姓名' , sex as '性别' , grade as '年级' from student;
2、给表取一个新别名
使用student表新别名,查询student表中的学号,姓名和手机号
select stu.`id` , stu.`name` , stu.`phoneNumber` from student as stu;
3、把经过计算或总结的结果用另外一个新名称来代替
把grade加1后的结果用新别名“年纪代替”
select grade+1 as '年纪' from student;
4、省略AS关键字直接在数据列后取新别名
查询student表中的学号、姓名、手机号和身份证号并用别名表示
select id '学号' , name '姓名' , phoneNumber '手机号' , identityCard '身份证号' from student;
DISTINCT关键字的使用
作用:
去掉SELECT查询返回的记录结果中重复的记录,所有列的值都相同)只返回一条。
语法:
SELECT DISTINCT 字段名1,字段名2,…… from 表名;
查询student表中的所包含的年级grade
SELECT DISTINCT grade '年级' FROM student;
WHERE条件语句
- 用于检索数据表中符合条件的记录
- 搜索条件可有一个或多个逻辑表达式组成,结果一般为真或假
- 搜索条件的组成
- 逻辑操作符
- 比较操作符
逻辑操作符
操作符名称 | 语法 | 描述 |
AND或&& | a AND b 或 a && b | 逻辑与,同时为真,结果才为真 |
OR或|| | a OR b 或 a||b | 逻辑或,只要一个为真,则结果为真 |
NOT或! | NOT a 或 !a | 逻辑非,若操作数为假,结果则为真 |
创建数据表subject并添加数据
#创建课程表subject
create table if not exists `subject`(
`subjectNo` int not null,
`subjectName` varchar(15) not null,
`classHour` int(6) not null,
`gradeID` int(4) not null
);#添加数据
insert into `subject` values (1,'高等数学-1',120,1);
INSERT INTO `subject` VALUES (2,'高等数学-2',110,2) , (3,'高等数学-3',100,3);
insert into `subject` values (4,'高等数学-4',130,4);
查询在课时为“100”并且年级编号为“3”的所有课程名称
#使用AND操作符,条件1 AND 条件2 ,两个条件同时满足才为真,否则为假
SELECT subjectName '课程名称' FROM `subject` WHERE classHour = 100 and gradeId = 3;
#使用&&操作符,条件1 &&条件2 ,两个条件同时满足才为真,否则为假SELECT subjectName '课程名称' FROM `subject` WHERE classHour = 100 && gradeId = 3;
查询课时为"110"或者年级编号为"4"的课程名称
#使用OR操作符,条件1 OR条件2 ,OR左右两边的表达式有一个为真则表示为真,否则为假
SELECT subjectName '课程名称' FROM `subject` WHERE classHour = 100 OR gradeId = 1;#使用 “||” 操作符,条件1 || 条件2 ,”||“ 左右两边的表达式有一个为真则表示为真,否则为假
SELECT subjectName '课程名称' FROM `subject` WHERE classHour = 100 || gradeId = 1;
查询年级编号不为 "1" 的所有结果
逻辑非 ”not“
SELECT subjectNO '课程编号' , subjectName '课程名称' , classHour '课时' FROM SUBJECT WHERE NOT gradeID = 1;
逻辑非 ”!“
SELECT subjectNO '课程编号' , subjectName '课程名称' , classHour '课时' FROM subject WHERE gradeID != 1;
比较操作符
操作符名称 | 语法 | 描述 |
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…中的某一个,则结果为真 |
注意:
- 数值数据类型的记录之间才能进行算数运算。
- 相同数据类型的数据之间进行比较
BETWEEN范围查询
BETWEEN等同于>=和<=联合使用
语法:
SELECT 字段1,字段2,…… FROM 表名 字段x BETWEEN 数值1 AND 数值2;
查询subject表中课时在110和130之间的所有记录
SELECT * FROM SUBJECT WHERE classHour BETWEEN 110 AND 130;
等同于;
SELECT * FROM SUBJECT WHEREclassHour >= 110 AND classHour <= 130;
LIKE模糊查询
在WHERE句子中,使用LINK关键字进行模糊查询,LIKE关键字与“%",“-"一起使用
- LIKE与 “%” 一起使用,表示匹配0个或任意多个字符
- LIKE与“-”一起使用,表示匹配单个字符
查询包含“数学”的所有课程
SELECT * FROM subject WHERE subjectName LIKE "%数学%";
或者SELECT * FROM subject WHERE subjectName LIKE "%数学__";
使用IN进行范围查询
在WHERE子句中使用IN进行范围查询
- 查询的字段的值,至少与括号中的一个值相同
- 多个值之间用英文逗号隔开
查询课时为100,110,120的所有课程
select * from subject where classHour in(100 , 110 , 120);
NULL空值条件查询
NULL
- NULL代表 “无值”
- 区别于零值0和空字符“”
- 只能出现在定义允许为NULL的字段
- 须使用IS NULL 或 IS NOT NULL 比较操作符取比较
连接查询(多表查询)
连接查询
- 如需要多张数据表的数据进行查询,则可以通过连接运算符实现多个查询
- 分类包括:
- 内连接(inner join)
- 等值和非等值的连接查询
- 自身连接查询
- 外连接(our join)
- 左连接(left join)
- 右连接(right join)
- 内连接(inner join)
创建数据表
创建年纪表 “grade”
#创建年级表grade
create table if not exists `grade`(
`gradeID` int not null,
`gradeName` varchar(20) not null
);#添加数据
insert into grade values (1,'大一') , (2,'大二') , (3,'大三') , (4,'大四');
INNER JOIN内连接
在表中至少一个匹配时,则返回记录
语法
SECLET 字段1 , 字段2 ,…… FROM 表1 INNER JOIN 表2 ON 表1.字段x = 表2.字段x;
#INNER JOIN 与 JOIN 是相同的;
#如表1中的行在表2中没有匹配,则不返回
从“subject” 和 “grade” 数据表查询课程名称和所属年级名称
SELECT subject.`subjectName` , grade.`gradeName` FROM subject INNER JOIN grade ON subject.`gradeID` = grade.`gradeID`;
#INNER JOIN 与 JOIN 是相同的,可以省略INNER;
SELECT subject.`subjectName` , grade.`gradeName` FROM subject JOIN grade ON subject.`gradeID` = grade.`gradeID`;
等值和非等值的连接查询
- 与表单查询类似,都是SELECT语句
- 把多个表放在FROM后,各个数据表用逗号隔开
- 可以使用AS关键字取别名,便于引用
- 如无重名查询字段则可省略数据表的指定
从 “subject” 和 “grade” 数据表查询课程名称,课时和所属年纪名称
select subject.`subjectName` , .`classHour`, grade.`gradeName` from subject , grade where subject.`gradeID` = grade.`gradeID`;
#AS关键字取别名
select su.`subjectName` , su.`classHour`, gr.`gradeName` from subject as `su` , grade as `gr` where su.`gradeID` = gr.`gradeID`;
外连接
左连接(LEFT JOIN)
从左表(表1)中返回所有的记录,即便在右(表1)中没有匹配的行
语法:
SELECT 字段1 ,字段2,…… FROM 表1 LEFT JOIN 表2 ON 表1.字段x = 表2.字段x;
右连接(RIGHT JOIN)
从右表(表2)中返回所有的记录,即便在左(表1)中没有匹配的行
语法:
SELECT 字段1 ,字段2,…… FROM 表1 RIGHT JOIN 表2 ON 表1.字段x = 表2.字段x;
查询“subject”表中的所有信息和“grade”表中的年级信息
#左连接
SELECT subject.* , grade.`gradeName` from subject left join grade on subject.`gradeID` = grade.`gradeID`;
#左连接,使用AS别名SELECT su.* , gr.`gradeName` from subject AS `su` left join grade AS `gr` on su.`gradeID` = gr.`gradeID`;
#右连接
SELECT subject.* , grade.`gradeName` from subject right join grade on subject.`gradeID` = grade.`gradeID`;
#右连接 ,使用AS别名
SELECT su.* , gr.`gradeName` from subject AS `su` right join grade AS `gr` on su.`gradeID` = gr.`gradeID`;
JOIN对比
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:不论右表是否有匹配,都会返回左表的所有行
- RIGHT JOIN:不论左表是否有匹配,都会返回右表的所有行