1. 创建和管理数据库

从系统架构的层次上看,MySQL 数据库系统从大到小依次是 数据库服务器 、 数据库 、 数据表 、数据表的 行与列
标识符命名规则

  • 数据库名、表名不得超过30个字符,变量名限制为29个
  • 必须只能包含 A–Z, a–z, 0–9, _共63个字符
  • 数据库名、表名、字段名等对象名中间不要包含空格
  • 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使
  • 用`(着重号)引起来
  • 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据
  • 类型在一个表里是整数,那在另一个表里可就别变成字符型了

创建数据库

  1. CREATE DATABASE 数据库名;

创建数据库并指定字符集

CREATE DATABASE 数据库名 CHARACTER SET 字符集;

判断数据库是否已经存在,不存在则创建数据库

CREATE DATABASE IF NOT EXISTS 数据库名;

管理数据库
查看所有数据库

show databases;

切换数据库

use 数据库名

查看数据库中的表

show tables;

查看正在使用的库

select database()

查看某个数据库中的表

show table from 数据库名

修改数据库

ALTER DATABASE 数据库名 CHARACTER SET 字符集;  #比如:gbk、utf8等

删除数据库

DROP DATABASE 数据库名;

DROP DATABASE IF EXISTS 数据库名;

2. MySQL的数据类型

image.png

1. 整数类型

image.png

CREATE TABLE test_int3(
  f1 INT UNSIGNED
);

UNSIGNED : 无符号类型(非负),所有的整数类型都有一个可选的属性UNSIGNED(无符号属性),无符号整数类型的最小取值为0。

2. 浮点类型

浮点数和定点数类型的特点是可以 处理小数 ,你可以把整数看成小数的一个特例。因此,浮点数和定点数的使用场景,比整数大多了。 MySQL支持的浮点数类型,分别是 FLOAT、DOUBLE、REAL。
image.png
MySQL 存储浮点数的格式为: 符号(S) 、 尾数(M) 和 阶码(E) 。因此,无论有没有符号,MySQL 的浮点数都会存储表示符号的部分。因此, 所谓的无符号数取值范围,其实就是有符号数取值范围大于等于零的部分。
对于浮点类型,在MySQL中单精度值使用 4 个字节,双精度值使用 8 个字节。
MySQL允许使用 非标准语法 (其他数据库未必支持,因此如果涉及到数据迁移,则最好不要这么用): FLOAT(M,D) 或 DOUBLE(M,D) 。这里,M称为 精度 ,D称为 标度 。(M,D)中 M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30。
从MySQL 8.0.17开始,FLOAT(M,D) 和DOUBLE(M,D)用法在官方文档中已经明确不推荐使用
浮点数类型有个缺陷,就是不精准。

4. 定点类型

image.png
使用 DECIMAL(M,D) 的方式表示高精度小数。其中,M被称为精度,D被称为标度。0<=M<=65,0<=D<=30,D定点数在MySQL内部是以 字符串 的形式进行存储,这就决定了它一定是精准的。
当DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0)。当数据的精度超出了定点数类型的精度范围时,则MySQL同样会进行四舍五入处理。

5. 位类型

image.png
BIT类型中存储的是二进制值,类似010110
BIT类型,如果没有指定(M),默认是1位。这个1位,表示只能存1位的二进制值。这里(M)是表示二进制的位数,位数最小值为1,最大值为64。

6. 日期时间类型

image.png

7. 文本类型

image.png
image.png

3. 创建和管理数据表

创建表

CREATE TABLE [IF NOT EXISTS] 表名(
    字段1, 数据类型 [约束条件] [默认值],
    字段2, 数据类型 [约束条件] [默认值],
    字段3, 数据类型 [约束条件] [默认值],
    ……
    [表约束条件]
);
CREATE TABLE c_1(
  _id INT,
  NAME VARCHAR(15) NOT NULL,
  hire_date DATE
)ENGINE= INNODB CHARACTER SET= utf8;

基于现有的表创建表

CREATE TABLE c_2
AS 
SELECT employee_id,last_name,salary 
FROM employees

管理表
给表添加一个字段

ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;
ALTER TABLE c_1 ADD salary DOUBLE

修改一个字段的数据类型

ALTER TABLE 表名 MODIFY 【COLUMN】 字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名2】;
ALTER TABLE c_1 MODIFY salary DECIMAL

重命名一个字段

ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;
ALTER TABLE c_1 CHANGE salary my_salary DECIMAL

change也可以修改字段的数据类型
删除一个字段

ALTER TABLE 表名 DROP 【COLUMN】字段名
ALTER TABLE c_1 DROP COLUMN my_salary

给表重命名
1)

ALTER TABLE TO 原表名 RANAME 新表名
ALTER TABLE c_1 RENAME TO c_1_1

2)

RENAME TABLE 原表名 TO 新表名
RENAME TABLE c_1_1 TO c_1

删除表

DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];
DROP TABLE IF EXISTS c_2

清空表

TRUNCATE TABLE detail_dept;
TRUNCATE TABLE c_4

4. 约束

为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面考虑:

  • 实体完整性(Entity Integrity) :例如,同一个表中,不能存在两条完全相同无法区分的记录
  • 域完整性(Domain Integrity) :例如:年龄范围0-120,性别范围“男/女”
  • 引用完整性(Referential Integrity) :例如:员工所在部门,在部门表中要能找到这个部门
  • 用户自定义完整性(User-defined Integrity) :例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。

根据约束起的作用,约束可分为:

  • NOT NULL 非空约束,规定某个字段不能为空
  • UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
  • PRIMARY KEY 主键(非空且唯一)约束
  • FOREIGN KEY 外键约束
  • CHECK 检查约束
  • DEFAULT 默认值约束

    1. 查看表的约束

    #information_schema数据库名(系统库)
    #table_constraints表名称(专门存储各个表的约束)
    SELECT * FROM information_schema.table_constraints
    WHERE table_name = '表名称';
    

    2. 非空约束

    CREATE TABLE constraint_test(
      `constraint` VARCHAR(15) NOT NULL
    )
    
    改变表设置NOT NULL
    ALTER TABLE constraint_test MODIFY  `constraint` VARCHAR(15) NOT NULL
    

    3. 唯一性约束

    唯一性约束可以作用在多个列上
    可以向有唯一性约束的列上添加NULL,而且NULL不遵守唯一性约束可以有多个 ``sql CREATE TABLE emp(idINT UNIQUE, #列级约束nameVARCHAR(15),emailVARCHAR(15) UNIQUE,salary` DECIMAL(10,2) )

CREATE TABLE emp( id INT , name VARCHAR(15), email VARCHAR(15) , salary DECIMAL(10,2) ,

表级约束

CONSTRAINT uk_emp_id UNIQUE(id)

)

```sql
ALTER TABLE emp ADD CONSTRAINT `uk_emp_id` UNIQUE KEY(`id`)

添加多列唯一性约束
只要两个列的值不完全一样就可以添加成功

CREATE TABLE emp(
    `id` INT , 
    `name` VARCHAR(15),
    `email` VARCHAR(15) ,
    `salary` DECIMAL(10,2) ,
  #表级约束
  CONSTRAINT `uk_emp_id_email` UNIQUE(`id`,`email`) 

)
ALTER TABLE emp ADD CONSTRAINT `uk_emp_id_email` UNIQUE(`id`,`email`)

删除唯一性约束

  • 添加唯一性约束的列上也会自动创建唯一索引。
  • 删除唯一约束只能通过删除唯一索引的方式删除。
  • 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
  • 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()
  • 中排在第一个的列名相同。也可以自定义唯一性约束名。

    ALTER TABLE emps DROP INDEX `salary`;
    

    4. 主键约束

    用来唯一标识表中的一行记录。

  • 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。

  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。主键约束对应着表中的一列或者多列(复合主键)如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
  • MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
  • 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
  • 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
CREATE TABLE emps(
    `id` INT PRIMARY KEY,
    `name` VARCHAR(15),
    `email` VARCHAR(15) ,
    `salary` DECIMAL(10,2) 
)


CREATE TABLE emps(
    `id` INT,
    `name` VARCHAR(15),
    `email` VARCHAR(15) ,
    `salary` DECIMAL(10,2) ,

  #表级约束
  PRIMARY KEY(`id`)
)
ALTER TABLE `emps` ADD PARMARY KEY(`id`)

联合主键

CREATE TABLE `user`(
 `name` VARCHAR(15),
 `pwd` VARCHAR(15),
 PRIMARY KEY(`name`,`pwd`)
)

删除主键约束

ALTER TABLE `emps` DROP PRIMARY KEY;

主键自增

  • 一个表最多只能有一个自增长列
  • 当需要产生唯一标识符或顺序值时,可设置自增长
  • 自增长列约束的列必须是键列(主键列,唯一键列)
  • 自增约束的列的数据类型必须是整数类型

    CREATE TABLE emps(
      `id` INT PRIMARY KEY AUTO_INCREMENT ,
      `name` VARCHAR(15),
      `email` VARCHAR(15) ,
      `salary` DECIMAL(10,2) 
    )
    

    删除自增

    ALTER TABLE  `emps` MODIFY `id` INT
    

    5. 外键约束

  • 从表的外键列,必须引用/参考主表的主键或唯一约束

  • 在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名(例如student_ibfk_1;),也可以指定外键约束名。
  • 创建(CREATE)表时就指定外键约束的话,先创建主表,再创建从表
  • 删表时,先删从表(或先删除外键约束),再删除主表
  • 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据
  • 在“从表”中指定外键约束,并且一个表可以建立多个外键约束
  • 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。
  • 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是外键的约束名。(根据外键查询效率很高)
  • 删除外键约束后,必须 手动 删除对应的索引 ```sql create table 主表名称( 字段1 数据类型 primary key, 字段2 数据类型 ); create table 从表名称( 字段1 数据类型 primary key, 字段2 数据类型, [CONSTRAINT <外键约束名称>] FOREIGN KEY(从表的某个字段) references 主表名(被参考字段) );

(从表的某个字段)的数据类型必须与主表名(被参考字段)的数据类型一致,逻辑意义也一样

(从表的某个字段)的字段名可以与主表名(被参考字段)的字段名一样,也可以不一样

— FOREIGN KEY: 在表级指定子表中的列 — REFERENCES: 标示在父表中的列

```sql
ALTER TABLE emp1
ADD [CONSTRAINT emp_dept_id_fk] FOREIGN KEY(dept_id) REFERENCES dept(dept_id);

约束等级

  • Cascade方式 :在父表上update/delete记录时,同步update/delete掉子表的匹配记录
  • Set null方式 :在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null
  • No action方式 :如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
  • Restrict方式 :同no action, 都是立即检查外键约束
  • Set default方式 (在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别

如果没有指定等级,就相当于Restrict方式。
对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式。

CREATE TABLE emps(
    `id` INT PRIMARY KEY AUTO_INCREMENT ,
    `name` VARCHAR(15),
    `email` VARCHAR(15) ,
    `salary` DECIMAL(10,2) ,
    CONSTRAINT `fk_emps_email` 
  FOREIGN KEY(`email`) REFERENCES `user`(`id`)
  ON UPDATE CASCADE ON DELETE RESTRICT
)

删除外键约束

ALTER TABLE `emps` DROP foreign key `fk_emps_email`

#删除外键对应的索引
ALTER TABLE `emps` DROP  INDEX `fk_emps_email`

image.png

6. CHECK约束

检查某个字段的值是否符号xx要求,一般指的是值的范围
MySQL5.7 可以使用check约束,但check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告
但是MySQL 8.0中可以使用check约束了。

create table employee(
  eid int primary key,
   ename varchar(5),
   gender char check ('男' or '女')
);

7. DEFAULT约束

给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。

create table 表名称(
字段名 数据类型  primary key,
 字段名 数据类型  unique key not null, 
 字段名 数据类型  unique key,
 字段名 数据类型  not null default 默认值,
);
alter table employee modify tel char(11) default ''