mysql的复习强化路"/>
持续更新,mysql的复习强化路
数据库与表的基本操作
-
了解结构化查询语言SQL
sql是结构化查询语言,是一门标准的计算机语言,用于访问和操作数据库,其主能包括数据定义、数据操纵、数据查询和数据控制
sql已称为RDBMS的标准语言,单不同的RDBMS使用的SQL版本有一些差异。按功能用途可以将sql语言分为4类: ddl、dml、dql、dcl
- DDL(数据定义语言) :用于数据库、表视图等的建立、删除包括CREATE、ALTER、DROP
- DML(数据操纵语言):用于添加、删除和修改数据表中的记录包括: INSERT、DELETE、UPDATE
- DCL(数据控制语言):包括数据库对象的权限管理和事务管理包括:COMMIT、ROLLBACK、GRANT
- DQL(数据查询语言):查询是数据库的基本功能包括: SELECT
-
掌握数据库相关操作
DDL之数据库
创建数据库
CREATE DATABASE 数据库名
删除数据库
DROP DATABASE 数据库名
展示数据库
show databases;
查看自己当前在哪个数据库下工作
select database();
- 了解存储引擎engine
存储引擎,就是如何存储数据、如何更新数据、如何查询数据、如何为存储的数据建立索引等一系列技术的实现方法
查看mysql支持的存储引擎
show engines;
存储引擎 | 描述 |
---|---|
MyISAM | 拥有较快的插入、查询速度,但不支持事务 |
InnoDB | 支持ACID事务,支持行级锁,支持外键;MySQL 5.5版本之后默认存储引擎 |
MRG_MYISAM | 将一组结构相同的MyISAM表聚合成一个整体,再进行增删改查操作。 |
Memory | 所有数据存储再内存中,响应快,MySQL重启时数据会全部丢失 |
Archive | 归档,且有压缩机制,适用于历史数据归档 |
CSV | 逻辑上由逗号分隔数据,会为每张表创建一个.csv文件。 |
- 熟悉MySQL的数据类型
在创建数据表时、准确的定义字段的数据类型比较重要
数值类型
类型 | 所占字节数 | 说明 |
---|---|---|
tinyint | 1 | 小整数值,如状态 |
smallint | 2 | 大整数值 |
mediumint | 3 | 大整数值 |
int | 4 | 大整数值 |
bigint | 8 | 极大整数值 |
float | 4 | 单精度浮点数值 |
double | 8 | 双精度浮点数值 |
decimal | max(D+, M+) | 含小数值,例如金额 |
日期和时间类型
类型 | 所占字节数 | 说明 |
---|---|---|
date | 3 | YYYY-MM-DD |
time | 3 | HH:MM:SS |
year | 1 | YYYY |
datetime | 8 | YYYY-MM-DD HH:MM:SS |
timestamp | 8 | YYYYMMDDHHMMSS |
字符串类型
类型 | 所占字节数 | 说明 |
---|---|---|
char | 0~255 | 定长字段串 |
varchar | 0~65535 | 变长字符串 |
text | 0~65535 | 长文本数据 |
blob | 二进制形式文本数据 |
- 熟悉MySQL的建表语法
在DDL中对数据表的操作主要有3种: 创建、修改、删除
创建数据表,需要定义的信息主要包括: 表名、字段名、字段类型
mysql的建表语法
create [temporary] table [if not exists] table_name [(create_definition,...)] [table_options][select_statement]
temporary:临时表,会话结束自动消失
create_definition:定义表种各列属性
table_options:表配置,如存储引擎、字符集
select_statement: 通过select语句建表
- 掌握数据表的相关操作
示例建表
create table contacts(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30),
phone VARCHAR(20)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
查看表
show tables;
查看表结构
desc contacts;
增加表结构
alter table contacts add sex char(1);
修改表结构
alter table contacts modify sex int;
删除表结构
alter table contacts drop column sex;
删除表
drop table contacts;
- 掌握如何向表中插入数据
INSERT插入单条数据
INSERT INTO table_name(field1,field2,...,fieldN) VALUES (value1,value2,...,valueN);
INSERT插入多条数据
INSERT INTO table_name(field1,field2,...,fieldN) VALUES (valueA1,valueA2,...,valueAN),(valueB1,valueB2,...,valueBN);
注意事项:
- 如果字段是字符型,值必须适用单引号或者双引号,如"value";如果值本身就有引号,需要转义
- 如果所有列都要添加数据,insert into 语句可以不指定列,即INSERT INTO table_name VALUES (valueA1,valueA2,…,valueAN);
- 掌握如何修改(更新)表中的数据
updata语法:
UPDATE table_name SET field1=newValue1,field2=newValue2[WHERE Clause]
注意事项:
- 可以同时更新一个或多个字段
- 可以通过where子句来指定更新范围,如果不带where,则更新数据表中所有记录。
updata contacts set phone='12345678901' where name = "张三"
- 掌握如何删除表中的数据
delete from table_name [WHERE Clause]
注意事项:
- 可以通过where子句来指定删除范围,如果不带where,则删除数据表中所有记录
示例总结:
建表
create table contacts(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30),
sex tinyint default 1,
phone VARCHAR(20)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
插数据
insert into contacts(name,sex,phone) values("张三",1,"13200000001")
insert into contacts(name,sex,phone) values("xiong\'s",1,"13200000002")
// 有默认值的字段,可以不赋值也行的哈~
insert into contacts(name,sex,phone) values("李四",1,"13200000003"),("王五",1,"13200000004");
修改(更新表)
update contacts set sex = 2;updata contacts set sex = 1 where name="张三";updata contacts set sex = 2, phone="13200000005" where name="张三";
删除表内容
delete from contacts where id =4;
delete from contacts;
- 了解什么是数据的完整性(准确性、正确性)
数据完整性是指存储在数据库中的数据,应该保持一致性和可靠性
关系模型允许定义三类数据约束,他们是事提完整性、参照完整性、以及用户定义的完整性约束、其中前两种完整性约束由关系数据库系统自动支持
- 实体完整性: 实体就是现实世界中的某个对象,RDBMS中一行代表一个实体,实体完整性就是保证每一个实体都能被区别
- 域完整性: 域完整性主要是对列的输入有要求,通过限制列的数据类型、格式或值的范围来实现
- 参照完整性: 主要是表与表之间的关系、可以通过外键来实现
- 用户自定义完整性: 借助存储过程和触发器实现
- 掌握如何保证数据完整性(重点)
实体完整性: 要求每张表都有唯一标识符,每张表中的主键字段不能为空且不能重复
域完整性: 针对某一具体关系数据库条件,保证表中某些列不能输入无效值
约束方法: 限制数据类型、检查约束、默认值、费控约束
参照完整性: 要求关系中不允许引用不存在的实体
用户自定义完整性: 反应某一具体应用所涉及的数据必须满足语义要求。
唯一性约束
在Mysql中可以适用关键字UNIQUE实现字段的唯一性约束,从而保证实体完整性
- unique意味着任何两条数据的同一个字段不能有相同值
- 一个表中可以有多个unique约束
create table person(
id int not null auto_increment primary key comment "主键id",
name varchar(30) comment "姓名",
id_number varchar(18) unique comment "身份证号"
);
外键约束
外键(FOREIGN KEY)约束定义了表之间的一致性关系,用于强制参照完整性。外键约束定义了对同一个表或者其他表的列的引用,这些列具有PRIMARY KEY 或者 UNIQUE约束。
# 学生表
create table stu(
stu_no int not null primary key comment "学号",
stu_name varchar(30) comment '姓名'
);
# 成绩表
create table sc(id int not null auto_increment primary key comment "主键id",stu_no int not null comment "学号",course varchar(30) comment "课程",grade int comment "成绩",foreign key(stu_no) references stu(stu_no)
);
数据库与表的基本操作
- 了解select的完整语法
select column_name1,column_name2
from table_name
[where where_condition]
[group by {col_name | expr | position},...[with rollup]]
[having where_condition]
[ORDER BY {col_name | expr |position} [ASC | DESC],...[WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
- 掌握适用select进行简单查询(重点)
查询所有
select * from person
条件查询
select name, id_number from person
select name,id_num from from person where name="张三";
工具用法 (科普):
select 8*9;
- 熟练掌握where子句各类运算符的适用
在sql中,insert、updata、delete和select后面都能带where子句,用于插入、删除、修改或查询指定条件的记录
sql语句中适用where子句用法
select column_name from table_name where column_nam 运算符 value
运算符 | 描述 |
---|---|
= | 等于 |
<>或!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
>= | 小于等于 |
between and | 选取介于两个值之间的数据范围;在Mysql中,相当于>=并且<= |
- 熟练掌握多条件查询and、or的适用
在where子句中,适用and、or可以把两个或多个过滤条件结合起来
and、or运算符语法
select column_name from table_name where condition1 and condition2 or condition3
运算符 | 描述 |
---|---|
and | 表示左右两边的条件同时成立 |
or | 表示左右两边只要有一个条件成立 |
案例演示:
use mydb;create table employee(id int not null auto_increment primary key,name varchar(30) comment "姓名",sex varchar(1) comment "性别",salary int comment "薪资(元)"
);insert into employee(name,sex,salary) values("张三",'男',5500);
insert into employee(name,sex,salary) values("李洁",'女',4500);
insert into employee(name,sex,salary) values("李小梅",'女',4200);
insert into employee(name,sex,salary) values("欧阳辉",'男',7500);
insert into employee(name,sex,salary) values("李芳",'女',8500);
insert into employee(name,sex,salary) values("张江",'男',6800);
insert into employee(name,sex,salary) values("李四",'男',12000);
insert into employee(name,sex,salary) values("王五",'男',3500);
insert into employee(name,sex,salary) values("马小龙",'男',6000);
insert into employee(name,sex,salary) values("龙五",'男',8000);
insert into employee(name,sex,salary) values("冯小芳",'女',10000);
insert into employee(name,sex,salary) values("马小花",'女',4000);# 单条件查询男性工资
select * from employee where sex = "男";
select * from employee where sex != "女";
select * from employee where sex <> "女";
select * from employee where salary >= 10000;
select * from employee where salary between 10000 and 12000;# 多条件,性别为男并且薪资大于等于10000
select * from employee where sex = "男" and salary >=10000;# 多条件,男性员工中,大于10000 或者 小于4000
select * from employee where sex = "男" and salary <=4000 or salary >=10000;
# 以上错误写法 or作用域它左右两边
select * from employee where sex = "男" and (salary <=4000 or salary >=10000);
- 掌握运算符in 的使用
运算符in允许我们在where子句中过滤某个字段的多个值
where 子句中使用in语法
select column_name from table_name where column_name in (value1,value2,...)
- 掌握运算符like的使用
where子句使用like语法
select column_name from table_name where column_name like "%value%"
说明:
- like子句中的%类似于正则表达式中的*,匹配任意0个或多个字符
- like子句中的_匹配任意单个字符
- like子句如果没有%和_就相当于运算符=的效果
示例代码:
# 选择id是1或者2或者3的
select * from emplyee where id=1 or id=2 or id=3;
select * from emplyee where id in(1,2,3);
#筛选张三
select * from emplyee where name like "张三";
# 筛选姓李的用户
select * from emplyee where name like "李%";
# 筛选名字芳结尾的
select * from emplyee where name like "%芳";
- 了解Mysql内置函数
我们通常说的Mysql函数指的是Mysql数据库提供的内置函数,包括数学函数,字符串函数,日期和时间函数,聚合函数条件判断函数等,这些内置函数可以帮助用户更加方便地处理表中的数据,简化用户操作
函数 | 描述 |
---|---|
数学函数 | ABS、SQRT、MOD SIN COS TAN COT等 |
字符串函数 | length lower upper trim substring |
日期时间函数 | now curdate curtime sysdate data_format yera month week |
聚合函数 | count sum avg min max |
条件判断函数 | if ifnull case when 等 |
系统信息函数 | version database user等 |
加密函数 | md5 |
- 掌握常用函数的用法(重点)
函数now()
应用场景:
在实际应用中,大多数业务表都会带一个创建时间,create_time字段,用于记录每一条数据的产生时间,在向表中插入数据时,就可以在insert语句中使用now()函数
inser into user(id,name,create_time) values(1,"zhangsan",now());
date_format()
应用场景:
在实际应用中,一般会按标准格式存储日期/时间,如:2020-05-26 20:41:16. 在实际的查询中,又可能有其他的格式要求,这时候就需要采用date_format()函数进行格式转换。
select name,date_format(birthday,'%Y%m%d') from user;
聚合函数
聚合函数是对一组值进行计算,并返回单个值。
Mysql常用的聚合函数有5个,分别count、sum、avg、min和max.
函数 | 描述
--- | ---
count | 返回复核条件的记录总数
sum | 返回指定列的总和,忽略空值
avg | 返回指定列平局值,忽略空值
min | 返回指定列的最小值, 忽略空值
max | 返回指定列的最大值,忽略空值
示例代码:
# 男性数据有多少条
select count(*) from employee where sex = '男';
# 员工表里面的总薪资
select sum(salary) from employee;
# 最低薪水
select min(salary) from employee;
# 平均薪资
select avg(salary) from employee;
如果有一条数据的工资为NULL它会自动把这条数据整体过滤掉。
ifnull()
函数ifnull()用于处理NULL值
ifnull(v1,v2)如果V1的值不为NULL,则返回v1否则返回V2.
示例代码:
insert into employee(name,sex,salary) values("张熊","男",null);
case when
case when 是流程控制语句,可以在sql语句中使用case when来获取更加准确和直接的结果,sql中的case when类似于编程语句中的if else 或者switch
case [col_name] when [value1] then [result1]...else [default] end
case when [expr] then [result1]...else[default] end
如
select id,name,case sexwhen '男' then 'F'when '女' then 'M'else ''end as sex, salary from employee;
- 掌握排序的应用场景以及order by的使用
我们已经掌握使用select语句结合where查询条件获取需要的数据,但是在实际应用中,还会遇到下面这类需求,又该如何解决?
- 学生按升高从高到低进行排序
- 双十一交易量排行榜
- 博客中的文章按先后顺序显示
在sql中,使用order by对查询结果集进行排序,可以按照一列或多列进行排序
order by语法
select column_name1,column_name2 from table_name1,table_name2 order by column_name,column_nam [asc|desc]
说明: asc表示按升序排列,desc表示按降序排列
默认情况按升序排列
示例sql:
select * from employee order by salary desc;
# 按两个字段进行排序
select * from employee order by sex,salary desc;
# 以上就是说 先按性别排序,就会先显示女再显示男,然后再按薪水排序,整体出现的情况,先按薪资从大到小显示女员工信息,再按薪资从大到小显示男员工薪资。
- 掌握分页的应用场景以及limit的使用
在select语句中使用limit子句来约束要返回的记录数,通常使用limit实现分页
limit语法
select column_name1,column_name2
from table_name1,table_name2
limit [offset,]row_count
说明: offset指定要返回的第一行的偏移量,第一行的偏移量是0,而不是1.row_count指定要返回的最大行数。这个offset对于新手来讲,这个偏移量的说法很不友好我感觉,反正我第一次没理解出来,就是从第几条数据开始读,读多少条。 第一页开始每页显示10条 limit 0,10
示例sql:
# 获取前3条数据
select * from employee limit 3;
# 分页每页显示5条,显示第一页
select * from employee limit 0,5;
# 分页每页显示5条,显示第二页
select * from employee limit 5,5;
# 分页显示每页显示5条,显示第三页
select * fromm employee limit 10,5;
- 掌握group by 的应用场景及使用
我们已经掌握使用select语句结合where查询条件获取需要的数据,但在实际的应用中,还会遇到下main这类需求,又该如何解决:
- 公司想知道每个部门有多少名员工
- 班主任想统计各科第一名的成绩
- 某门店想掌握男、女性会员的人数及平局年龄
从字面上理解,group by表示根据某种规则对数据进行分组,它必须配合聚合函数进行使用,对数据进行分组之后需要进行count、sum、avg、max和min等聚合运算
group by语法
select column_name,aggregate_function(column_nam) from table_name group by column_name
-
aggregate_function表示聚合函数。
-
group by可以对一列或多列进行分组。
-
掌握having的应用场景及使用
在sql中增加having子句的原因是,where关键字无法与聚合函数一起使用,having子句可以对分组后的各组数据进行筛选
having语法
select column_name,aggregate_function(column_name)
from table_name
where column_name operator value
group by column_name
having aggregate_function(column_name) operator value
示例sql:
# 把原有的employee表删除了,创建这个表
create table employee(id int not null auto_increment primary key,name varchar(30) comment "姓名",sex varchar(1) comment "性别",salary int comment "薪资(元)",dept varchar(30) comment "部门"
);
insert into employee(name,sex,salary,dept) values("张三", "男", 5500, "部门A");
insert into employee(name,sex,salary,dept) values("李洁", "女", 4500, "部门C");
insert into employee(name,sex,salary,dept) values("李小梅", "女", 4200, "部门A");
insert into employee(name,sex,salary,dept) values("欧阳辉", "男", 7500, "部门C");
insert into employee(name,sex,salary,dept) values("李芳", "女", 8500, "部门A");
insert into employee(name,sex,salary,dept) values("张江", "男", 6800, "部门A");
insert into employee(name,sex,salary,dept) values("李四", "男", 12000, "部门B");
insert into employee(name,sex,salary,dept) values("王五", "男", 3500, "部门B");
insert into employee(name,sex,salary,dept) values("马小龙", "男", 6000, "部门A");
insert into employee(name,sex,salary,dept) values("龙五", "男", 8000, "部门B");
insert into employee(name,sex,salary,dept) values("冯小芳", "女", 10000, "部门C");
insert into employee(name,sex,salary,dept) values("马小花", "女", 4000, "部门B");
insert into employee(name,sex,salary,dept) values("张熊", "男", 8800, "部门A");# 男性员工和女性员工的数量
select sex,count(*) from employee group by sex;
# 统计每个部门的人数
select dept,count(*) from employee group by dept;
# 知道每个工资薪水总和
select dept,sum(salary) from employee group by dept;
# 每个部门薪资最高的
select dept,max(salary) from employee group by dept;
# 每个部门薪资最低
select dept,min(salary) from employee group by dept;
# 人数小于4个人的部门
select dept,count(*) from employee group by dept having count(*)<5;
- 属性group_concat的应用场景
应用场景:
- 使用group by可以分组统计每个部门有多少员工。加入,除了统计每个部门的员工数量之外,还想知道具体是哪些员工(员工列表),又该怎么实现呢?
- 掌握group_concat的使用
group_concat
group_concat配合group by一起使用,用于将某一列的值按指定的分隔符进行拼接,mysql默认的分隔符是逗号
select dept,group_concat(name) from employee group by dept;
- 掌握distinct的用法
distinct用于在查询中返回列的唯一不同值(去重复),支持单列或多列。在实际的应用中,表中的某一列含有重复值是很常见的,如employ表的dept列.如果在查询数据时,希望得到某列的所有不同值,可以使用distinct
#distinct语法
select distinct column_name,column_nam
from table_name;
sql示例:
# 性别这列去重
select distinct sex from employee;create table footprint(id int not null auto_increment primary key,username varchar(30) comment '用户名',city varchar(30) comment "城市",visit_date varchar(10) comment "到访日期"
);insert into footprint(username, city, visit_date) values("liufeng", "贵阳", "2019-12-05");
insert into footprint(username, city, visit_date) values("liufeng", "贵阳", "2020-01-15");
insert into footprint(username, city, visit_date) values("liufeng", "北京", "2018-10-10");
insert into footprint(username, city, visit_date) values("zhangsan", "上海", "2020-01-01");
insert into footprint(username, city, visit_date) values("zhangsan", "上海", "2020-02-02");
insert into footprint(username, city, visit_date) values("lisi", "拉萨", "2016-12-20");# 有多少用户在footprint留下足迹
select distinct username from footprint;
# 所有的用户达到过哪些城市
select dictinct city from footprint;
# 每一个用户去过哪些地方
select distinct username,city from footprint;
- 熟悉表连接的几种方式
表连接(join) 是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获取数据
表连接语法
select table1.column,table2.column from table1,table2 where table1.column1 = table2.column2;
- 熟悉几种表连接的区别
- 内连接 join 或inner join
- 外连接:左连接 left join,右连接 right join 全连接 full join
- 自然连接:同一张表内的连接
连接类型 | 定义 | 例子 |
---|---|---|
内连接 | 至连接匹配的行 | select A.c1,B.c2 from A join B on A.c3 = B.c3 |
左连接 | 包含左表的全部行(不管右表是否存在与之匹配的行), 以及右表中遍布匹配的行 | select A.c1,B.c2 from A left join B on A.c3 = B.c3 |
右连接 | 包含右表的全部行(不管左表是否存在与之匹配的行), 以及左表中遍布匹配的行 | select A.c1,B.c2 from A right join B on A.c3 = B.c3 |
全连接 | 包含左右两个表的全部行(不管在另一个表中是否存在与之匹配的行) | select A.c1,B.c2 from A full join B on A.c3 = B.c3 |
全连接: mysql里面无
- 掌握多表连接查询
# 创建两张表
drop table if exists score;
drop table if exists student;create table student(
stu_no varchar(20) not null primary key comment"学号",
name varchar(30) comment "姓名",
address varchar(150) comment '地址'
);
insert into student(stu_no,name,address) values('2016001','张三','贵州贵阳');
insert into student(stu_no,name,address) values('2016002','李芳','陕西兴平');
insert into student(stu_no,name,address) values('2016003','张晓燕','江西南昌');create table score(
id int not null auto_increment primary key,
course varchar(50) comment '科目',
stu_no varchar(20) comment "学号",
score int comment '分数',
foreign key(stu_no) references student(stu_no)
);insert into score(course,stu_no,score) values('计算机','2016001',99);
insert into score(course,stu_no,score) values('离散数学','2016001',85);
insert into score(course,stu_no,score) values('计算机','2016002',78);# 表的数据特性,有个叫张晓燕 2016003的没成绩# 内连接(交集)
select A.stu_no,A.name,B.course,B.score
from student A
join score B on(A.stu_no = B.stu_no);
select A.stu_no,A.name,B.course,B.score
from student A
inner join score B on(A.stu_no = B.stu_no);
select A.stu_no,A.name,B.course,B.score
from student A
where A.stu_no = B.stu_no;# 左连接
select A.stu_no,A.name,B.course,B.score
from student A left join score B on(A.stu_no = B.stu_no);
- 什么是自连接
自连接时一种特殊的表连接,它是指互相连接的表在物理上同为一张表,但是逻辑上时多张表。自连接通常用于表中的数据有层次结构,如区域表、菜单表、商品分类等。
自连接语法
select a.column,b.column
from table a,table b
where a.column=b.column;
示例sql:
drop table if exists area;
drop table if exists area;create table area(
id int not null auto_increment primary key comment '区域id',
pid int not null comment '父id(0-省份)',
name varchar(30) comment '区域名称'
);insert into area(id,pid,name) values(1,0,'贵州省');
insert into area(id,pid,name) values(2,1,'贵阳');
insert into area(id,pid,name) values(3,1,'遵义');
insert into area(id,pid,name) values(4,0,'广东省');
insert into area(id,pid,name) values(5,4,'广州');
insert into area(id,pid,name) values(6,4,'深圳');# 查出所有城市
select * from area where pid<>0;
# 查出这些城市的父亲id
select A.id,A.name,B.name ad provinceName
from area A, area B
where A.pid = B.id and A.pid<>0;
- 掌握子查询in的使用
之前的课程中,我们已经学习过运算符IN,它允许我们在where子句中过滤某个字段的多个值。
where子句使用in语法
select column_name from table_name where column_name IN(value1,value2,...);
如果运算符in后面的值式来源于某个查询结果,并非是指定几个值,这时就需要用到子查询。子查询又称为内部查询或嵌套查询,即在sql查询的where子句中嵌套查询语句
子查询in语法
select column_name from table_name
where column_name IN(select column_name from table_name [where]
);
- 掌握子查询exists的使用
exists是子查询中用于测试内部查询是否返回任何行的布尔运算符。将主查询的数据放到子查询中做条件验证,根据验证结果(TRUE 或FALSE)来决定主查询的数据结果是否保留
where子句使用exists语法
select column_name1
from table_name1
where exists (select * from table_name2 where condition);
示例sql:
# 看下student表数据
select * from score;# 要用in做一个子查询 查询所有选修了课程的学生
select A.*
from student A
where A.stu_no in(select B.stu_no from score B);# 查询选修了离散数学的学生
select A.*
from student A
where A.stu_no in (select B.stu_no from score B where B.course='离散数学')# 要用exists做一个子查询 查询所有选修了课程的学生
select A.*
from student A
where exists(select * from score B where A.stu_no = B.stu_no);
# 这个exists说一点个人的理解,先看子查询里面的东西,也就是说子查询查询出来了一个表,这个时候就是说,A表查询出来的数据,在查询出来的这个表中存在就能输出出来,不存在就不能输出。
更多推荐
持续更新,mysql的复习强化路
发布评论