day03 日期类型、枚举类型、集合 约束条件

day03 日期类型、枚举类型、集合 约束条件

昨日内容回顾

针对库的基本sql语句

#增  
    create database db111; 
    
#删  
	drop database db111;
    
#改 
	alter database db111 charset='gbk'

#查 
	show databases;
 	show create database db156; 
    

针对表的基本sql语句

	select database(); #查看当前所在数据库   
	use db156   #切换数据库
-------------------------------------------------------------------------------------
#增 
	create table edg(id int);
    
#删 
	drop table edg;
    
#改 
	alter table edg rename rng;
    
	
#查 
	show tables;  
    show create table edg; 
    desc edg; 

针对记录的基本sql语句

#增  
	insert into edg values(1,'hahaha');
	
#删 
	delete from edg where id=2
	
#改
	update edg set name='dijia' where id =2;
	
#查 
	select * from edg;
    select name from edg;

存储引擎

show engines #查看存储引擎
需要掌握四个
    MyISAM   #速度快不安全
    	.frm	表结构
        .MYD	表数据
        .MYI	表索引
        
    innodb #安全速度相对于myisam慢一点
    	.frm 表结构
    	.ibd  表数据+索引
    	
    memory #内存,断电消失
    	.frm 表结构
    	
    blackhole #垃圾站
    	.frm 表结构

创建表的完整语法

create table 表名 (
	字段名 字段类型 (数字)约束条件,
	字段名 字段类型 (数字)约束条件,
	字段名 字段类型 (数字)约束条件,
	字段名 字段类型 (数字)约束条件
)
注意 字段名,字段类型必须的
	约束条件可以跟多个
	最后一条语句不加逗号

基本数据类型

整型  tinyint smallint int bigint 
	存储范围不一样 都带正负号
	约束条件 unsigned(不带正负号)
	
浮点型 float(精确小数点后七位) double(精确小数点后14位) decimal(太多了)
	精度不一样
	
字符型 char varchar
	 定长   变长
	 char:固定长度 超出报错
	varchar:有多长就多长 超出报错

数字

# 1.数字在数字类型中不是用来限制存储长度 而是用来控制展示长度
	我们在创建数字类型的时候不需要考虑数字
# 2.数字在其他类型中都是用来限制存储长度的

sql_mode

show variables like '%mode%' #模糊查询mode
set session #临时修改
set global  #永久修改

set global sql_mode='strict_trans_tables' #严格模式,超出不报错 自动截取
set global sql_mode='strict_trans_tables,pad_char_to_full_length' #不让他优化 char设定多少是多少 

#查询字段的数据长度 char_length
select char_length(name) from edg ;

今日内容概要

  • 数据类型之日期类型

  • 数据类型之枚举和集合

  • 约束条件

    unsigned  #忽略正负号
    zerofill  #0填充
    not null  #非空
    default   #默认值
    unique    #唯一
    primary key #主键
    auto_increment  #自增
    外键  #重要  foreign key(外键字段名) references 关联的表名(关联的表的字段名)
    
    

    数据类型之日期类型

    date		年月日
    datetime	年月日时分秒
    time		时分秒
    year		年
    
    create table user(
    	id int comment '编号',
        name varchar(255) comment '姓名',
        reg_time datetime comment '注册时间',
        birthday date comment '生日',
        study_time time comment '学习时间',
        born_year year comment '年份'
    );
    """
    字段也可以加类似于注释的说明,没啥用
    	comment
    """
    # 此处先人工智能模拟 
    insert into user values(1,'jason','2000-11-11 11:11:11','2000-11-11','11:11:11','2000');
    

    基本数据类型之枚举与集合类型

#为了解决多选一的情况   
	多选一   #枚举 enum    集合  set
    '''提前定义好数据之后 后续录入只能录定义好的内容之一'''
create table a1(
	id int,
    name char(6),
    hobbies enum('eat','sleep','go')
);
insert into a1 values(1,'uzi','eat');  # 正常
insert into a1 values(2,'ming','play');  # 报错

###################################################################################
多选多,包含多选一
create table a1(
	id int,
    name char(6),
    hobbies set	('eat','sleep','go')
);
insert into a1 values(1,'uzi','eat');  # 正常
insert into a1 values(2,'ming','eat,sleep');  # 正常
insert into a1 values(3,'ning','play');  # 报错

约束条件

1.unsigned #忽略正负号
	id int unsigned 
2.zerofill #0填充
	id int zerofill
3.not null #非空,不能为空
	#创建
	create table a2 (id int ,name varchar(32) not null);
	#查询     null 结果 yes:(可以为空不插入数据显示为NULL)  No:(不能为空,不能不给值,可以给空值)
	 desc a2;
        +-------+-------------+------+-----+---------+-------+
        | Field | Type        | Null | Key | Default | Extra |
        +-------+-------------+------+-----+---------+-------+
        | id    | int(11)     | YES  |     | NULL    |       |
        | name  | varchar(32) | NO   |     | NULL    |       |    #null变为了NO
        +-------+-------------+------+-----+---------+-------+
    #插入数据
       insert into a2(id) values(1);#会报下面这个错误,提示name这个字段没有默认值
      # ERROR 1364 (HY000): Field 'name' doesn't have a default value
       
4.default #默认值,(用户给值用用户的,没给值用默认的)
	#创建表
		create table a4 (id int ,name varchar(16) default '超级赛亚人');
	#查询
		desc a4;
            +-------+-------------+------+-----+-----------------+-------+
            | Field | Type        | Null | Key | Default         | Extra |
            +-------+-------------+------+-----+-----------------+-------+
            | id    | int(11)     | YES  |     | NULL            |       |
            | name  | varchar(16) | YES  |     | 超级赛亚人      |       |
            +-------+-------------+------+-----+-----------------+-------+	
	#添加数据
		insert into a4(id) values(1);
        insert into a4 values(2,'孙悟空');
     #查询验证
     	select * from a4;
            +------+-----------------+
            | id   | name            |
            +------+-----------------+
            |    1 | 超级赛亚人      |
            |    2 | 孙悟空          |
            +------+-----------------+
5.unique #唯一保证字段(一个或者多个字段)在整个表中没有重复的数据
#单列主键
	#创建
		create table a5(id int ,name varchar(16) unique)
	#查询
        desc a5;
            +-------+-------------+------+-----+---------+-------+
            | Field | Type        | Null | Key | Default | Extra |
            +-------+-------------+------+-----+---------+-------+
            | id    | int(11)     | YES  |     | NULL    |       |
            | name  | varchar(16) | YES  | UNI | NULL    |       |
            +-------+-------------+------+-----+---------+-------+
	#添加数据
		insert into a5(name) values('zhang'),('zhang');#报如下错zhang这个key已经有了
			ERROR 1062 (23000): Duplicate entry 'zhang' for key 'name'

#多列主键 只是创建方式有点区别  其他大致一样
	create table a6(
        id int, 
        name varchar(16),
        name2 varchar(16),
        unique(name,name2)
    );
	
6.primary key   #等同于 not null(不能为空) +unique(唯一)
	#介绍
	    1.但从约束条件上而言主键相当于not null + unique(非空且唯一)
        2.主键的功能目前简单的理解为能够加快数据的查询速度相当于书的目录
    	3.InnoDB存储引擎规定每张表都必须有且只有一个主键
        	2.1.表中没有任何的主键和其他约束条件
            	InnoDB默认会采用一个隐藏字段作为表的主键
    		2.2.表中没有主键但是有非空且唯一的字段
            	InnoDB会自动将该字段升级为主键
    	结论:每张表都必须要有一个id(sid nid uid)字段并且该字段就是主键
#单列主键
	#创建
		create table a7(
            id int primary key,
            name varchar(16)
        );
	#查询
		 desc a7;
            +-------+-------------+------+-----+---------+-------+
            | Field | Type        | Null | Key | Default | Extra |
            +-------+-------------+------+-----+---------+-------+
            | id    | int(11)     | NO   | PRI | NULL    |       |
            | name  | varchar(16) | YES  |     | NULL    |       |	
            +-------+-------------+------+-----+---------+-------+
#多列主键 和单列主键差不多就是多了一步
	#创建
		create table a8(
            id int,
            age int,
            name varchar(16),
            primary key (id ,age)
        )
7.auto_increment #配合主键一起使用,auto_increment 自增 添加数据就不用知道id了
	#创建
		create table a9(
            id int primary key auto_increment,
            name varchar (16)
        );
	#查询
        desc a9;
            +-------+-------------+------+-----+---------+----------------+
            | Field | Type        | Null | Key | Default | Extra          |
            +-------+-------------+------+-----+---------+----------------+
            | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
            | name  | varchar(16) | YES  |     | NULL    |                |
            +-------+-------------+------+-----+---------+----------------+
	#添加数据
		insert into a9(name) values('zhang');
		insert into a9(name) values('aaw');
	#测试
		select * from a9;
            +----+-------+
            | id | name  |
            +----+-------+
            |  1 | zhang |
            |  2 | aaw   |
            +----+-------+
    #主键自增特性
    	主键的自增是不会收到delete from删除操作的影响 ,删除数据他还是会往下走1.2.3.4.5.6.7
		truncate既可以清空表数据也会重置主键值 
		truncate 表名 

外键

#简而言之 两张表互联的关系,记录两张表互联的关系
使用外键可以解决
	1.表内部数据混乱(可忽略)
	2.反复的录入重复数据(可忽略)
	3.修改数据太过繁琐  浪费磁盘空间(可忽略)
	4.极大地影响了操作数据的效率
#如何查找表关系   换位思考
	1.多对一
    2.多对多
    3.一对一
    4.没有关系
    
    比如 书籍表和 出版社表
    	1.先站在书籍表
        	想;一本书能对否对应多个出版社
            不可以
        2.站在出版社表
        	想:一个出版社是否可以对于多本书
            可以
            
        #一个可以 一个不可以 则为多对一   外键建在对应多的一方,比如上面这个例子就应建在书籍表里
        #foreign key(外键字段名) references 关联的表名(关联的表的字段名)
        #创建
        create table book (
        	id int primary key auto_increment,
            book_name varchar(16),
            pub_id int,
            foreign key (pub_id) references publish(id)
        );
        
        create table publish(
        	id int primary key auto_increment,
            name varchar(16)
        );
        #查询
        	desc publish;
                +-------+-------------+------+-----+---------+----------------+
                | Field | Type        | Null | Key | Default | Extra          |
                +-------+-------------+------+-----+---------+----------------+
                | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
                | name  | varchar(16) | YES  |     | NULL    |                |
                +-------+-------------+------+-----+---------+----------------+
           desc book;
                +-----------+-------------+------+-----+---------+----------------+
                | Field     | Type        | Null | Key | Default | Extra          |
                +-----------+-------------+------+-----+---------+----------------+
                | id        | int(11)     | NO   | PRI | NULL    | auto_increment |
                | book_name | varchar(16) | YES  |     | NULL    |                |
                | pub_id    | int(11)     | YES  | MUL | NULL    |                |
                +-----------+-------------+------+-----+---------+----------------+
                
#外键约束 级联更新(外键关联的表,他的字段名修改 外键对应的也修改,) 级联删除(外键关联的表,他的字段名删除 外键对应的也删除,) 在外键的表加入下面这两句话就好
	on update cascade 
    on delete cascade
##########################################################################
        create table book (
        	id int primary key auto_increment,
            book_name varchar(16),
            pub_id int,
            foreign key (pub_id) references publish(id)
            on update cascade
            on delete cascade
        );
        
        
               create table publish(
        	id int primary key auto_increment,
            name varchar(16)
        ); 

外键约束之多对多

#先换位思考 两个都可以 就是多对多   外键字段建立在第三张关系表中
	1.先站在电影的基础之上
    	问:一个电影能否对应多个电影院
        答:可以
    2.在站在电影院的基础之上
    	问:一个电影院能否对应多个电影
         答:可以
#先创建普通表 最后创建具有外键的表
	create table movie(
    	id int primary key auto_increment,
        movie_name varchar(32)
    );
    create table cinema(
    	id int primary key auto_increment,
        cinema_name varchar(32)
    );
    
    create table movie2cinema(
        id int primary key auto_increment,
        cinema_id int,
        foreign key (cinema_id) references cinema (id)
        on update cascade
        on delete cascade,
        movie_id int,
        foreign key (movie_id) references movie (id)
        on update cascade
        on delete cascade
    );

#查询
	desc movie;
        +------------+-------------+------+-----+---------+----------------+
        | Field      | Type        | Null | Key | Default | Extra          |
        +------------+-------------+------+-----+---------+----------------+
        | id         | int(11)     | NO   | PRI | NULL    | auto_increment |
        | movie_name | varchar(32) | YES  |     | NULL    |                |
        +------------+-------------+------+-----+---------+----------------+	
    desc cinema;
        +-------------+-------------+------+-----+---------+----------------+
        | Field       | Type        | Null | Key | Default | Extra          |
        +-------------+-------------+------+-----+---------+----------------+
        | id          | int(11)     | NO   | PRI | NULL    | auto_increment |
        | cinema_name | varchar(32) | YES  |     | NULL    |                |
        +-------------+-------------+------+-----+---------+----------------+
	desc movie2cinema;
        +-----------+---------+------+-----+---------+----------------+
        | Field     | Type    | Null | Key | Default | Extra          |
        +-----------+---------+------+-----+---------+----------------+
        | id        | int(11) | NO   | PRI | NULL    | auto_increment |
        | cinema_id | int(11) | YES  | MUL | NULL    |                |
        | movie_id  | int(11) | YES  | MUL | NULL    |                |
        +-----------+---------+------+-----+---------+----------------+

你可能感兴趣的:(mysql,数据库,mysql,sql)