mysql入門筆記-2

數據類型

數值類型

類型 大小 範圍(有符號) 範圍(無符號) 用途
TINYINT 1 字節 (-128,127) (0,255) 小整數值
SMALLINT 2 字節 (-32 768,32 767) (0,65 535) 大整數值
MEDIUMINT 3 字節 (-8 388 608,8 388 607) (0,16 777 215) 大整數值
INT或INTEGER 4 字節 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數值
BIGINT 8 字節 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數值
FLOAT 4 字節 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 單精度 浮點數值
DOUBLE 8 字節 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 雙精度 浮點數值
DECIMAL 對DECIMAL(M,D) ,若是M>D,爲M+2不然爲D+2 依賴於M和D的值 依賴於M和D的值 小數值
unsigned 既爲非負數,用此類型能夠增長數據長度!	例如 num1 unsigned
unsigned 屬性只針對整型,而binary屬性只用於char 和varchar
整型字段有個ZEROFILL屬性,在數字長度不夠的數據前面填充0,以達到設定的長度。
column_name  DECIMAL(P,D);
P是表示有效數字數的精度。 P範圍爲1〜65。D是表示小數點後的位數。 D的範圍是0~30。MySQL要求D小於或等於(<=)P。
DECIMAL(P,D)表示列能夠存儲D位小數的P位數。十進制列的實際範圍取決於精度和刻度。

日期和時間類型

類型 大小 (字節) 範圍 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 時間值或持續時間
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4 1970-01-01 00:00:00/2038結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和時間值,時間戳
注意區分 '0' (字符串) 和 0 (數字)。
'0' 表示的YEAR值是2000,
0 表示的YEAR值是0000。
# 設置d字段的數據類型爲DATE
CREATE TABLE my_date (d DATE);
# 插入日期數據
INSERT INTO my_date VALUES('2020-01-21');
# 插入當前系統日期
INSERT INTO my_date VALUES(CURRENT_DATE);
# 插入當前系統日期和時間
INSERT INTO my_date VALUES(NOW());
#日期分隔符用-,時間分隔符用:,中間能夠用空格隔開

字符串類型

類型 大小 用途
CHAR 0-255字節 定長字符串
VARCHAR 0-65535 字節 變長字符串
TINYBLOB 0-255字節 不超過 255 個字符的二進制字符串
TINYTEXT 0-255字節 短文本字符串
BLOB 0-65 535字節 二進制形式的長文本數據
TEXT 0-65 535字節 長文本數據
MEDIUMBLOB 0-16 777 215字節 二進制形式的中等長度文本數據
MEDIUMTEXT 0-16 777 215字節 中等長度文本數據
LONGBLOB 0-4 294 967 295字節 二進制形式的極大文本數據
LONGTEXT 0-4 294 967 295字節 極大文本數據

ENUM類型:枚舉類型

ENUM('值1', '值2', '值3', …, '值n')
#案例
#插入gender性別,只能是男女
CREATE TABLE my_enum (gender ENUM('male', 'female'));

約束

非空約束

#添加非空約束
ALTER TABLE yue_shu MODIFY age INT NOT NULL;

默認約束

#添加默認約束
ALTER TABLE yue_shu MODIFY id INT DEFAULT 18;

惟一約束

#惟一約束
#保證數據表中字段的惟一性,即表中字段的值不能重複出現
#添加惟一約束
ALTER TABLE yue_shu add UNIQUE(id);
#刪除惟一約束
ALTER TABLE yue_shu DROP INDEX id;
#查看惟一性約束
show keys from yue_shu;
#複合惟一約束	刪除同上面同樣
#只有當兩個字段同時發生重複時,插入記錄失敗
ALTER TABLE yue_shu add UNIQUE(id,name);

主鍵約束

#主鍵約束至關於惟一約束和非空約束的組合,
#要求被約束字段不容許重複,
#也不容許出現NULL值,
#每一個表最多隻容許含有一個主鍵。
#主鍵約束
#添加主鍵約束
ALTER TABLE yue_shu MODIFY id int PRIMARY KEY;
#刪除主鍵約束
ALTER TABLE yue_shu DROP PRIMARY KEY;

自動增加

#字段名 數據類型 AUTO_INCREMENT
/*
一個表中只能有一個自動增加字段;
該字段的數據類型是整數類型;
必須定義爲鍵,如UNIQUE KEY、PRIMARY KEY
若爲自動增加字段插入NULL、0、DEFAULT或在插入時省略該字段,該字段就會使用自動增加值;
若插入的是一個具體值,則不會使用自動增加值。
自動增加值從1開始自增,每次加1。
若插入的值大於自動增加的值,則下次插入的自動增加值會自動使用最大值加1;
若插入的值小於自動增加值,則不會對自動增加值產生影響。
使用DELETE刪除記錄時,自動增加值不會減少或填補空缺。
自動增加刪除並從新添加後,自動增加的初始值會自動設爲該列現有的最大值加1。
在修改自動增加值時,修改的值若小於該列現有的最大值,則修改不會生效。
*/
#給表設置自動增加
ALTER TABLE yue_shu MODIFY id INT UNSIGNED UNIQUE AUTO_INCREMENT;
#刪除自動增加
ALTER TABLE yue_shu MODIFY id INT UNSIGNED;
#修改自動增加值
ALTER TABLE yue_shu AUTO_INCREMENT = 10;

查看錶結構

#查看錶結構
DESC yue_shu;

字符集校對集

# 建立數據庫,指定字符集爲utf8,使用默認校對集utf8_general_ci
CREATE DATABASE mydb_1 CHARACTER SET utf8;
# 建立數據庫,指定字符集爲utf8,校對集爲utf8_bin
CREATE DATABASE mydb_2 CHARACTER SET utf8 COLLATE utf8_bin;

複製表

#複製表結構    
create table new表 like old表
#複製表數據 
INSERT into new表 SELECT * FROM old表;
#去除重複數據   
select distinct 須要去重的字段名 from 表名;

排序-限量

排序

#排序查詢:asc爲正序,desc爲倒序
select * from student order by id desc ;
#多個字段排序
#先根據age進行排序,再根據id進行排序
select * from student order by age asc,id desc;
#中文排序convert(字段名 using gbk)
select * from student 
order by convert(name using gbk) asc;

限量

#限量,參數1是從下標幾開始,參數2是讀取幾行數據
select * from student order by id desc LIMIT 10,5;
#統計記錄數
SELECT COUNT(id) FROM student;

分組-聚合函數

根據年齡統計出人數

#2020年03月24日21:36:13      
#根據年齡統計出人數
#concat鏈接字符串 as重命名 where id不等於2的時候
SELECT CONCAT(age,'歲') as 年齡,
COUNT(1) as 人數 
FROM student_copy1
WHERE id<>2
GROUP BY age
ORDER BY 2 desc

根據班級進行分組,獲取每一個班最大的年齡

#根據班級進行分組,獲取每一個班最大的年齡
SELECT Class as 班級,
MAX(age) as 最大年齡
FROM student_copy1
GROUP BY Class
ORDER BY 2 DESC

多字段分組

#多字段分組
select Class as 班級,
CONCAT(age,'歲') as 年齡,
COUNT(1) as 人數 
FROM student_copy1  
GROUP BY Class,age
ORDER BY 3 desc

回溯統計

#回溯統計		----就是對統計的結果加起來
select CONCAT(s.age,'歲') as 年齡,
COUNT(1) as 人數 
FROM student_copy1 s 
GROUP BY s.age WITH ROLLUP;

統計篩選

#統計篩選		----也就是對分組完成的數據加條件
select CONCAT(age,'歲') as 年齡,
COUNT(1) as 人數 
FROM student_copy1  
GROUP BY age 
having 人數>6

運算統計

#求和統計
select CONCAT(age,'歲') as 年齡,
SUM(age) as 求和
FROM student_copy1
GROUP BY 1 


#平均值統計
select CONCAT(age,'歲') as 年齡,
AVG(age) as 求平均
FROM student_copy1
GROUP BY 1 


#求最大值統計
select CONCAT(age,'歲') as 年齡,
MAX(id) as 求最大值
FROM student_copy1
GROUP BY 1 


#求最小值統計
select CONCAT(age,'歲') as 年齡,
MIN(id) as 求最小值
FROM student_copy1
GROUP BY 1 

# GROUP_CONCAT 返回符合條件的參數字段值的鏈接字符串 也就是把全部能查找的數據都列出來
SELECT Class,
GROUP_CONCAT(name) as 所有數據
from student_copy1
GROUP BY Class 
ORDER BY RAND()

運算符

函數名 描述
CEIL(x) 返回大於等於x的最小整數
FLOOR(x) 返回小於等於x的最大整數
FORMAT(x,y) 返回小數點後保留y位的x(進行四捨五入)
ROUND(x[,y]) 計算離x最近的整數;若設置參數y,與FORMAT(x,y)功能相同
TRUNCATE(x,y) 返回小數點後保留y位的x(捨棄多餘小數位,不進行四捨五入)
ABS(x) 獲取x的絕對值
MOD(x,y) 求模運算,與x%y的功能相同
函數名 描述
PI() 計算圓周率
SQRT(x) 求x的平方根
POW(x,y) 冪運算函數,計算x的y次方,與POWER(x,y)功能相同
RAND() 默認返回0到1之間的隨機數,包括0和1
#獲取大於等於1且小於10的任意一個隨機整數
#floor表明取整數
SELECT FLOOR(1 + RAND() * (10 - 1));

比較運算符

運算符 示例
= 用於相等比較
<=> 能夠進行NULL值比較的相等運算符
> 表示大於比較
< 表示小於比較
>= 表示大於等於比較
<= 表示小於等於比較
<>、!= 表示不等於比較
BETWEEN…AND… 比較一個數據是否在指定的閉區間範圍內,若在則返回1,若不在 則返回0
運算符 示例
BETWEEN…AND… 比較一個數據是否在指定的閉區間範圍內,若在則返回1,若不在 則返回0
NOT BETWEEN…AND… 比較一個數據是否不在指定的閉區間範圍內,若不在則返回1,若 在則返回0
IS 比較一個數據是不是TRUE、FALSE或UNKNOWN,如果則返回1, 不然返回0
IS NOT 比較一個數據是否不是TRUE、 FALSE或UNKNOWN,若不是則返 回1,不然返回0
IS NULL 比較一個數據是不是NULL,如果則返回1,不然返回0
IS NOT NULL 比較一個數據是否不是NULL,若不是則返回1,不然返回0
LIKE '匹配模式' 獲取匹配到的數據
NOT LIKE '匹配模式' 獲取匹配不到的數據
函數名 描述
IN() 比較一個值是否在一組給定的集合內
NOT IN() 比較一個值是否不在一組給定的集合內
GREATEST() 返回最大的一個參數值,至少兩個參數
LEAST() 返回最小的一個參數值,至少兩個參數
ISNULL() 測試參數是否爲空
COALESCE() 返回第一個非空參數
INTERVAL() 返回小於第一個參數的參數索引
STRCMP() 比較兩個字符串

邏輯運算符

運算符 描述
AND或 && 邏輯與,操做數所有爲真,則結果爲1,不然爲0
OR或 || 邏輯或,操做數中只要有一個爲真,則結果爲1,不然爲0
NOT或 ! 邏輯非,操做數爲0,則結果爲1,操做數爲1,則結果爲0
XOR 邏輯異或,操做數一個爲真,一個爲假,則結果爲1;若操做數所有 爲真或所有爲假,則結果爲0

賦值運算符

MySQL中「=」是一個比較特殊的運算符,既能夠用於比較數據是否相等,又能夠表示賦值。所以,MySQL爲了不繫統分不清楚運算符「=」表示賦值仍是比較的含義,特地增長一個符號「:=」用於表示賦值運算mysql

位運算符

函數名 描述 示例
BIT_COUNT(N) 返回在參數N中設置的比特 位(二進制位爲1)的數量 SELECT BIT_COUNT(b'1011');結果爲3
BIT_AND() 按位返回與的結果 SELECT BIT_AND(b1) FROM btable; 結果爲0
BIT_OR() 按位返回或的結果 SELECT BIT_OR(b1) FROM btable;結果爲7
BIT_XOR() 按位返回異或的結果 SELECT BIT_XOR(b1) FROM btable; 結果爲5

運算符優先級

運算符優先級能夠理解爲運算符在一個表達式中參與運算的前後順序優先級別越高,則越早參與運算;優先級別越低,則越晚參與運算。sql

運算符
INTERVAL
BINARY、COLLATE
!
-(一元,負號)、~(一元,按位取反)
^
*、/、DIV、%、MOD
-(相減運算符號)、+
<<、>>
&
|
運算符
=(比較運算符)、<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP、IN
BETWEEN、CASE、WHEN、THEN、ELSE
NOT
AND、&&
XOR
OR、||
=(賦值運算符)、:=

多表操做

聯合查詢

若要對聯合查詢的記錄進行排序等操做,須要使用圓括號「()」包裹每個SELECT語句,在SELECT語句內或在聯合查詢的最後添加ORDER BY語句。而且若要排序生效,必須在ORDER BY後添加LIMIT限定聯合查詢排序的數量,一般推薦使用大於表記錄數的任意值。數據庫

#排序要加括號,而且加limit限定數量
(SELECT id, name
FROM student_copy2
ORDER BY id ASC
LIMIT 10)
#聯合查詢---默認爲去重複 ALL表明查詢所有
UNION ALL
(SELECT id, name
FROM student_copy3
ORDER BY id DESC
LIMIT 10);

鏈接查詢

交叉鏈接

交叉鏈接返回的結果是被鏈接的兩個表中全部數據行的笛卡爾積。
例如,商品分類表中有3個字段,4條記錄;商品表中有5個字段,10條商品信息,那麼交叉鏈接後的笛卡爾積就等於4*10條記錄數,每條記錄中含有3+5個字段。數據結構

#交叉鏈接查詢
SELECT *
FROM student_copy2
	CROSS JOIN student_copy3;
#CROSS JOIN用於鏈接兩個要查詢的表。
#經過該語句能夠查詢兩個表中全部的數據組合。

內鏈接

內鏈接是一種常見的鏈接查詢,它根據匹配條件返回第1個表與第2個表全部匹配成功的記錄。函數

#須要查找的,a是一張表,b是一張表
SELECT a.runoob_id, a.runoob_author, b.runoob_count
#在runoob_tbl中查找
FROM runoob_tbl a
	#INNER JOIN----鏈接 tcount_tbl並指這張表爲b ON能夠理解爲where當這兩個字段相等時
	INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;

外鏈接

左鏈接

它用於返回鏈接關鍵字(LEFT JOIN)左表中全部的記錄,以及右表中符合鏈接條件的記錄。測試

當左表的某行記錄在右表中沒有匹配的記錄時,右表中相關的記錄將設爲空值。code

#左鏈接	----根據左表查右表
SELECT a.runoob_id, a.runoob_author, b.runoob_count
FROM runoob_tbl a
	LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
右鏈接

它用於返回鏈接關鍵字(RIGHT JOIN)右表(主表)中全部的記錄,以及左表(從表)中符合鏈接條件的記錄。排序

當右表的某行記錄在左表中沒有匹配的記錄時,左表中相關的記錄將設爲空值。索引

#右鏈接	----根據右表查右表
SELECT a.runoob_id, a.runoob_author, b.runoob_count
FROM runoob_tbl a
	LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;

子查詢

在一個表表達中能夠調用另外一個表表達式,這個被調用的表表達式叫作子查詢(subquery),我麼也稱做子選擇(subselect)或內嵌選擇(inner select)。子查詢的結果傳遞給調用它的表表達式繼續處理。ci

#2020年04月02日22:59:19
#表子查詢實例
#獲取編號小於10的男性球員的號碼
SELECT playerno
FROM (
	#拿到全部編號小於10的的球員的編號和性別
	SELECT playerno, sex
	FROM players
	WHERE playerno < 10
) as players10
#對拿到的臨時表進行查詢當性別等於男
WHERE sex = 'M';
#行子查詢 select playerno 
#獲取和100號球員性別相同而且居住在同一城市的球員號碼。
SELECT playerno
FROM players
#對原表進行查詢當性別等於臨時表的性別城市等於臨時表的城市
WHERE (sex, town) = 
#先找到這個100號球員的性別和城市
(
	SELECT sex, town
	FROM players
	WHERE playerno = 100
);
#標量子查詢實例
#獲取和27號球員出生在同一年的球員的號碼
SELECT PLAYERNO
FROM players
#當年齡等於臨時表的年齡
WHERE YEAR(BIRTH_DATE) = (
		#獲取年齡
		SELECT year(BIRTH_DATE)
		FROM players
		#當編號等於27
		WHERE PLAYERNO = 27
	)
	#獲取編號除了27號球員的
	AND playerno <> 27;
	#列子查詢實例
	#獲取球員性別爲女的全部球員的球員號,名字及所在城市。
	/*
	IN:在指定項內,同 IN(項1,項2,…)。
    ANY:與比較操做符聯合使用,ANY關鍵字必須接在一個比較操做符的後面,表示與子查詢返回的任何值比較爲 TRUE ,則返回 TRUE 。
    SOME:ANY 的別名,較少使用。
    ALL:與比較操做符聯合使用,ALL關鍵字必須接在一個比較操做符的後面,表示與子查詢返回的全部值比較都爲 TRUE ,則返回 TRUE 。
	*/
	
	#展現球員號,姓名,城市當編號爲裏面的
SELECT PLAYERNO, name, TOWN
FROM players
WHERE PLAYERNO IN (
	#展現全部性別爲女的球員號
	SELECT PLAYERNO
	FROM players
	WHERE sex = 'F'
);
#獲取至少比同城的另外一球員年輕的全部球員的號碼,日期和居住城市。
SELECT playerno, birth_date, town
FROM players p1
WHERE birth_date > ANY (
	SELECT birth_date
	FROM players p2
	WHERE p1.town = p2.town
);
#獲取最老球員的號碼,名字及生日。(即出生日期數值小於或等於全部其它球員的球員)
SELECT playerno, name, birth_date
FROM players
WHERE birth_date <= ALL (
	SELECT birth_date
	FROM players
);

外鍵

外鍵定義

外鍵指的是在一個表中引用另外一個表中的一列或多列,被引用的列應該具備主鍵約束或惟一性約束,從而保證數據的一致性和完整性。

  • 被引用的表稱爲主表
  • 引用外鍵的表稱爲從表

添加外鍵約束

  • 建立數據表(CREATE TABLE),在相應的位置添加外鍵約束。
  • 修改數據結構(ALTER TABLE),在相應的位置添加外鍵約束。

ON DELETE與ON UPDATE參數

參數名稱 功能描述
RESTRICT 默認值。拒絕主表刪除或修改外鍵關聯字段
CASCADE 主表中刪除或更新記錄時,同時自動刪除或更新從表中對應的記錄
SET NULL 主表中刪除或更新記錄時,使用NULL值替換從表中對應的記錄。 (不適用於NOT NULL字段)
NO ACTION 與默認值RESTRICT相同,拒絕主表刪除或修改外鍵關聯字段
SET DEFAULT 設默認值,但InnoDB目前不支持

建立數據表時,添加外鍵約束

CREATE TABLE student3 (
	id int UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
	name varchar(32) COMMENT '姓名', 
    /*關鍵字CONSTRAINT用於定義外鍵約束的名稱,若是省略,MYSQL將會自動生成一個名字。,表示一致性,FOREIGN KEY表示是外鍵,(room_id)表示的是外鍵名稱列表,REFERENCES參考 room(id) room是主表,id是約束字段 on delete表明它的刪除權限,on update表明更新權限*/
	room_id int,
	CONSTRAINT fk_room FOREIGN KEY (room_id) REFERENCES room (id) ON DELETE RESTRICT ON UPDATE CASCADE
)

修改表結構時,添加外鍵約束

更新表時的外鍵語法

ALTER TABLE student3
	ADD CONSTRAINT fk_room FOREIGN KEY (room_id) REFERENCES room (id) ON DELETE RESTRICT ON UPDATE CASCADE;

MUL、PRI和UNI是什麼

  • 若是鍵是PRI,則列是主鍵或多列主鍵中的列之一。
  • 若是鍵是UNI,則該列是惟一索引的第一列。(惟一索引容許多個空值,但能夠經過檢查Null字段來判斷該列是否容許空。)
  • 若是鍵爲MUL,則該列是非惟一索引的第一列,其中容許在列中屢次出現給定值

關聯表操做

對於已創建外鍵約束的關聯數據表來講,若要對主表執行刪除操做,從表將按照其創建外鍵約束時設置的ON DELETE參數自動執行相應的操做。

刪除外鍵約束

ALTER TABLE student3 drop foreign key fk_room;
相關文章
相關標籤/搜索