DLL

# DLL
        /*
        数据定义语言

        库和表的管理

        一、库的管理
        创建、修改、删除
        二、表的管理
        创建、修改、删除

        创建:create
        修改:alert
        删除;drop

        */

        #一、库的管理
        #1、库的创建
        /*
        语法:
        create datebase 库名;
        */

        #案例: 创建库Books

        CREATE DATABASE books;

        CREATE DATABASE IF NOT EXISTS books;

        #2、库的修改
        /*

        */
        更改库的字符集

        ALTER DATABASES books CHARACTER SET

        #3、库的删除

        DROP DATABASE books;
        DROP DATABASE IF EXISTS books;


        #二、表的管理
        #1、表的创建
        /*
        create table 表名(
            列名 列的类型【长度) 约束】,
            列名 列的类型【长度) 约束】,
            列名 列的类型【长度) 约束】,
            ...
        )
        */

        #案例:创建表Book
        USE books;
        CREATE TABLE book(
            id INT, #编号
            bname VARCHAR(20), #书名
            price DOUBLE, #价格
            authorId INT, #作者编号
            publishDate DATETIME #出版日期
            
        );

        CREATE TABLE author(
            id INT,
            au_name VARCHAR(20),
            nation VARCHAR(10)

        );
        DESC author;


        #2.表的修改

        /*
        alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;

        */

            #1、修改表名
            ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
            
            #2、修改列的类型或约束
            ALTER TABLE book MODIFY COLUMN pudate TIMESTAMP;
            
            #3、添加新列
            ALTER TABLE book ADD COLUMN annual DOUBLE;
            
            #4、删除列
            ALTER TABLE author DROP COLUMN annual;
            
            #5、修改表名
            ALTER TABLE author RENAME TO book_author;
            
        #3.表的删除

        DROP TABLEIF EXISTS 】 book_author;   

        # 查看当前库所有表
        SHOW TABLES;


        # 通用的写法:

        DROP DATABASE IF EXISTS 旧库名;
        CREATE DATABASE 新库名;

        DROP TABLE IF EXISTS 旧表名;
        CREATE TABLE 表名;

        #4、表的复制

        INSERT INTO author VALUES
        (1, '莫言', '中国'),
        (2, '冯唐', '中国'),
        (3, '金庸', '中国'),
        (4, '村上春树', '日本')

        SELECT * FROM author;

        #1、仅仅复制表的结构

        CREATE TABLE copy LIKE author;

        #2、复制表的结构+数据
        CREATE TABLE copy2
        SELECT * FROM author;

        # 只复制部分
        CREATE TABLE copy3
        SELECT id, au_name FROM author WHERE nation = '中国';

        # 仅仅复制某些字段,不复制数据;
        CREATE TABLE copy4
        SELECT id, au_name FROM author WHERE 1=2;

        CREATE TABLE copy4
        SELECT id, au_name FROM author WHERE 0;

        /*
        常见的数据类型:
            数值型:
                整形: TINYINT 2-255  
                    SMALLINT -32768 ~32767 
                    MEDIUMINT  -8388608~8388607
                    INT  -2147483648 ~ 2147483647
                    BIGINT -9223372036854775804 ~9223372036854775803
                特点:  1、如果不设置无符号,就是有符号
                    2、如果插入的数值超出整形范围,回报异常,并且实际插入临界值
                    3、如果不设置长度,会有默认的长度
                
                小数: M:有效数字位数  D:小数位数
                    点定数 dec(M,D) 
                        decimal(M,D) 
                    浮点数 float(M,D)   4字节
                        double(M,D)   8字节
                        
            字符型:    M:最多的字符数,一个汉字,一个a 都是一个字符
                较短的文本:char(M)    固定长度的字符  比较耗费    效率高  可以省略M参数
                        varchar(M) 可变长度的字符  比较节省    效率低  不可以省略M参数
                       其他:
                        binary 和 varbinary 
                较长的文本:text、 
                        blob(较长的二进制数据)
                
                
                enum 列表类型 设定列只能输入的值,只能一次插入可选列表的一个值;
                set 列表类型 设定列只能输入的值,能一次将可选列表的多个值作为一个值 进行插入
                
            日期型:
                date        1000-01-01
                datetime    1000-01-01 00:00:00
                timestamp   19700101080001
                time        -838:59:59
                year        1901
                
                
                

        */

        TINYINT SMALLINT MEDIUMINT INT BIGINT

        CREATE TABLE tab_char(
            c1 ENUM('a', 'b', 'c')
        )
        INSERT INTO tab_char VALUES('a')

        CREATE TABLE tab_set(
            s1 SET('a', 'b', 'c', 'd')
        )
        INSERT INTO tab_set VALUES('a','b','c')       



        # 常见约束

        /*

        含义:一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性

        分类:六大约束
                NOT NULL: 非空, 用于保证该字段的值不能为空 比如:姓名、学号等
                DEFAULT: 默认,用于保证该字段默认值 比如:性别
                PRIMARY KEY: 主键,用于保证该字段具有唯一性,并且非空 比如:学号、员工编号
                UNIQUE :唯一,用于保证该字段的值具有唯一性,可以为空 比如座位号
                CHECK:检查约束【mysql中不支持】,比如:年龄、性别
                FOREIGN KEY:外键,用于限制两个表的关系的,用于保证该字段值必须来自于主表的关联列的值
                    在从表添加外键约束,用于限制主表中某列的值
                    比如:学生表的专业编号,员工表的部门编号,工种编号

        添加约束的时机:
            1、创建表时
            2、修改表时
            
        约束的添加的分类:
            列级约束:
                六大约束语法上都支持,但外键约束没有效果
                
            表级约束:
                除了非空、默认,其他的都支持

        主键和唯一的大对比:
                保证唯一性   是否允许为空 一个表中可以有多少个   是否允许组合
            主键  是       否       至多有1个       可以,但不推荐
            唯一  是       是       可以有多个       可以,但不推荐



            
        */

        CREATE TABLE 表名(
            字段名  字段类型 【列级约束】
            字段名  字段类型
            表级约束
        )

        #一、创建表时添加约束

        CREATE DATABASE students;

        #1、添加列级约束.
        /*
        语法:

        直接在字段名和类型后面追加 约束类型即可。

        只支持:默认、非空、主键、唯一
        */

        USE students;

        CREATE TABLE 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 REFERENCES major(id) # 外键
        );

        CREATE TABLE major(
            id INT PRIMARY KEY,
            majorName VARCHAR(20)
        );

        DESC stuinfo;

        SHOW INDEX FROM stuinfo;
        # 查看stuinfo表中所有的索引,包括主键、外键。


        #2、添加表级约束
        /*

        语法:在各个字段最下面
          【constraint 约束名】 约束类型(字段名)

        */

        DROP TABLE  IF EXISTS stuinfo;
        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='' OR gender=''),#检查
            CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id) #外键
        );

        SHOW INDEX FROM stuinfo;

        #通用的写法:

        CREATE TABLE IF EXISTS stuinfo(
            id INT PRIMARY KEY,
            stuName VARCHAR(20) NOT NULL,
            gender CHAR(1),
            age INT DEFAULT 18,
            SET INT UNIQUE,
            majorid INT,
            CONSTRAINT fk_stuinfo_major FOREIGN KEY (majorid) REFERENCES major(id)
        );


        #二、修改表时添加约束

        /*
        1、添加列级约束
        alter table 表名 modify column 字段名 字段类型 新约束;

        2、添加表级约束
        alter table 表名 add 【constraint 约束名】约束类型(字段名) 【外键的引用】;

        */

        #1、添加非空约束
        ALTER TABLE stuinfo MODIFY  COLUMN stuName VARCHAR(20) NOT NULL;

        #2、添加默认约束
        ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
        #3、添加主键
            #1、列级约束
        ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
            #2、表级约束
        ALTER TABLE stuinfo ADD PRIMARY KEY(id);

        #4、添加唯一
            #1、列级约束
        ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
            #2、表级约束
        ALTER TABLE stuinfo ADD UNIQUE(seat);

        #5、添加外键
        ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(major) REFERENCES major(id);

        #三、修改表时删除约束
        #1、 删除约束(修改的时候不添加 约束即可)
        ALTER TABLE stuinfo MODIFY  COLUMN stuName VARCHAR(20);
        #2、删除默认约束
        ALTER TABLE stuinfo MODIFY COLUMN age INT ;
        #3、删除主键
        ALTER TABLE stuinfo DROP PRIMARY KEY;
        #4、删除唯一键
        ALTER TABLE stuinfo DROP INDEX seat;
        #5、删除外键
        ALTER TABLE stuinfo DROP FOREIGN KEY  fk_stuinfo_major;




        #标识列
        /*
        又称为自增长列
        含义:可以不用手动插入值,系统提供默认序列值

        特点:
        1、标识列必须与主键搭配吗?不一定,但要求是一个key
        2、一个表中可以有几个标识列?至多一个
        3、标识列的类型只能是数值型
        4、标识列可以通过 set auto_increment_increment=3;设置步长
        可以通过手动插入值,设置起始值
            
        */

        #一、创建表时设置
        CREATE TABLE tab_identity(
            id INT PRIMARY KEY AUTO_INCREMENT,
            NAME VARCHAR(20)
        )

        #二、修改表时设置标识列
        ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

        #三、修改表时删除标识列
        ALTER TABLE tab_identity MODIFY COLUMN id INT  ;

 

posted @ 2020-02-26 11:27  gupanpan  阅读(137)  评论(0)    收藏  举报