一周MySQL集训day3:MySQL 基础 (二)- 表操作
1 任务
任务三
MySQL 基础 (二)- 表操作
任务时间
请于3月1日22:00前完成,在本文章评论处打卡。逾期尚未打卡的会被清退。
学习内容
1. MySQL表数据类型
2. 用SQL语句创建表
语句解释
设定列类型 、大小、约束
设定主键
3. 用SQL语句向表中添加数据
语句解释
多种添加方式(指定列名;不指定列名)
4. 用SQL语句删除表
语句解释
DELETE
DROP
TRUNCATE
不同方式的区别
5. 用SQL语句修改表
修改列名
修改表中数据
删除行
删除列
新建列
新建行
作业
项目三:超过5名学生的课(难度:简单)
创建如下所示的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:
学生在每个课中不应被重复计算。
项目四:交换工资(难度:简单)
创建一个 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 |
2 MySQL表数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
- 数值类型:MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
- 日期和时间类型:表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
- 字符串类型:字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。下图描述了这些类型如何工作以及如何在查询中使用这些类型。
CHAR 和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
3 用SQL语句创建表
- 创建MySQL数据表需要以下信息: (1) 表名 (2) 表字段名 (3)定义每个表字段
- 用程序创建表,可以使用 SQL的CREATETABLE语句。
CREATE TABLE table_name (column_name column_type);
注意:
- 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL,在操作数据库时如果输入该字段的数据为NULL,就会报错。
- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
- ENGINE 设置存储引擎,CHARSET 设置编码。
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
提示: 主键是其值唯一标识表中每一行的列。只有不允许NULL值的列可作为主键,允许NULL值的列不能作为唯一标识。
4 用SQL语句向表中添加数据
- MySQL 表中使用 INSERT INTO SQL语句来插入数据。语法如下:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
注意: 如果数据是字符型,必须使用单引号或者双引号,如:“value”。
5 用SQL语句删除表
-
MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。
-
DELETE:DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。DELETE语句会留下表(容器),而删除表中的数据 ,通常和WHERE一起使用。
DELETE语句结构:DELETE FROM 表名 WHERE 列名称 = 值 ;
DELETE语句不能使用GROUP BY,HAVING,ORDER BY子句。
delete from person where name="liuliu"//删除表中的名字为liuliu的行
-
DROP:删除表(删除整个表而不是其内容)非常简单,使用 DROP TABLE语句即可。DROP则删除整个表(结构和数据)。TRUNCATE 和DELETE只删除数据
DROP语句结构:DROP TABLE 表名称 -
TRUNCATE:TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。TRUNCATE 只能对TABLE;DELETE可以是table和view
TRUNCATE语句结构:TRUNCATE TABLE 表名称 -
总结下drop,truncate,delete区别的区别:
- drop (删除表):删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。 - truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构)。与drop不同的是,只是清空表数据而已。
注意:truncate 不能删除行数据,要删就要把表清空。 - delete (删除表中的数据):delete 语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
truncate与不带where的delete :只删除数据,而不删除表的结构(定义) - truncate table 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用delete。如果要删除表定义及其数据,请使用 drop table 语句。
- 对于由foreign key约束引用的表,不能使用truncate table ,而应使用不带where子句的delete语句。由于truncate table 记录在日志中,所以它不能激活触发器。
- 执行速度,一般来说: drop> truncate > delete。
- delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
6 用SQL语句修改表
- 修改表名:表名在一个数据库中唯一的确定一张表。格式:
ALTER TABLE 旧表名 RENAME 新表名;
ALTER TABLE student RENAME student4;
- 修改列名:
alter table 表名 change column 旧列名 新列名 新数据类型--修改表列名
ALTER TABLE email CHANGE COLUMN Email EMAIL VARCHAR(100);
- 修改表中数据类型:格式:
ALTER TABLE 表名 MODIFY 属性名 数据类型;
ALTER TABLE student1 MODIFY name varchar(30);
- 修改表中数据:
update 表名 set 字段名=‘新内容’ + where条件
update `runoob_tbl` set `submission_date`='2016-05-06' where `runoob_id`=3;
- 删除行:
delete from 表名 where 行字段名=字段值
delete from tablename where id=11;
- 删除列:
alter table 表名 drop column 列名
ALTER TABLE email DROP COLUMN name
- 新建列:
alter table 表名 add column 列名 数据类型;
alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(20) not null;
- 新建行:
insert into 表名(字段名1,字段名2) values(值1,值2);
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
7 作业
-
项目三:超过5名学生的课(难度:简单)
创建如下所示的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:
学生在每个课中不应被重复计算。
解答:
第一步 创建表并插入数据
第二步 列出所有超过或等于5名学生的课。Note:学生在每个课中不应被重复计算。
思路为:需要按class进行分组,由于表中学生A重复,应该去重后计算分组后超过或等于5名学生的class。结果如下:
注意: 由于students列有重复项,所以不能当做主键。所以这张表里没有主键。主键不是非要不可,可以从:1.是否满足业务要求2.数据查询效率(主键可以提高查询效率,当然合理的索引替代也可以),这两个角度权衡是否需要主键。 -
项目四:交换工资(难度:简单)
创建一个 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 |
解答:
第一步 创建表并插入数据
第二步 (方法一)交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。
注意: 尽管功能实现了,在比较复杂,用了多次更新查询。
第二步 (方法二)直接交换f 和 m 的值
注意: CASE…END判断语句:case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。
case sex
when '1' then '男'
when '2' then '女’
else '其他' end