- select:基础用法
- 演示用的SQL文件下载:https://download.s21i.faiusr.com/23126342/0/0/ABUIABAAGAAgzcXwhQYozuPv2AE?f=world.sql&v=1622942413
单表查询
[root@server1 ~]# mysql -uroot -p123456 < world.sql
# 查询全部数据:如果数据表中的数据过多,一次性加载全部数据可能会造成拥堵
mysql> use world;
# 指定查询数据量
mysql> select * from city;
mysql> desc city;
mysql> select countrycode,district from city limit 2;
+-------------+----------+
| countrycode | district |
+-------------+----------+
| AFG | Kabol |
| AFG | Qandahar |
+-------------+----------+
2 rows in set (0.00 sec)
# 从第三条开始,往后查询四条记录,常用与分页查询
mysql> select id,countrycode,district from city limit 2,4;
+----+-------------+---------------+
| id | countrycode | district |
+----+-------------+---------------+
| 3 | AFG | Herat |
| 4 | AFG | Balkh |
| 5 | NLD | Noord-Holland |
| 6 | NLD | Zuid-Holland |
+----+-------------+---------------+
4 rows in set (0.00 sec)
# 指定条件,查询出中国的所有数据
mysql> select name,population from city where countrycode='CHN';
# 多条件查询
mysql> select name,population from city where countrycode='CHN' and district='heilongjiang';
# 模糊查询
mysql> select name,population,countrycode from city where countrycode like "%H%" limit 10;
1. desc city;
desc city;
desc = describe,查看表结构(查看这张表有哪些字段、字段类型)
输出:
表格
| Field | Type | Null | Key | Extra | |
|---|---|---|---|---|---|
| ID | int(11) | NO | PRI | auto_increment | 主键,自增编号 |
| Name | char(35) | NO | 城市名字 | ||
| CountryCode | char(3) | NO | MUL | 国家代码(AFG 阿富汗,NLD 荷兰) | |
| District | char(20) | NO | 省份 / 地区 | ||
| Population | int(11) | NO | 人口 |
✅ 看懂:city 表存全世界城市信息,一共 5 个字段。
2. select CountryCode,District from city limit 2;
select CountryCode,District from city limit 2;
拆解:
select CountryCode,District:只查询这两个字段(列),不是全部*from city:从 city 这张表查询limit 2:限制只返回 2 条记录(行)
结果:
+-------------+-----------+
| CountryCode | District |
+-------------+-----------+
| AFG | Kabol |
| AFG | Qandahar |
+-------------+-----------+
意思:阿富汗的两个地区。
3. select CountryCode,District from city limit 10;
limit 10 → 取出前 10 条记录,不会把 4079 行全部展示出来。
重点:
limit作用:限制返回多少行数据 生产库数据量巨大,千万别直接select * from city;不加 limit,一次性读出上万行会卡!

1. limit 偏移量,条数 分页写法
select id,countrycode,district from city limit 2,4;
语法:limit 起始偏移量, 获取多少条
⚠️ 偏移量从 0 开始计数!不是从 1!
limit 2,4:跳过前 2 条,从第 3 条开始,一共取 4 条- 第 0 行:id=1
- 第 1 行:id=2
- 跳过 0、1 这两行,从第 2 偏移位置开始拿 4 条 → id 3,4,5,6
- 用途:分页
- 第 1 页:
limit 0,4→ 1~4 条 - 第 2 页:
limit 4,4→ 5~8 条
- 第 1 页:
简写区分:
limit 4= 只取前 4 条(偏移量默认为 0)limit 2,4= 跳过 2 条,取 4 条
2. 单条件 where:查询中国所有城市
select name,population from city where countrycode='CHN';
where countrycode='CHN':筛选条件,只保留countrycode等于CHN(中国)的数据- 单引号:字符串类型的值必须加单引号(国家代码是字符)
- 取出字段:
name城市名、population人口 逻辑:在 city 表里,只把中国城市的名字和人口查出来
注意:大小写在 MySQL 默认配置下不敏感,
chn和CHN效果一样,但规范写大写。
3. 多条件查询 and(并且,两个条件必须同时满足)
select name,population from city where countrycode='CHN' and district='heilongjiang';
and:左右两个条件全部成立才会筛选出来
条件 1:countrycode='CHN' 中国
条件 2:district='heilongjiang' 黑龙江省
含义:查询中国黑龙江省的城市名称和人口。
补充:还有
or(或者,满足任意一个条件即可) 例:where countrycode='CHN' or countrycode='JPN'中国 或者 日本城市
4. 模糊查询 like + 通配符 %
select name,population,countrycode from city where countrycode like "%H%" limit 10;
like:模糊匹配,配合%通配符
%:匹配任意长度任意字符(0 个、1 个、多个都可以)"%H%":字段里面只要包含字母 H,不管 H 在开头、中间、结尾都匹配- 例:
HND、CHN、THA都会匹配,因为里面带 H H%:以 H 开头,如HUN%H:以 H 结尾
- 例:
limit 10:匹配成功后,只返回前 10 条结果。
小提醒:
=是精确匹配;like才是模糊匹配,二者不要混用。
总结一张小表
| 语法 | 作用 |
|---|---|
limit m,n |
跳过 m 条,取 n 条,m 从 0 开始,分页用 |
where 字段='值' |
精确筛选 |
and |
多个条件同时成立 |
or |
多个条件满足任意一个 |
like '%关键词%' |
模糊查询,字段包含关键词 |


5. order by 排序语句
select id,name,population,countrycode from city order by countrycode ASC limit 10;
select id,name,population,countrycode from city order by countrycode ASC limit 10; # ASC可省略
语法拆解
order by 字段:对查询出来的结果进行排序ASC= ascending,升序(从小到大 / A→Z),默认就是 ASC,可以不写order by countrycode等价order by countrycode ASC
DESC= descending,降序(从大到小 / Z→A) 示例:按人口从高到低排序select id,name,population from city order by population DESC limit 10;limit 10:排序完成之后,只取前 10 条
执行流程:
- 从 city 表取出数据
- 根据
countrycode字母 A-Z 排序 - 取出指定 4 个字段
- 只返回前 10 行
小提示:
order by写在 where 后面、limit 前面 例:查询中国城市,按人口降序取前 5 个select name,population from city where countrycode='CHN' order by population desc limit 5;

MySQL 字符集与校对规则
一、基础概念
字符集(Character Set)
字符集:一套字符 + 对应的二进制编码的集合。 字符包含:各国文字、数字、标点、符号。
作用:数据库怎么把文字转成二进制存储。 例:
utf8、gbk、latin1,不同字符集占用字节、支持文字不一样。
校对规则(Collation)
校对规则:字符集内,字符如何比较、排序的一套规则,依附于字符集。
作用:查询排序、
where条件比较时,判断字符是否相等。
校对规则后缀含义
ci= case insensitive → 大小写不敏感(最常用)'ABC'和'abc'认为相等cs= case sensitive → 大小写敏感'ABC'和'abc'不相等bin= binary 二进制比较 → 严格大小写敏感,直接按二进制值对比
举例:
utf8_general_ci
utf8:字符集general:通用比较算法ci:大小写不敏感
建表字段属性说明(column_definition)
创建表时,在字段后可以加这些约束 / 属性,语法模板:
字段名 数据类型 [NOT NULL | NULL] [DEFAULT 默认值]
[AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT '字符串注释']
表格
| 属性 | 含义 |
|---|---|
PRIMARY KEY |
主键,唯一标识一行;主键不能重复、不能为 NULL,一张表只能 1 个主键 |
REFERENCES |
外键,用来引用另一张表主键,保证数据参照完整性 |
NULL |
该字段允许为空(不填数据),默认就是 NULL |
NOT NULL |
不允许为空,插入数据时这个字段必须填写值 |
UNIQUE |
唯一性约束,该字段的值不能重复;可以多个 NULL |
INDEX |
索引,加快查询速度 |
AUTO_INCREMENT |
自增,一般配合主键 int 类型,新增记录自动 + 1(1,2,3…) |
DEFAULT |
设置默认值,插入不填此字段时,自动使用默认值 |
COMMENT |
字段注释,方便看懂字段作用,不影响程序运行 |
ENGINE |
存储引擎,MySQL 常用 InnoDB(支持事务、外键) |
二、MySQL 常见字符集
- utf8
MySQL 里的
utf8是utf8mb3,只支持最多 3 字节,不支持 emoji 表情。
⚠️ 生产推荐
utf8mb4(完整 utf-8,4 字节,支持表情),课件写 utf8 是简化教学。
- latin1(iso-8859-1) 西欧字符集,不支持中文;早期默认字符集,中文会乱码。
- gbk 中文专用字符集,汉字占 2 字节,存储空间小;只支持中日韩文字,国际通用性差。
三.4 种指定字符集的方式(优先级:越往下优先级越高)
优先级:连接级 > 表级 > 库级 > 服务端 my.cnf 配置 意思:表上指定字符集,会覆盖库的;库的覆盖服务端全局配置。
1. 编译安装时指定(源码编译才用,二进制 rpm/yum 安装不用)
源码编译 MySQL,编译参数里设置默认字符集,属于底层固定,日常运维很少改。
2. 配置文件 my.cnf/my.ini 【服务全局默认】
[mysqld]
character-set-server=utf8
作用:MySQL 服务启动后,新建库默认继承这个字符集。
注意:修改后必须重启 MySQL 服务才生效;已经建好的库 / 表不会自动变。
3. 创建库、创建表时,单独指定字符集(最常用)
创建数据库
create database db01 charset utf8 default collate = utf8_general_ci;
charset utf8:库字符集 utf8default collate=utf8_general_ci:默认校对规则,大小写不敏感 含义:新建库 db01,这个库下面新建表,默认继承这套字符集和校对规则。
创建数据表
CREATE TABLE `test` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
ENGINE=InnoDB:存储引擎(支持事务)DEFAULT CHARSET=utf8:这张表单独指定字符集,优先级高于库
==建表不写字符集,就继承所在数据库字符集==。
4. 修改已存在的库 / 表字符集
⚠️重点坑:修改库 / 表字符集,不会自动修改表里已经存好的数据! 只修改后续新增数据的字符集;原有历史数据乱码不会修复。
修改数据库字符集
alter database db01 CHARACTER SET utf8 collate utf8_general_ci;
修改数据表字符集
alter table t1 CHARACTER SET utf8;
四.补充实操小知识点
- 查看当前数据库字符集
show variables like 'character_set%';
- 查看库的字符集
show create database db01;
- 查看表字符集
show create table test;
- 乱码根源:客户端字符集、连接字符集、表字符集三者不一致。
五.一句话总结
- 字符集:管文字怎么存(编码)
- 校对规则:管文字怎么对比排序(大小写敏感)
- 设置层级:全局配置 → 库 → 表,表的字符集优先级最高
ci大小写不敏感,cs/bin大小写敏感alter修改字符集不能修复已有乱码数据- 配套的校对规则,字符集和校对规则名称必须匹配 : utf8mb4 对应
utf8mb4_general_ci,utf8 对应utf8_general_ci

Mysql多表连接查询
建表和准备数据
#建表
create table department(
id int,
name varchar(20)
);
create table employee2(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
#插入数据
insert into department values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');
insert into employee2(name,sex,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204);
两张表:
department部门表:存部门 id、部门名称employee2员工表:存员工信息,dep_id是外键,对应部门表的id
==关系:
employee2.dep_id关联department.id==
- 部门表:id (200 技术,201 人力,202 销售,203 运营)
- 员工表:jingliyang 的 dep_id=204,部门表没有 204 这个部门
表:
employee2员工表(含dep_id),department部门表(主键id)
1. 交叉连接
select * from employee2,department;
含义:笛卡尔积 把员工表每一行 和 部门表每一行全部两两组合。
举个例子:员工 3 条、部门 2 条 → 返回 3×2=6 条记录。
❗问题:会产生大量无效数据,几乎业务不用。 特点:没有匹配条件,全部强行组合

2. 内连接 方法一(标准 JOIN 写法,推荐)
select
employee2.id,employee2.name,employee2.age,employee2.sex,department.name
from employee2
inner join department
on employee2.dep_id=department.id;
inner join:内连接(inner可以省略,直接写join)on employee2.dep_id=department.id:匹配条件
==规则:只保留
员工表dep_id = 部门表id的行,两边匹配得上的数据才查出来。 👉 员工有部门、部门有员工,两边都存在才展示;员工 dep_id 为空 / 不存在的部门 id,这条员工直接不显示。==
✅ 规范写法:连接条件写在
ON后面,过滤条件放WHERE。==工作优先用这种==
3. 内连接 方法二(隐式内连接,老写法)
select
employee2.id,employee2.name,employee2.age,employee2.sex,department.name
from employee2,department
where employee2.dep_id=department.id;
- 这里
from 表1,表2本质先做交叉连接(笛卡尔积) - 再用
where筛选:只留下满足dep_id=id的行 - 效果和上面 inner join 完全一样!
⚠️缺点:
- 把连接条件和普通过滤条件全部混在 where 里,可读性差
- 多表联查的时候容易写错,企业开发不推荐

一句话对比总结
- 交叉连接:不带条件,所有行两两相乘,笛卡尔积,基本不用
- ==内连接 inner join … on:显式写法,按 on 条件匹配,两边都有数据才出现 ✅推荐==
- from 表 1, 表 2 where 条件:隐式内连接,结果同上,只是语法老式
关键
- 内连接:只返回两张表能匹配上的数据
ON和WHERE在 inner join 时,结果一样;但是外连接的时候不能混用!- 交叉连接 = 不带条件的多表逗号查询
前置信息
两张表:
employee2员工表:id(员工编号)、name(员工名)、age、sex、dep_id(部门id)department部门表:id(部门编号)、name(部门名称)关联条件:employee2.dep_id = department.id
员工表的 dep_id,去匹配部门表主键 id,用来找到员工所属部门
1. LEFT JOIN 左连接
select employee2.id,employee2.name,department.name as depart_name
from employee2 left join department
on employee2.dep_id=department.id;
关键字:left join 左连接
左表 = left join 左边的表:employee2(员工表)
规则:左表里所有记录一定会全部查出来;右表能匹配上就带出数据,匹配不上就填 NULL
执行过程:
- 拿每一条员工记录,根据
on后面的关联条件,去部门表匹配 - ✅匹配成功:员工存在对应部门 → 查出员工 + 部门名称
- ❌匹配失败:员工 dep_id 为空,或者这个部门不存在 → 员工信息保留,部门字段 depart_name = NULL
业务场景: 查询全部员工,不管有没有分配部门,员工都要展示;有部门就显示部门名字,无部门则部门名是空。
==
as depart_name:给department.name起别名 depart_name,方便查看,否则两个表都叫 name 会混淆==。

left join执行流程图
(适配你当前 employee2 左连 )
flowchart TD
A["开始 LEFT JOIN"] --> B["取出左表 employee2 的每一行,12行全部保留"]
B --> C{"dep_id匹配department.id? 条件: employee2.dep_id = department.id"}
C -->|"匹配成功"| D["拼接员工字段 + 部门name"]
C -->|"匹配失败, 例: dep_id=204"| E["拼接员工字段, 部门字段填NULL"]
D & E --> F["收集该行到结果集"]
F --> G{"左表还有下一行?"}
G -->|是| B
G -->|否| H["输出结果集, 一共12行"]
2. RIGHT JOIN 右连接
select employee2.id,employee2.name,department.name as depart_name
from employee2 right join department
on employee2.dep_id=department.id;
右表 = right join 右边的表:department(部门表)
规则:右表里所有记录一定会全部查出来;左表匹配上带出员工,匹配不上,员工字段全部填 NULL
执行过程:
- 遍历每一条部门记录,去员工表匹配员工
- ✅匹配成功:部门下面有员工,同时查出员工 + 部门
- ❌匹配失败:这个部门目前没有员工 → 部门保留,员工 id、name 全部为 NULL
业务场景: 查询所有部门,哪怕是空部门(没有任何员工)也要展示出来。
==一句话区分左右连接:
left保左表全部;right保右表全部==。

right join流程图
(右连接,department 为右表)
flowchart TD
A["开始 RIGHT JOIN"] --> B["取出右表 department 的每一行,4个部门全部保留"]
B --> C{"department.id匹配employee2.dep_id? 条件:employee2.dep_id = department.id"}
C -->|"匹配成功"| D["拼接员工字段 + 部门字段"]
C -->|"匹配失败,例:部门203运营"| E["员工字段填NULL + 部门字段"]
D & E --> F["收集该行到结果集"]
F --> G{"右表还有下一行?"}
G -->|"是"| B
G -->|"否"| H["输出结果集"]
3. 全外连接 FULL OUTER JOIN
⚠️重点:MySQL 数据库不支持
FULL OUTER JOIN语法 想要实现【两张表所有记录全部展示】,采用方案:左连接结果 UNION 右连接结果
select * from employee2 left join department on employee2.dep_id = department.id
union
select * from employee2 right join department on employee2.dep_id = department.id;
UNION 详解
UNION:把上下两条 SQL 查询结果合并在一起,自动剔除重复的行,附带排序,性能更低
UNION ALL:直接拼接结果,不做去重,不排序,性能更好;确定没有重复行优先使用 UNION ALL
这条 SQL 执行逻辑:
- 上面
left join:拿到全部员工(有部门 / 无部门员工) - 下面
right join:拿到全部部门(有员工 / 空部门) UNION合并两份结果,自动去掉重复数据 最终结果包含 4 类数据:
- 有部门的员工
- 没有部门的员工
- 有员工的部门
- 没有员工的空部门
也就是:两张表里所有行,全部展示出来,这就是全外连接效果。
下面长 SQL(同逻辑,指定字段,不用 select *)
select employee2.id ,employee2.name ,employee2.age ,employee2.sex ,department.name
from employee2 right join department on employee2.dep_id=department.id
union
select employee2.id ,employee2.name ,employee2.age ,employee2.sex ,department.name
from employee2 left join department on employee2.dep_id=department.id;
- 和上面逻辑一模一样,只是不再使用
select * - 手动指定需要查询的字段:员工 id、姓名、年龄、性别,部门名称
==开发规范里不推荐
select *,建议明确写出需要的字段==。

union 流程图
flowchart TD
A["全外连接 MySQL实现方案"] --> B["执行LEFT JOIN:拿到全部员工,匹配部门"]
A --> C["执行RIGHT JOIN:拿到全部部门,匹配员工"]
B & C --> D["UNION 合并两个结果集,自动去除重复行"]
D --> E["输出:所有员工+所有部门,匹配不到的一侧填NULL"]
4:内连接 INNER JOIN(对照记忆)
select employee2.id,employee2.name,department.name depart_name
from employee2 inner join department
on employee2.dep_id = department.id;
内连接:只保留两边能匹配成功的数据
只有【员工存在,并且所属部门也存在】的数据才会查询出来;无部门员工、空部门,全部不显示。
inner join 流程图
flowchart TD
A["开始 INNER JOIN"] --> B["取出左表 employee2 的每一行"]
B --> C{"employee2.dep_id 匹配 department.id? 条件:employee2.dep_id = department.id"}
C -->|"匹配成功"| D["拼接员工字段 + 部门字段"]
C -->|"匹配失败(例:员工无部门 / 空部门)"| E["直接丢弃该行数据,不显示"]
D --> F["收集该行到结果集"]
E --> G{"还有下一行数据吗?"}
F --> G
G -->|"是"| B
G -->|"否"| H["输出结果集:只保留两边都匹配成功的数据"]
总结对比表
| 连接类型 | 核心特点 | 保留哪些数据 | 匹配不上时 |
|---|---|---|---|
| INNER JOIN 内连接 | 取交集 | 只保留两边匹配成功记录 | 直接丢弃该行 |
| LEFT JOIN 左连接 | 保留左表全部 | 左表全部 + 右表匹配部分 | 右表字段 NULL |
| RIGHT JOIN 右连接 | 保留右表全部 | 右表全部 + 左表匹配部分 | 左表字段 NULL |
| FULL 全外连接 | 并集(MySQL 用 union 模拟) | 左右两张表全部记录 | 缺失一侧字段 NULL |
考点背诵
- left join:左表全部数据;right join:右表全部数据。
- MySQL 不支持 full outer join,使用 left join union right join 模拟全外连接。
- union:合并并且去重;union all:直接拼接不去重,性能更高。
SQL 讲解(内连接 inner join)
练习示例方便下面10道练习
select employee2.name,department.name
from employee2
inner join department on employee2.dep_id = department.id
where age > 25;
需求:内连接查询 employee2 员工表和 department 部门表,查询年龄大于 25 岁的员工名字,以及员工对应的部门名称

MySQL 上机练习:student 学生表 & score 成绩表
==整套包含:建库建表插入数据 + 10 道练习题(题干 + 完整 SQL + 注释,无表别名简写,可直接复制运行)==
-- 1. 创建数据库,指定字符集
create database my_db charset utf8 default collate = utf8_general_ci;
use my_db;
-- 2. 创建student学生表
CREATE TABLE student (
stu_id INT(10) PRIMARY KEY,
stu_name VARCHAR(20) NOT NULL,
sex VARCHAR(2),
birth YEAR,
department VARCHAR(20),
addr VARCHAR(50)
);
-- 插入student测试数据
INSERT INTO student VALUES
(901,'张飞','男','1985','计算机系','河北省涿州市'),
(902,'关羽','男','1986','中文系','山西省运城市'),
(903,'貂蝉','女','1990','中文系','山西省忻州县'),
(904,'刘备','男','1990','英语系','河北省涿州市'),
(905,'小乔','女','1991','英语系','安徽省潜山市'),
(906,'赵云','男','1988','计算机系','河北省正定市');
-- 3. 创建score成绩表
CREATE TABLE score (
score_id INT(10) PRIMARY KEY AUTO_INCREMENT,
stu_id INT(10) NOT NULL,
c_name VARCHAR(20),
grade INT(10)
);
-- 插入score成绩数据
INSERT INTO score(stu_id,c_name,grade) VALUES
(901,'计算机',98),
(901,'英语',80),
(902,'计算机',65),
(902,'中文',88),
(903,'中文',95),
(904,'计算机',70),
(904,'英语',92),
(905,'英语',94),
(906,'计算机',90),
(906,'英语',85);
练习题(10 题)
1. 从 student 表中查询计算机系和英语系学生的信息。
SELECT * FROM student WHERE department='计算机系' or department='英语系';
2. 从 student 表中查询年龄 33~38 岁的学生信息。
SELECT * FROM student WHERE year(curdate())-birth between 33 and 38;
3. 在 student 表中统计每个院系各有几个学生。
SELECT department AS 院系,count(*) AS 人数 FROM student GROUP BY department;
4. 查询每个院系学生中的最高分。
SELECT student.department, MAX(score.grade) AS max_score
FROM student JOIN score ON student.stu_id = score.stu_id
GROUP BY student.department;
5. 查询学生貂蝉的考试科目(c_name)和考试成绩(grade)
SELECT student.stu_name,score.c_name,score.grade
FROM student INNER JOIN score ON student.stu_id=score.stu_id
WHERE student.stu_name='貂蝉';
6. 查询计算机成绩低于 95 的学生信息。
写法 1(多表连接)
SELECT student.stu_name , student.sex ,student.birth, student.department ,student.addr ,score.c_name,score.grade
FROM student,score
WHERE student.stu_id = score.stu_id and grade <95 and c_name='计算机';
写法 2(子查询)
SELECT * FROM student WHERE stu_id IN (SELECT stu_id FROM score WHERE c_name='计算机' and grade<95);
7. 查询同时参加计算机和英语考试的学生的信息。
SELECT * FROM student
WHERE stu_id IN (
SELECT s1.stu_id
FROM score s1
JOIN score s2 ON s1.stu_id = s2.stu_id
WHERE s1.c_name = '计算机' AND s2.c_name = '英语'
);
8. 从 student 表和 score 表中分别查询出学生的学号,然后合并查询结果。
SELECT stu_id FROM student UNION SELECT stu_id FROM score;
UNION:自动去除重复学号;如果想保留重复,使用 UNION ALL
9. 查询姓张或者姓王的同学的个人信息、院系和考试科目及成绩。
SELECT student.stu_id,student.stu_name,student.department 院系,score.c_name 考试科目, score.grade 成绩
FROM student INNER JOIN score ON student.stu_id=score.stu_id
WHERE student.stu_name LIKE '张%' OR student.stu_name LIKE '王%';
10. 查询山西省的学生的姓名、出生年份、院系、考试科目及成绩。
SELECT student.stu_id,student.stu_name,student.birth 出生年份, student.department 院系,score.c_name 考试科目, score.grade 成绩
FROM student INNER JOIN score ON student.stu_id=score.stu_id
WHERE student.addr LIKE '山西省%';
知识点汇总
- 建库建表、主键、非空、自增约束,
INSERT批量插入 - 单表查询:
WHERE、OR、BETWEEN、LIKE模糊查询 - 聚合函数
count()、max()+GROUP BY分组统计 - 多表关联:
INNER JOIN内连接 - 子查询
IN(子查询)、表自连接 UNION多个查询结果合并