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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM