| 结构化查询语言 |
| 5.7 以后符合SQL92严格模式 |
| 通过sql_mode参数来控制 |
| DDL:Data Definition Language 数据定义语言(CREATE) |
| DCL:Data control Language 数据控制语言(GRANT,ROLLBACK,COMMIT) |
| DML:Data Manipulation Language 数据操作语言(INSERT,UPDATE,DELETE) |
| DQL:Data Query Language 数据查询语言(SELECT) |
| |
| |
| 作用:规范SQL语句书写方式 |
| mysql> select @@sql_mode; |
| ONLY_FULL_GROUP_BY, |
| STRICT_TRANS_TABLES, |
| NO_ZERO_IN_DATE, |
| NO_ZERO_DATE, |
| ERROR_FOR_DIVISION_BY_ZERO, |
| NO_AUTO_CREATE_USER, |
| NO_ENGINE_SUBSTITUTION |
| |
| 例子: |
| 在现实角度,除法运算中,处理不能为0。当MySQL需要做除法运算时,为了保证复合现实的数学逻辑,也需要保证除数不能为0。所以MySQL通过设定sql_mode参数,去规范我们的除法运算,从而保证不会出现违背现实数学逻辑的情况 |
| 现实生活中,我们使用日期,0年0月0日在现实中是不被允许的。 |
| 数据库中的规则规范 |
| |
| NO_ZERO_IN_DATE, |
| NO_ZERO_DATE, |
| utf8 :最大存储长度,单个字符最大支持3个字符 |
| utf8mb4(建议使用这个):最大存储长度,单个字符最大支持4个字符 |
| 原因:支持编码比utf8多。 |
| 例子:比如,emoji字符mb4中支持,utf8不支持。emoji表情字符,1个字符占四个字节,utf8存不下。 |
| |
| 建库建表时使用: |
| 5.7默认是latin,防止乱码统一格式 |
| create database zabbix charset utf8mb4; |
| mysql> show create database zabbix; |
| +----------+--------------------------------------------------------------------+ |
| | Database | Create Database | |
| +----------+--------------------------------------------------------------------+ |
| | zabbix | CREATE DATABASE `zabbix` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ | |
| +----------+--------------------------------------------------------------------+ |
| 1 row in set (0.00 sec) |
| 每种字符集,有多种校对规则(排序规则) |
| mysql> show collation; |
| 作用: |
| 影响到排序的操作规则,大小写是否敏感。影像数据库中数据的排序。 |
常用的数值类型
类 |
类型 |
存储长度 |
二进制范围 |
十进制数字范围 |
整数 |
tinyint |
1B=8bit |
000000000~11111111 |
0~255,-128~127 |
整数 |
int |
4B=32bit |
略 |
0~2^32-1,-2^31~2^31-1 |
整数 |
bigint |
8B=64bit |
略 |
0~2^64-1,-2^63~2^63-1 |
定点数 |
decimal |
|
|
|
注意:尽量选最小的,够用就行
实例
| 用utf8mb4创建xiaowu库 |
| mysql> create database xiaowu charset utf8mb4; |
| 使用xiaowu库; |
| mysql> use xiaowu; |
| 在xiaowu库下创建t1表,id列用int型,name列用varchar型,age用tinyint型 |
| mysql> create table t1(id int ,name varchar(64) ,age tinyint); |
| |
| 说明:手机号是无法存储到int的。一般是使用char类型来存储手机 |
常用字符串类型
| 一、char(11) : |
| 定长 的字符串类型,在存储字符串时,最大字符长度11个,立即分配11个字符长度的存储空间,如果存不满,空格填充。 |
| |
| 二、varchar(11): |
| 变长的字符串类型看,最大字符长度11个。在存储字符串时,自动判断字符长度,按需分配存储空间。 |
| |
| 补充: |
| 1.varchar类型,在存储数据是,会先判断字符长度,然后合理分配存储空间。 |
| char,不会判断,立即分配空间。 |
| 在固定长度的列中,推荐使用char类型 |
| |
| 2.varchar类型,会存储字符串之外,还会额外使用1-2字节存储字符长度。 |
| adfdd ---》5+1 |
| |
| 例子: |
| varchar(10) |
| abcde ---> 1.判断字符长度---》2.申请空间 ----》3.存字符----》申请一个字节,存储5这个数字 |
| |
| char(10) |
| abcde ---》1.申请10个字符空间----》2.存字符+表格填充 |
| |
| 3.应用场景 |
| 1.字符串固定长度,char类型,不固定用varchar类型 |
| |
| 4.()中的数字问题 |
| 括号中设置的是字符的个数,无关字符类型。但是不同种类的字符,占用的存储空间是不一样的。对于英文和数字,每个 |
| mysql> create table t2 (n1 char(10),n2 varchar(10)); |
| mysql> insert into t2 values('aaaaaaaaaa','aaaaaaaaaa'); |
| mysql> select * from t2; |
| +------------+------------+ |
| | n1 | n2 | |
| +------------+------------+ |
| | aaaaaaaaaa | aaaaaaaaaa | |
| +------------+------------+ |
| mysql> insert into t2 values('1234567890','1234567890'); |
| mysql> select * from t2; |
| +------------+------------+ |
| | n1 | n2 | |
| +------------+------------+ |
| | aaaaaaaaaa | aaaaaaaaaa | |
| | 1234567890 | 1234567890 | |
| +------------+------------+ |
| mysql> insert into t2 values('12345678901','12345678901'); |
| ERROR 1406 (22001): Data too long for column 'n1' at row 1 |
| |
| mysql> insert into t2 values('一二三四五六七八九十','1234567890'); |
| Query OK, 1 row affected (0.00 sec) |
| |
| mysql> select * from t2; |
| +--------------------------------+------------+ |
| | n1 | n2 | |
| +--------------------------------+------------+ |
| | aaaaaaaaaa | aaaaaaaaaa | |
| | 1234567890 | 1234567890 | |
| | 一二三四五六七八九十 | 1234567890 | |
| +--------------------------------+------------+ |
| |
| 5.7:超出数字类型会直接报错 |
| 5.6:超出数字类型会只记录前十个字符 |
| 括号中设置的是字符的个数,无关字符类型。但是不同种类的字符,占用的存储空间是不一样的。对于英文和数字,每个字符占一个字节长度。对于中文来讲,占用空间大小要考虑字符集。utf8,utf8mb4,每个中文,占3个字节长度。emoji字符,占4个字节长度。总长度不能超过数据类型的最大长度。 |
| |
| mysql> select length(n1),length(n2) from t2; |
| +------------+------------+ |
| | length(n1) | length(n2) | |
| +------------+------------+ |
| | 10 | 10 | |
| | 10 | 10 | |
| | 30 | 10 | |
| +------------+------------+ |
| |
| 三、enum('bj','tj','sh'): |
| 枚举类型,比较适合于将来此列的值是固定范围内的特点,可以使用enum,可以很大程度的优化我们的索引结构。下标索引。 |
| 说明:字符串类型 |
| 作用: |
| 例如: |
| id telnum name 身份 省 |
| 1 155****8909 xiaowu 3713**** 山东省 |

列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
unique key :唯一键
列值不能重复
unsigned :无符号
针对数字列,非负数。
其他属性:
key :索引
可以在某列上建立索引,来优化查询
| DATETIME (占用8个字节) |
| 范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。 |
| TIMESTAMP (占用四个字节) |
| 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。 |
| timestamp会受到时区的影响 |
| 约束(一般建表时添加): |
| |
| 1、primary key(PK) :主键约束 |
| 设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。 |
| |
| 2、not null :非空约束 |
| 列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0 |
| |
| 3、unique key :唯一约束 |
| 列值不能重复 |
| |
| 4、unsigned :无符号 |
| 针对数字列,非负数。 |
| 1、key :索引 |
| 可以在某列上建立索引,来优化查询,一般是根据需要后添加 |
| |
| 2、default :默认值 |
| 列中,没有录入值时,会自动使用default的值填充 |
| |
| 3、auto_increment :自增长 |
| 针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量) |
| |
| 4、comment : 注释 |
| 1、存储引擎:ENGINE |
| InnoDB(默认的) |
| 2、字符集和排序规则: CHARSET |
| utf8 |
| utf8mb4 |