Mysql 单表查询和字符集介绍

作者:

在

单表查询

[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,一次性读出上万行会卡!

image-20261015161126312

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 条

简写区分: 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 '%关键词%' 模糊查询,字段包含关键词

image-20261015164222049

image-20261015164500075


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 条

执行流程:

  1. 从 city 表取出数据
  2. 根据countrycode字母 A-Z 排序
  3. 取出指定 4 个字段
  4. 只返回前 10 行

小提示:order by 写在 where 后面、limit 前面 例:查询中国城市,按人口降序取前 5 个

select name,population from city where countrycode='CHN' order by population desc limit 5;

image-20261015173938319

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 常见字符集

  1. utf8 MySQL 里的utf8是utf8mb3,只支持最多 3 字节,不支持 emoji 表情。

⚠️ 生产推荐 utf8mb4(完整 utf-8,4 字节,支持表情),课件写 utf8 是简化教学。

  1. latin1(iso-8859-1) 西欧字符集,不支持中文;早期默认字符集,中文会乱码。
  2. 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:库字符集 utf8
  • default 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;

四.补充实操小知识点

  1. 查看当前数据库字符集
show variables like 'character_set%';
  1. 查看库的字符集
show create database db01;
  1. 查看表字符集
show create table test;
  1. 乱码根源:客户端字符集、连接字符集、表字符集三者不一致。

五.一句话总结

  • 字符集:管文字怎么存(编码)
  • 校对规则:管文字怎么对比排序(大小写敏感)
  • 设置层级:全局配置 → 库 → 表,表的字符集优先级最高
  • ci大小写不敏感,cs/bin大小写敏感
  • alter修改字符集不能修复已有乱码数据
  • 配套的校对规则,字符集和校对规则名称必须匹配 : utf8mb4 对应utf8mb4_general_ci,utf8 对应utf8_general_ciimage-20261016111146290image-20261016111425927

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

两张表:

  1. department 部门表:存部门 id、部门名称
  2. 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 条记录。

❗问题:会产生大量无效数据,几乎业务不用。 特点:没有匹配条件,全部强行组合

image-20261016122554633

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 完全一样!

⚠️缺点:

  1. 把连接条件和普通过滤条件全部混在 where 里,可读性差
  2. 多表联查的时候容易写错,企业开发不推荐

image-20261016124421046

一句话对比总结

  1. 交叉连接:不带条件,所有行两两相乘,笛卡尔积,基本不用
  2. ==内连接 inner join … on:显式写法,按 on 条件匹配,两边都有数据才出现 ✅推荐==
  3. 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

执行过程:

  1. 拿每一条员工记录,根据 on 后面的关联条件,去部门表匹配
  2. ✅匹配成功:员工存在对应部门 → 查出员工 + 部门名称
  3. ❌匹配失败:员工 dep_id 为空,或者这个部门不存在 → 员工信息保留,部门字段 depart_name = NULL

业务场景: 查询全部员工,不管有没有分配部门,员工都要展示;有部门就显示部门名字,无部门则部门名是空。

==as depart_name:给 department.name 起别名 depart_name,方便查看,否则两个表都叫 name 会混淆==。

image-20261017170053500


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

执行过程:

  1. 遍历每一条部门记录,去员工表匹配员工
  2. ✅匹配成功:部门下面有员工,同时查出员工 + 部门
  3. ❌匹配失败:这个部门目前没有员工 → 部门保留,员工 id、name 全部为 NULL

业务场景: 查询所有部门,哪怕是空部门(没有任何员工)也要展示出来。

==一句话区分左右连接:left 保左表全部;right保右表全部==。

image-20261017170535263

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 执行逻辑:

  1. 上面left join:拿到全部员工(有部门 / 无部门员工)
  2. 下面right join:拿到全部部门(有员工 / 空部门)
  3. 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 *,建议明确写出需要的字段==。

image-20261017172441717

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

考点背诵

  1. left join:左表全部数据;right join:右表全部数据。
  2. MySQL 不支持 full outer join,使用 left join union right join 模拟全外连接。
  3. 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 岁的员工名字,以及员工对应的部门名称

image-20261017174113810


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 '山西省%';

知识点汇总

  1. 建库建表、主键、非空、自增约束,INSERT批量插入
  2. 单表查询:WHERE、OR、BETWEEN、LIKE模糊查询
  3. 聚合函数count()、max() + GROUP BY分组统计
  4. 多表关联:INNER JOIN内连接
  5. 子查询 IN(子查询)、表自连接
  6. UNION 多个查询结果合并