mysql-3(DML)

本文详细介绍了SQL中SELECT语句的使用,包括指定字段查询、别名设置、distinct关键字去重、表达式运用等。还阐述了多表连接查询,如内关联、外关联(左连接、右连接、全连接)、自连接等,同时提及了查询中可能遇到的错误及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值