2.1 MySQL 基础 (二)- 表操作
学习内容
- MySQL表数据类型
- 用SQL语句创建表
语句解释
设定列类型 、大小、约束
设定主键 - 用SQL语句向表中添加数据
语句解释
多种添加方式(指定列名;不指定列名) - 用SQL语句删除表
语句解释
DELETE
DROP
TRUNCATE
不同方式的区别 - 用SQL语句修改表
修改列名
修改表中数据
删除行
删除列
新建列
新建行
作业
(一)创建如下所示的courses 表 ,有: student (学生) 和 class (课程)。
例如,表:
+---------+------------+ | student | class | +---------+------------+ | A | Math | | B | English | | C | Math | | D | Biology | | E | Math | | F | Computer | | G | Math | | H | Math | | I | Math | | A | Math | +---------+------------+
编写一个 SQL 查询,列出所有超过或等于5名学生的课。
应该输出:
+---------+ | class | +---------+ | Math | +---------+
Note:
学生在每个课中不应被重复计算。
代码如下:
使用test数据库,在该数据库下创建courses 表,并向courses 表中添加数据:
use test; CREATE TABLE courses ( student CHAR(1) NOT NULL, class VARCHAR(25) NOT NULL );
insert into courses(student,class) values('A','Math'); insert into courses(student,class) values('B','English'); insert into courses(student,class) values('C','Math'); insert into courses(student,class) values('D','Biology'); insert into courses(student,class) values('E','Math'); insert into courses(student,class) values('F','Computer'); insert into courses(student,class) values('G','Math'); insert into courses(student,class) values('H','Math'); insert into courses(student,class) values('I','Math'); insert into courses(student,class) values('A','Math');
形成的courses 表如下:
+---------+------------+ | student | class | +---------+------------+ | A | Math | | B | English | | C | Math | | D | Biology | | E | Math | | F | Computer | | G | Math | | H | Math | | I | Math | | A | Math | +---------+------------+
查询所有超过或等于5名学生的课的代码为:
SELECT t.class FROM (SELECT DISTINCT student, class FROM courses) t HAVING COUNT(*) >= 5;
结果为:
+---------+ | class | +---------+ | Math | +---------+
(二)交换工资(难度:简单)
创建一个 salary表,如下所示,有m=男性 和 f=女性的值 。
例如:
| id | name | sex | salary | |----|------|-----|--------| | 1 | A | m | 2500 | | 2 | B | f | 1500 | | 3 | C | m | 5500 | | 4 | D | f | 500 |
交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。
运行你所编写的查询语句之后,将会得到以下表:
| id | name | sex | salary | |----|------|-----|--------| | 1 | A | f | 2500 | | 2 | B | m | 1500 | | 3 | C | f | 5500 | | 4 | D | m | 500 |
创建salary 表:
CREATE TABLE salary ( id INT NOT NULL PRIMARY KEY, name VARCHAR(25) NOT NULL, sex CHAR(1) NOT NULL, salary INT NOT NULL );
向salary表中插入数据:
insert into salary(id,name,sex,salary) values(1,'A','m',2500); insert into salary(id,name,sex,salary) values(2,'B','f',1500); insert into salary(id,name,sex,salary) values(3,'C','m',5500); insert into salary(id,name,sex,salary) values(4,'D','f',500);
形成的salary表如下:
| id | name | sex | salary | |----|------|-----|--------| | 1 | A | m | 2500 | | 2 | B | f | 1500 | | 3 | C | m | 5500 | | 4 | D | f | 500 |
更改表中的性别的代码为:
SELECT id, name, CASE WHEN sex = 'm' THEN 'f' WHEN sex = 'f' THEN 'm' END AS sex, salary FROM salary;
结果为:
| id | name | sex | salary | |----|------|-----|--------| | 1 | A | f | 2500 | | 2 | B | m | 1500 | | 3 | C | f | 5500 | | 4 | D | m | 500 |
2.2 MySQL 基础 (三)- 表联结
学习内容
- MySQL别名
- INNER JOIN
- LEFT JOIN
- CROSS JOIN
- 自连接
- UNION
- 以上几种方式的区别和联系
作业
(一)组合两张表 (难度:简单)
在数据库中创建表1和表2,并各插入三行数据(自己造)
表1: Person
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+
PersonId 是上表主键
表2: Address
+-------------+---------+ | 列名 | 类型 | +-------------+---------+t | AddressId | int | | PersonId | int | | City | varchar | | State | varchar | +-------------+---------+
AddressId 是上表主键
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State
SELECT FirstName, LastName, City, State FROM Person P LEFT JOIN Address A ON P.PersonId = A.PersonId ;
(二)删除重复的邮箱(难度:简单)
编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
+----+---------+ | Id | Email | +----+---------+ | 1 | [email protected] | | 2 | [email protected] | | 3 | [email protected] | +----+---------+
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person表应返回以下几行:
+----+------------------+ | Id | Email | +----+------------------+ | 1 | [email protected] | | 2 | [email protected] | +----+------------------+
创建email表,并向email表中插入三行数据:
CREATE TABLE email ( Id INT NOT NULL PRIMARY KEY, Email VARCHAR(10) NOT NULL ); insert into email(Id,Email) values(1,'[email protected]'),(2,'[email protected]'),(3,'[email protected]');
形成的email表如下:
+----+---------+ | Id | Email | +----+---------+ | 1 | [email protected] | | 2 | [email protected] | | 3 | [email protected] | +----+---------+
删除 email 表中所有重复的电子邮箱并保留id最小的那个的代码为:
SELECT * FROM email WHERE id NOT IN (SELECT e1.id FROM email e1 JOIN email e2 ON e1.email = e2.email AND e1.id > e2.id);
结果为:
+----+------------------+ | Id | Email | +----+------------------+ | 1 | [email protected] | | 2 | [email protected] | +----+------------------+