MySQL(四)

DDL语法,数据类型,约束,索引

01 DDL语法

/*
概念:数据定义语言。涉及库和表的管理
特点:管理表和库的操作
优点:无
*/
# 库的管理
​
#1. 库的创建
create database 【if not exists】 库名;
#例子:
CREATE DATABASE text012;
# 2.库的修改。
#注:库名不支持修改,可以修改字符集,gbk为一种编码格式
ALTER DATABASE 库名 CHARACTER SET gbk;
#3.库的删除
DROP DATABASE IF EXISTS 库名;
​
​
# 表的管理
​
#1. 表的创建
create table 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】
...
列名 列的类型【(长度) 约束】
)
#案例:创建学生表
CREATE TABLE student(
id INT(11),
student_name VARCHAR(11)
);
#2.表的修改
#修改表名
RENAME TABLE 旧表名 TO 新表名;
#修改列名
ALTER TABLE 表名 change 旧列名 新列名 数据类型(长度) [约束];
#3.表的删除
DROP TABLE 表名;
​
​

02 数据类型

#数值类型
/*
类型 大小
范围(有符号)
范围(无符号)
用途
​
TINYINT 1 Bytes
(-128,127) 
(0,255)
小整数值
​
SMALLINT 2 Bytes
(-32 768,32 767)
(0,65 535)
大整数值
​
MEDIUMINT 3 Bytes 
(-8 388 608,8 388 607)
(0,16 777215)
大整数值
​
INT或INTEGER 4 Bytes
(-2 147 483 648,2 147 483 647)
(0,4 294 967295)
大整数值
​
BIGINT 8 Bytes
(-9,223,372,036,854,775,808,9223 372 036 854 775 807)
(0,18 446744 073 709551 615)
极大整数值
​
FLOAT 4 Bytes
(-3.402 823 466 E+38,-1.175494 351 E-38),0,(1.175 494351 E-38,3.402 823 466 351E+38)0,(1.175 494351 E-38,3.402 823 466E+38)
单精度浮点数值
​
DOUBLE 8 Bytes
(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 2014 E-308),0,(2.225 073 858 507201 4 E-308,1.797 693 134 862315 7 E+308)
0,(2.225 073858 507 201 4E-308,1.797
693 134 862315 7 E+308)
双精度浮点数值
​
DECIMAL
对DECIMAL(M,D),如果M>D,为M+2否则为D+2
依赖于M和D的值
依赖于M和D的值
小数值
*/
​
#以上不重要,一般常用INT和DOUBLE表示数值类型,但是日期类型的使用会稍微多些
​
/*
类型 大小 (bytes)
范围 
格式
用途
​
DATE 3 
1000-01-01/9999-12-31
YYYY-MM-DD
日期值 
​
TIME 3
'-838:59:59'/'838:59:59'
HH:MM:SS
时间值或持续时间
​
YEAR 1 
1901/2155
YYYY
年份值
​
DATETIME 8
'1000-01-01 00:00:00' 到 '9999-12-3123:59:59'
YYYY-MM-DD hh:mm:ss
混合日期和时间值
​
TIMESTAMP 4
'1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC结束时间是第 2147483647秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07
YYYY-MM-DDhh:mm:ss
混合日期和时间值,时间戳
*/
​
#字符串类型
/*
类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据
*/
​
​

03 约束

/*
含义:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性。
分类:
1. NOT NULL:非空,该字段的值不能为空。
2. DEFAULT: 默认、设置字段的默认值。
3. PRIMARY KEY:主键,保证字段值的唯一性,并且不能为空,比如学号。
4. UNIQUE:唯一,保证字段值得唯一性,可以为空,比如座位。
5. FOREIGN KEY:外键,用于限制两个表的关系,用于保证字段的值,必须来自于另一张表的关联列的值。
*/
​
#NOT NULL
#如果在列上定义了not null,那么当插入数据时,必须为列提供数据
​
-- 没有插入学生姓名,可以成功
insert into student (id, age) values (100, 18);
-- 将学生表的name修改成not null约束
ALTER TABLE student
CHANGE name
name VARCHAR(32) NOT NULL;
-- 没有插入学生姓名,插入失败
insert into student (id, age) values (101, 18);
​
#DEFAULT
#默认值,当当插入数据时,没有提供列数据,使用默认值。
​
-- 插入学生信息,没有提供graduation列的值,默认是null
insert into student (id, age) values (102, 18);
-- 修改graduation列默认值为0
ALTER TABLE student
CHANGE graduation
graduation VARCHAR(1) DEFAULT 0;
-- 插入学生信息,没有提供graduation列的值,默认是0
insert into student (id, age) values (103, 18);
​
#PRIMARY KEY
#primary key不能重复而且不能为null。
#在实际开发中,每一张表往往都会设计一个主键,表示每一条数据的唯一性,方便后续的修改、删除等操作。
-- 插入成功,id为104在表格中不存在
insert into student (id, age) values (104, 18);
-- 插入成功,id为104在表格中存在,主键不能重复
insert into student (id, age) values (104, 18);
​
#UNIQUE
#当定义了唯一约束后,该列值是不能重复的,但是可以为null
​
-- 修改seat列为UNIQUE约束
ALTER TABLE student
CHANGE seat
seat VARCHAR(255) UNIQUE;
-- 插入成功,表中seat不存在1
insert into student (id, seat) values (105, 1);
-- 插入失败,表中seat存在1,UNIQUE不能重复
insert into student (id, seat) values (106, 1);
​
#FOREIGN KEY
#外键:用于定义主表和从表之间的关系。
#当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null
​
-- 修改列为外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名
FOREIGN KEY(列名) REFERENCES 主表名 (列名);
-- 修改学生表的class_id为外键约束,值取自于class表的id
ALTER TABLE student ADD CONSTRAINT class_id_ibfk
FOREIGN KEY(class_id) REFERENCES class (id);
-- 插入失败,因为class表中id列不存在值10
insert into student (id, class_id) values (107, 10);
​

04 索引

/*
    索引是用来提高数据查询效率的一种数据结构。
    索引相当于一本书的目录,查找内容的时候先根据目录,找到要找的内容的页码,然后再去页码查看数据。
MySql的查找方式有两种:
        1. 全表扫描
        2. 根据索引检索
        
索引的实现原理
mysql数据库中的索引是需要排序的,底层是通过B-Tree实现的。查找的时候是根据中序遍历方式来查找数据。        
id  (主键)   name 物理地址(不是给用户看的,是mysql自己看的)
1   张三      0x1111
2   李四      0x2222
3   王五      0x8888
4   赵六      0x5555
5   Tom      0x4444        
        
注意:
1. 在数据库中逐渐上都会自动添加索引对象,或者一个字段上如果有unique约束的话也会自动创建索引对象。
2. 在数据库中,任何一张表的任何一条记录在硬盘存储上都有一个物理地址,指的是该数据存储在硬盘的什么位置        
*/
SELECT * FROM user WHERE id = 1;
-- 查找索引后变成了
SELECT * FROM user WHERE 物理地址 = 0x1111        
​
/*
什么时候使用索引
不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统性能。
1. 数据量大的时候。
2. 字段经常用在where后进行查找。
3. 字段很少执行DML操作(DML之后,索引需要重新排序)。
建议通过主键查询,通过unique约束的字段进行查询
*/
#使用
#1. 创建索引
CREATE INDEX e_email ON emplyees(email);
#2. 查看索引
SHOW INDEX FROM emplyees;
#3. 删除索引
DROP INDEX e_email ON emplyees;
#4.查看是否使用索引查找
EXPLAIN SELECT * FROM emplyees WHERE email ="[email protected]";

数据库设计思路

/*
1.一对一
    假设有学生表student,用于存放学生基础信息;另有一张学生卡表student_card,用于存放学生的学生卡信息。
    现在要用外键关联,表示这两张表的数据关系。经过分析,可以知道一个学生对应一张学生卡,一张学生卡属于某一个学生,属于一对一关系。 一对一关系外键建立在任意一张表都可以。
        
2. 一对多
        假设有学生表student,用于存放学生基础信息。另有一张班级表class,用于存放班级的基础信息。
        现在要用外键关联,表示这两张表的数据关系。经过分析,可以知道一个学生属于某一个班级,一个班级有很多个学生,属于一对多关系。一对多关系外键建立在多的一方,即建立在学生表上。
        
3.多对多
    假设有学生表student,用于存放学生基础信息。另有一张课程表course,用于存放课程的基础信息。
    现在要用外键关联,表示这两张表的数据关系。经过分析,可以知道一个学生可以选择很多门课程,一个课程也可以被很多学生选择,属于多对多关系。
多对多关系外键建立在哪一张表都不合适,新建一张关联表
*/        

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