SQL基础
SQL基础介绍
1、SQL介绍
结构化查询语言 #关系型数据库中通用的一类语言
5.7 以后符合SQL92严格模式
通过sql_mode参数来控制
2、常用SQL分类
DDL:Data Definition Language 数据定义语言(CREATE)
DCL:Data control Language 数据控制语言(GRANT,ROLLBACK,COMMIT)
DML:Data Manipulation Language 数据操作语言(INSERT,UPDATE,DELETE)
DQL:Data Query Language 数据查询语言(SELECT)
#DPL:事务处理语言(BEGIN TRANSACTION、COMMIT和ROLLBACK)
3、SQL的各种名词
1、sql_mode(SQL模式)
作用:规范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,
4、数据类型、表属性、字符集(charset)
1、 字符集(charset)和校对规则(collation)
1)字符集
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)
2)校对规则(排序规则)
每种字符集,有多种校对规则(排序规则)
mysql> show collation;
作用:
影响到排序的操作规则,大小写是否敏感。影像数据库中数据的排序。
2、 数据类型
1.作用
保证数据的准确性和标准性。
2. 种类
数值类型
常用的数值类型
类 | 类型 | 存储长度 | 二进制范围 | 十进制数字范围 |
---|---|---|---|---|
整数 | tinyint | 1B=8bit | 000000000~11111111 | 0255,-128127 |
整数 | int | 4B=32bit | 略 | 02^32-1,-2^312^31-1 |
整数 | bigint | 8B=64bit | 略 | 02^64-1,-2^632^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会受到时区的影响
二进制类型
json类型
{
id:101
name:xiaowu
}
3、表属性
1、 列属性
1)约束
约束(一般建表时添加):
1、primary key(PK) :主键约束
设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。
2、not null :非空约束
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
3、unique key :唯一约束
列值不能重复
4、unsigned :无符号
针对数字列,非负数。
2)其他属性
1、key :索引
可以在某列上建立索引,来优化查询,一般是根据需要后添加
2、default :默认值
列中,没有录入值时,会自动使用default的值填充
3、auto_increment :自增长
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
4、comment : 注释
2、表属性
1、存储引擎:ENGINE
InnoDB(默认的)
2、字符集和排序规则: CHARSET
utf8
utf8mb4