第一部分的内容:

SQL(2)DQL语言 条件查询+排序查询+常见函数+分组查询+连接查询

SQL(3)DQL语言 子查询+分页查询+联合查询

SQL(4)DML语言 增删改


SQL(5) DDL语言 库和表的创建,修改和删除


感谢以下链接的教学分享,很好的视频和资源,笔记记录在这里,便于日后查看

新i版-链接: https://pan.baidu.com/s/1GDhRzV_3lUQaETsH4CM8zQ 提取码: rpte

常见约束

/*

含义:一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性一致性
六大约束:
    NOT NULL:该字段不能为空
    DEFAULT:有默认值
    PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
    unique:唯一键,用于保证字段唯一,可以为空
    check :检查约束【mysql不支持,但不报错】
    foreign key :外键,用于限制两个表的关系,用于保证该字段的值来自于主表的关联列的值
                在从表添加外键约束,用于引用副表中某列的值,比如,专业编号,员工表的部门标号等

添加约束一般是在创建表或者添加数据之前修改表
                                             位置                   支持的约束类型                                         是否可以起约束名
约束的分类:列约束:     列的后面                除了外键,语法都支持,但主键没效果         不可以
                    表约束:     所有列的下面          默认和非空不支持                                          可以(主键没效果)
          
          
CREATE TABLE 表名(
    字段名 字段类型 列级约束,
    字段名 字段类型 列级约束,
    表级约束

# 主键和唯一的对比

                 保证唯一性   是否可以为空    一个表中可以有多少个             是否可以组合
    主键       是                      否                          至多一个                              可以(不推荐,不稳定)
    唯一       是                      是                          可以多个                              可以(不推荐,不稳定)
组合主键指的是 PRIMARY KEY(id,stuName)
把两个当一个主键,就是当两个都相同的时候才报错

外键:
    1.用于限制两个表的关系,从表的字段值引用了主表的某字段值
    2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称可以不同
    3.主表的关联列必须是一个key(一般是主键或者唯一键)
    4.插入数据时,先插入主表,在插入从表
      删除数据时,先删除从表,在删除主表
*/

一 创建表时添加约束
#1.添加列级约束
/*
语法:

直接在字段名和类型后面 追加约束类型即可,不支持 check和外键
 */
 CREATE DATABASE students;
 USE studentsCREATE TABLE stuifo(
     id INT PRIMARY KEY,
     stuName VARCHAR(20) NOT NULL,
     gender CHAR(1) CHECK(gender='男' OR gender ='女'),
     seat INT UNIQUE,
     age INT DEFAULT 18,
     majorId INT REFERENCES marjor(id)
 ) 
CREATE TABLE major(
     id INT PRIMARY KEY,
     majorName VARCHAR(20)
 ); DESC stuifo;
 #产看表中索引
 SHOW INDEX FROM stuifo;

#2.添加表级约束

/*
 语法:在所有字段之后添加  【constraint 约束名】  约束类型(字段名)
 */
 CREATE DATABASE students;
 USE studentsDROP TABLE IF EXISTS stuifo;
 CREATE TABLE stuinfo(
     id INT,
     stuName VARCHAR(20),
     gender CHAR(1),
     seat INT,
     age INT,
     majorId INT,
     CONSTRAINT pk PRIMARY KEY(id),
     CONSTRAINT uq UNIQUE(seat), 
     CONSTRAINT ck CHECK(gender IN ('男','女')),
     CONSTRAINT fk_sutinfo_major FOREIGN KEY(majorId) REFERENCES major(id)
     
 )
 SHOW INDEX FROM stuinfo; 
CREATE TABLE major(
     id INT PRIMARY KEY,
     majorName VARCHAR(20)
 );#通用写法
CREATE TABLE IF NOT EXISTS stuinfo(
     id INT PRIMARY KEY,
     stuName VARCHAR(20) NOT NULL,
     gender CHAR(1) CHECK(gender='男' OR gender ='女'),
     seat INT UNIQUE,
     age INT DEFAULT 18,
     majorId INT,
     CONSTRAINT fk_sutinfo_major FOREIGN KEY(majorId) REFERENCES major(id)
     
 )

二 修改表时添加约束

/*
 1.添加列级约束
     alter table 表名 modify column 字段名 字段类型 新约束
 2.添加表级约束
     alter table 表名 add [constraiant 约束别名] 约束类型(字段名)【外键的引用】
 */
 DROP TABLE IF EXISTS stuifo;
 CREATE TABLE stuinfo(
     id INT,
     stuName VARCHAR(20),
     gender CHAR(1),
     seat INT,
     age INT,
     majorId INT,
 )
 DESC 
 #1.添加非空约束ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
#2.添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#3.添加主键约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#4.添加唯一约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
#5.添加外键
ALTER TABLE stuinfo ADD FOREIGN KEY(majorId) REFERENCES major(id);

 三.修改表时删除约束

/*
 1.删除列级约束
     alter table 表名 modify column 字段名 字段类型;
 2.删除表级约束
     alter table 表名 DROP PRIMARY KEY/ drop index 别名/ drop FOREIGN KEY 别名;
 ✳主键只能通过drop删除
 别名 可以通过  SHOW INDEX FROM 表名; 查index
 */
 #1 删除非空约束ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#3.删除主键约束
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4.删除唯一约束
ALTER TABLE stuinfo DROP INDEX 索引名;
# 可以通过以下查看index名
 SHOW INDEX FROM stuinfo;#5.删除外键
 ALTER TABLE stuinfo DROP FOREIGN KEY 外键名;

【补充】

以学生表和专业表为例,如果按照上边所述的方式设置外键,如果此时想删除major表中专业为3的专业是不能实现的,因为主表中还有3号专业的学生。此时可以采用两种办法。

原方式:

ALTER TABLE stuinfo ADD constraint FOREIGN KEY(majorId) REFERENCES major(id)
delete from major where  id =3 ; 报错,不能删除

方式一:级联删除

ALTER TABLE stuinfo ADD constraint FOREIGN KEY(majorId) REFERENCES major(id) on delete cascade;
在添加外键的时候,后增加on delete cascade; 即可实现将从表和主表中满足条件的都删除
delete from major where  id =3 ;

方式二:级联置空

ALTER TABLE stuinfo ADD constraint FOREIGN KEY(majorId) REFERENCES major(id) on delete set null;
在添加外键的时候,后增加on delete set null; 即可实现将从表删除,但主表中的相关内容设置为空
delete from major where  id =3 ;

标识列

/*
自增长列
含义:可以不用手动的插入值
特点:
        1.标识列不一定非和主键搭配,但一定和键搭配
        2.至多一个标识列
        3.标识列的类型只能是数值型,一般是int
        4.标识列可以通过 SET auto_increment_increment = 3 设置步长,也可以手动设置起始值
*/

一 创建表的时候设置标识列

DROP TABLE IF EXISTS tab_identify
 CREATE TABLE tab_identify(
         id INT 约束 AUTO_INCREMENT;,
         NAME VARCHAR(20)
 );
 INSERT INTO tab_identify VALUES(NULL,'john')
 SHOW VARIABLES LIKE '%auto_increment%'
 #可以设置步长,但一般不更改,起始值不能用或者方式更改
 SET auto_increment_increment = 3;

 二 修改表的时候设置标识列

ALTER TABLE tab_identify MODIFY COLUMN  id INT PRIMARY KEY AUTO_INCREMENT;

 三 修改表的时删除标识列

ALTER TABLE tab_identify MODIFY COLUMN  id INT;