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