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
posted @ 2021-10-20 16:35  JasonJi  阅读(500)  评论(0编辑  收藏  举报