MySQL基础 -- 表

一. 表操作

1. MySQL数据类型

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
具体可参考:http://www.runoob.com/mysql/mysql-data-types.html

2. 用SQL创建表

创建表的时候,表中有字段,每一个字段有:

  • 字段名(必需的)
  • 字段数据类型(必需的)
  • 字段长度限制
  • 字段约束
#语法
CREATE TABLE 表名称
(
列名称1 数据类型(size),
列名称2 数据类型(size),
列名称3 数据类型(size),
....
)

约束

  • 对一个数据列建立的约束,称为列级约束
  • 对多个数据列建立的约束,称为表级约束
  • 列级约束即可以在列定义时生命,也可以在列定义后声明
  • 表级约束只能在列定义后声明
  • NOT NULL和DEFAULT只存在列级约束
  • PRIMARY KEY、UNIQUE、FOREIGN KEY同时存在表级约束和列级约束

常见的字段约束:

  1. 非空约束:not null,针对某个字段设置其值不为空,如姓名;
  2. 唯一约束:unique,使某个字段的值不能重复,如手机号码;
  3. 主键约束:primary key,只允许一个主键,主键可以是单个字段或多字段的组合(联合主键),联合主键只能定义为表级约束;
  4. 外键约束:foreign key,外键主要是维护表之间的关系的,主要是为了保证参照完整性,如果表中的某个字段为外键字段,那么该字段的值必须来源于参照的表的主键;
  5. 检查约束:check(‘条件’),CHECK约束用来检查字段值所允许的范围。

其实约束格式是: [CONSTRAINT <约束名>] … ,通常表级约束加上去。
例如:
[CONSTRAINT <约束名>] FOREIGN KEY…REFERENCES <主表名> (<列名>)

#实例
#Persons为主表
CREATE TABLE Persons
(
#列级约束
Id int(10) primary key, 
Name varchar(20) not null,
phone int(20) unique,
age int(3) ,
#CHECK表级约束( 写成列级约束也可以:age int(3) CHECK(age>0 AND age<120) )
CHECK(age>0 AND age<120)
);

#salary为从表
#外键,salary_id_FK为自己定义的外键名,外键为ID,参考列为Persons表的ID列
CREATE TABLE salary
(
ID int(10),
...
CONSTRAINT salary_id_FK FOREIGN KEY(ID) REFERENCES Persons(ID)
);
#或者也可以这样编写
CREATE TABLE salary
(
ID int(10) REFERENCES Persons(ID),
...
);

3. 用SQL向表中添加数据

INSERT INTO 语句用于向指定表格中插入新的行。

#语法
#不指定列
INSERT INTO 表名称 VALUES (值1, 值2,....);

#指定所要插入数据的列(建议使用此种方法)
INSERT INTO 表名称(列1, 列2,...) VALUES (值1, 值2,....);

#例子
INSERT INTO Persons(ID,Name,age) VALUES (002, 'XXX', 18);

4. 用SQL删除表数据

  1. drop table 表名称
    drop (删除表):删除内容和定义,释放空间,表中数据和表结构(列、约束、视图、键)全部去掉。以后要新增数据是不可能的,除非新增一个表。
  2. truncate table 表名称
    truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构)。与drop不同的是,只是清空表数据而已。
  3. delete from 表名称 where 列名称 = 值
    delete (删除表中的数据):delete 语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。
    例如:
    DELETE FROM Persons WHERE age > 20;
    不带where的delete:只删除数据,而不删除表的结构(定义)。

5. 用SQL修改表

  1. 添加行
    上面说的INSER INTO
  2. 删除行
    上面说的 DELETE FROM 表名字 WHERE 条件;
  3. 添加列
    alter table 表名 add 列名 类型(值) 约束
    alter table Persons add test1 varchar(40) NOT NULL;
    新增加的列,被默认放置在这张表的最右边。如果要把增加的列插入在指定位置,则需要在语句的最后使用AFTER关键词(“AFTER 列1” 表示新增的列被放置在 “列1” 的后面)。如果想放在第一列的位置,则使用 FIRST关键词。
  4. 删除列
    alter table 表名 drop 列名
    alter table Persons drop test1;
  5. 列名更名
    ALTER TABLE 表名字 CHANGE 原列名 新列名 数据类型 约束;
    alter table Persons CHANGE test1 test2 varchar(10) NOT NULL;
    重命名语句后面的数据类型不能省略,否则重命名失败。修改数据类型可能会导致数据丢失,所以要慎重使用。
  6. 更改列数据类型
    ALTER TABLE 表名 MODIFY 列名字 新数据类型;
    alter table Persons MODIFY test2 INT(10);
  7. 修改表中某个值
    UPDATE 表名字 SET 列1=值1,列2=值2 WHERE 条件;
    UPDATE Persons SET age=19 WHERE ID=002

二. 作业

1. 列出所有超过或等于5名学生的课

MySQL基础 -- 表

  • 新建表并插入数据:
    MySQL基础 -- 表
  • 表:
    MySQL基础 -- 表
  • 结果:
    MySQL基础 -- 表

2. 交换性别

MySQL基础 -- 表

  • 新建salary表并插入数据:
    MySQL基础 -- 表
  • Salary表:
    MySQL基础 -- 表
  • 结果
    UPDATE Salary SET sex=(CASE WHEN sex='m' THEN 'f' ELSE 'm' END);
    MySQL基础 -- 表

三. 表联结

1. MySQL别名

详细说明:https://www.yiibai.com/mysql/alias.html
使用别名方便作者编写并且增强了可读性。MySQL有列别名和表别名

  1. 列别名
    MySQL列的别名,可以使用AS关键字后跟别名;如果别名包含空格,必须将别名用引号引住。AS关键字可以省略。
    上面的第一个作业有具体例子。
  2. 表的别名称为表别名。像列别名一样,AS关键字是可选的,所以完全可以省略它。一般在包含INNER JOIN,LEFT JOIN,self join子句和子查询的语句中使用表别名。

2. MySQL连接的使用

在真正的应用中经常需要从多个数据表中读取数据, MySQL 的 JOIN 可以实现此功能,JOIN可以在两个或多个表中查询数据。

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录
  • RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录

以上连接的详细说明:http://www.runoob.com/mysql/mysql-join.html

  • CROSS JOIN(交叉连接):它们都返回被连接的两个表所有数据行的笛卡尔积,返回到的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。惟一的不同在于,交叉连接分开列名时,使用CROSS JOIN关键字而不是逗号。
    例子:https://blog.****.net/tswc_byy/article/details/81948973
  • 自连接:SQL自连接被用来联接表本身以作为两个表,暂时重命名,在SQL语句中至少有一个表。
    例子:https://www.yiibai.com/sql/sql-self-joins.html
  • UNION:UNION 操作符合并两个或多个 SELECT 语句的结果。
    注意:UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
    详细说明:http://www.runoob.com/sql/sql-union.html

四. 作业

1. 组合两张表

MySQL基础 -- 表

  • 创建表:
    MySQL基础 -- 表
  • 表:
    Person表:
    MySQL基础 -- 表
    Address表:
    MySQL基础 -- 表
  • 结果:
    MySQL基础 -- 表

2. 删除重复的邮箱

MySQL基础 -- 表

  • 之前创建过这个email表,直接上结果:
    MySQL基础 -- 表
    MySQL基础 -- 表