DQL语言
DQL(Data Query Language,数据查询语言)
查询数据库数据,如SELECT语句
简单的单表查询或多表的复杂查询和嵌套查询
数据库语言中最核心、最重要的语句
使用频率最高的语句
select
指定字段查询
1、查询表中所有的数据列结果,采用“*”符号
select * from student;
效率低,不推荐
2、可指定查询的结果数据列
如只查询student表中的学号、姓名、电话
SELECT StudentNo, StudentName, Phone FROM student;
3、如区分连接查询时两个表有同名的字段
select student.StudentNo, StudentName,StudentResult from student,result;
别名
可给数据列取一个新别名
可给表取一个新别名
可把经计算或总结的结果用另外一个新名称来代替
SELECT StudentNo AS “学号” FROM student;
SELECT a.StudentNo FROM student AS a;
SELECT Phone+1 AS Tel FROM student;
AS 也可省略不写
distinct关键字
去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条
ALL 关键字是默认的,返回所有的记录,与之相反
SELECT DISTINCT 字段名1, 字段名2… FROM 表名(注意distinct的位置)
查询成绩表中的所包含的课程ID
SELECT DISTINCT SubjectNo FROM result;
使用表达式
表达式一般由文本值、列值、NULL、函数和操作符等组成
SELECT语句返回结果列中使用
SELECT语句的ORDER BY、HAVING等子句中使用
DML语句中的where条件语句中使用表达式
1、返回列中使用
SELECT version() , 100*3 #返回MySQL版本和计算结果
SELECT SubjectName “课程名称”, ClassHour+10 AS “新学时” FROM subject;
#给返回结果中的课时都加10个课时
2、where条件语句
用于检索数据表中符合条件的记录
搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
搜索条件的组成
逻辑操作符
比较操作符
1、between and
#查询课程表中课时在110和120之间的所有记录
SELECT * FROM subject WHERE ClassHour BETWEEN 110 AND 120;
等同于:
SELECT * FROM subject WHERE ClassHour >= 110 AND ClassHour <=120;
2、 like模糊查询
与“%”一起使用,表示匹配0或任意多个字符
与“_”一起使用,表示匹配单个字符
#查询包含“数学”的所有课程
SELECT * FROM subject WHERE SubjectName LIKE “%数学%”;
#查询以数学开头
SELECT * FROM subject WHERE SubjectName LIKE “数学%”;
#查询所有姓名为“李**”三个字的学生信息
SELECT StudentNo,StudentName FROM student
WHERE StudentName LIKE “李__”;#两个下划线
3、使用IN进行范围查询
查询的字段x的值,至少与括号中的一个值相同
多个值之间用英文逗号隔开
SELECT * FROM subject where ClassHour = 100 OR ClassHour =110 OR ClassHour = 120; #普通处理方式
SELECT * FROM subject where ClassHour IN ( 100, 110,120 );
#使用IN进行查询方式,更为简洁,效率更高
4、NULL空值条件查询
NULL代表“无值”
区别于零值0和空符串“”
只能出现在定义允许为NULL的字段
须使用 IS NULL 或 IS NOT NULL 比较操作符去比较
数值数据类型的记录之间才能进行算术运算
相同数据类型的数据之间才能进行比较
多表连接查询
需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
student表 GradeNo 对应 grade表 GradeNo
subject表 GradeNo 对应 grade表 GradeNo
result表 StudentNo 对应 student表 StudentNo
SubjectNo 对应 subject表 SubjectNo
内关联:join inner join
会关联两表关联上的所有数据 交集
下图是student result 表关于内连接的演示
student表中的第一个 sid 会和result表中的所有sid逐条进行比较,如果两个sid相等,会连接起来如下图红色连接部分
如果第一个sid比较结束之后 再将student表中第二个sid和result表中的所有sid逐条进行比较,如果两个sid相等,会连接起来如绿色连接部分
直到结束。
外关联:
左连接: left join
会展示左表所有数据,右表展示关联上的所有数据,未关联上的以null值填充
右连接:right join
会展示右表所有数据,左表展示关联上的所有数据,未关联上的以null值填充
全连接:mysql5.8之后才支持full join
相当于左连接union all 右连接
union和union all的区别
两个表的列相同的情况下,使用union all 会把数据纵向拼接起来
使用union是在union all的基础上去重
内连接
select stu_id,stu_name,subNo,score from student
join result
on stu_id=stuNo;
等值连接
select stu_id,stu_name,subNo,score from student,result
where stu_id=stuNo;
非等值连接
select stu_id,stu_name,subNo,score from student,result;
返回记录数为两表记录数的乘积
自连接
create table if not exists category(
categoryId int(10) unsigned not null auto_increment,
categoryName varchar(50) not null,
pid int(10) not null
);
insert into category values(2,‘美术设计’,1),
(3,‘软件开发’,1),
(4,‘数据库基础’,3),
(5,‘ps基础’,2),
(6,‘色彩搭配’,2),
(7,‘php基础’,3),
(8,‘java基础’,3);
将栏目的父子关系呈现出来 父-子
把category表看做两张一模一样的表,然后将这两张表连接查询(自连接)
select a.categoryName 父栏目,b.categoryName 子栏目
from category a join category b
on a.categoryId=b.pid;
查询参加过考试的同学信息 学号 姓名 科目名称 分数
三表连接查询
select stu_id,stu_name,subjectName,score from student
join result
on stu_id=stuNo
join subject
on subjectNo=subNo;
delete from tb_score where course_id in
(select distinct course_id from tb_score join tb_course on course_id=cid
join tb_teacher on tid=teacher_id where tname=‘aa’);
错误
You can’t specify target table ‘student’ for update in FROM clause
不能先select出同一表中的某些值,再对这个表(在同一语句中)进行其他的操作(update,delete等)
修改
delete from tb_score where course_id in
(select * from (select distinct course_id from tb_score join tb_course on course_id=cid join tb_teacher on tid=teacher_id where tname=‘aa’));
还是报错
Every derived table must have its own alias
在做多表查询,或者查询的时候产生新的表的时候会出现这个错误:Every derived table must have its own alias(每一个派生出来的表都必须有一个自己的别名)
最终修改
delete from tb_score where course_id in
(select * from (select distinct course_id from tb_score join tb_course on course_id=cid join tb_teacher on tid=teacher_id where tname=‘aa’) a);