1、MySQL啟動和關閉
(安裝及配置請參照百度經驗,這里不再記錄。MySQL默認端口號:3306;默認數據類型格式:utf8)
法①:我的電腦→右擊→管理→服務和應用程序→選中MySQL→右擊→啟動 (關閉:選擇“關閉”)
法②:cmd→net start mysql (關閉:net stop mysql)
2、MySQL的登錄和退出
(在進入MySQL的DOS命令中,cls有清屏功能,登錄MySQL以后,該語句無法實現)
參數
詳細
描述
-D
--database=name
打開指定的數據庫
-V
--version
輸出版本信息并退出
-u
--user=name
用戶名
-P
--port=#
端口號
-p
--password[=name]
密碼
-h
--host=name
服務器
登錄:
a、輸入“mysql -uroot -p”,再按回車鍵。(root是絕對用戶)
b、在“Enter password:”后輸入密碼,再按回車鍵;若未設定密碼,直接按回車鍵
c、提示成功登錄MySQL,成功登陸后有“mysql>”標識
退出:
輸入“exit;”或“quit;”或“\q;”(“;”是MySQL語句中必須包含的結束標識符)
提示Bye,即表示退出MySQL
3、快捷輸入
按方向鍵“↑”、“↓”可以快速填充歷史輸入數據。
4、MySQL語句的規范
關鍵字與函數名稱全部大寫;
數據庫名稱、表名稱、字段名稱全部小寫;
SQL語句必須以分號結尾(若未填寫分號, 會有一個“->”的提示,表示期待一個結束的命令)。
5、MySQL常用命令
顯示當前服務器版本 SELECT VERSION();
顯示當前日期 SELECT NOW();
顯示當前用戶 SELECT USER();
SELECT 查詢表數據,SHOW 顯示有許多形式,提供信息數據庫、表、列,或狀態信息服務器。
6、數據庫的創建、查看、修改、刪除
("{}"為必選項,"[]"為可選項,"|"表示從中選擇)
創建:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name
查看(打開):
SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr]
修改:
ALTER {DATABASES | SCHEMAS} [db_name] [DEFAULT] CHARACTER SET [=] charset_name
刪除:
DROP {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
示例:
創建一個數據庫t1
查看數據庫t1
再次創建一個數據庫,命名t1,會有錯誤提示。這時忽略錯誤提示加入“IF NOT EXISTS”就不再提示錯誤,這時雖然沒有錯誤但是會出現警告
查看警告
創建數據類型為gbk格式的數據庫
修改數據庫t2的類型
刪除數據庫
(查看所有的數據庫SHOW DATABASES)
7、數據類型
數據類型是指列、存儲過程參數、表達式和局部變量的數據特征,它決定了數據的存儲格式,代表了不同的信息類型。
有符號型,數字的最高位用0和1表示±,無符號位沒有正負性,無符號型的大致是有符號型存儲的2倍。
1字節=8位(1B=1bit)
整型
數據類型
存儲范圍
字節
TINYINT
有符號型:-128127(-2^72^7 -1),無符號型0255(02^8 -1)
1
SMALLINT
有符號型:-215~215 -1,無符號型0~2^16 -1
2
MEDIUMINT
有符號型:-223~223 -1,無符號型0~2^24 -1
3
INT
有符號型:-231~231 -1,無符號型0~2^32 -1
4
BIGINT
有符號型:-263~263 -1,無符號型0~2^64 -1
8
浮點型
數據類型
存儲范圍
字節
FLOAT[(M,D)]
-3.402823466E+38~-1.175494351E-38、0和 1.175494351E-38 ~3.402823466E+38
4
DOUBLE[(M,D)]
-1.7976931348623157E+308-2.2250738585072014E-308、0和2.2250738585072014E-308 1.7976931348623157E+308
8
【注】M是數字總位數,D是小數點后面的位數。如果M和D被省略,根據硬件允許的限制來保值。單精度浮點數值精確到大約7位小數位。E+38 表示10^38
日期時間型
列類型
字節
存儲范圍
YEAR
1
YEAR[(2|4)] 缺省為4位格式,4位格式取值范圍為1901 - 2155,0000,2位格式取值范圍為70-69(1970-2069)
TIME
3
-838:59:59~838:59:59
DATE
3
1000-1-1~9999-12-31
DATETIME
8
日期時間, 1000-1-1 00:00:00~9999-12-31 23:59:59
TIMESTAMP
4
時間戳,1970-1-1 00:00~2037年的某個時刻
【注】實際開發中“日期時間型”用得比較少,因為考慮到跨時區的問題,一般會用數字類型取代
MySQL本身Y2K安全的,但是呈交給MySQL的輸入值可能不是。一個包含2位年份值的任何輸入是由二義性的,因為世紀是未知的。這樣的值必須被解釋成4位形式,因為MySQL內部使用4位存儲年份。
對于DATETIME, DATE, TIMESTAMP和YEAR類型,MySQL使用下列規則的解釋二義性的年份值:
-在范圍00-69的年值被變換到2000-2069。
-在范圍70-99的年值被變換到1970-1999。
記得這些規則僅僅提供對于你數據的含義的合理猜測。如果MySQL使用的啟發規則不產生正確的值,你應該提供無二義的包含4位年值的輸入。
字符型
列類型
存儲需求
CHAR(M)
(定長,不足用空格自動補全)M個字節,0<=M<=255
VARCHAR(M)
(變長,輸入多少就是多少)L+1個字節,其中L<=M,0<=M<=65535
TINYTEXT
L+1個字節,其中L<2^8 (1個字節表示最大存儲范圍,下同)
TEXT
L+2個字節,其中L<2^16
MEDIUMTEXT
L+3個字節,其中L<2^24
LONGTEXT
L+4個字節,其中L<2^32
ENUM('value1','value2',…)
(最終選擇其中的一個value)1或2個字節,取決于枚舉值的個數(最多65535個)
SET ('value1','value2',…)
(集合,可在其中做任意的排列組合)1、2、3、4或者8個字節,取決于set成員的數目(最多64個)
8、數據表操作
數據表(或稱:表)是數據庫中最重要的組成部分之一,是其他對象的基礎。
關系型數據表,是一張二維表格,所謂二維表格就具有行和列。行稱為記錄,列稱為字段。數據表是數據的載體。
打開數據庫
要想進行數據表相關的操作,必須要在一個數據庫中進行,那么就要打開一個數據庫
USE
顯示被打開的數據庫
創建數據表
CREATE TABLE [IF NOT EXISTS] table_name (column_name data_type,…)
column_name 列名稱 data_type數據類型
數據表有多少列一定是經過項目分析得到的,不是憑空想象而來的。
【注】UNSIGNED 無符號型,最后一個列不需要再用“,”隔開
查看數據表列表
SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr]
查看當前數據庫下的所數據列表
查看其它數據庫下的數據列表(但是實際上并沒有離開當前的數據庫)
查看數據表結構
SHOW COLUMNS FROM tbl_name
【注】 NULL 代表沒有值(空)。
9、記錄(行)操作
插入記錄(行)
INSERT [INTO] tbl_name [(col_name,…)] VALUES(val,…)
col_name:列名稱 (列名稱可以省略)VALUES:值
省略掉col_name后,就必須為所有的字段都賦值。字段不滿時會提示錯誤“列不匹配第一行數據”;
當指定列名稱后,就無需輸入所有字段。
顯示記錄(行)
SELECT expr,… FROM tbl_name
expr 表達式
“*”此時,表示篩選全字段,即查看所有記錄
空值與非空
NULL,字段值可以為空(NULL 和空格是兩碼事);
NOT NULL ,字段值禁止為空
NUL 字節與 NULL 值不同;NUL 為一個零值字節,而 NULL 代表沒有值(空)。
(系統默認可以為空,所以NULL可以不寫)
查看數據表結構,提示username不允許為空
若把name插入一個空值,系統會提示錯誤
10、約束初識(根據功能)
一般在列類型后添加約束字段
自動編號
AUTO_INCREMENT
必須與主鍵組合使用,默認情況下,起始值為1,每次的增量為1,從而可以保證數據的唯一性。
每次遞增1,說明是數值型,可以為整數,也可以為浮點數。若為浮點數,小數位數一定要為0。
(提示自動編號必須與主鍵一起使用)
主鍵約束(PRIMARY KEY)
每張數據表只能存在一個主鍵;
主鍵保證記錄的唯一性;
主鍵自動為NOT NULL;
自動編號必須與主鍵一起使用,但是主鍵不一定非要與自動編號一起使用。
創建一個帶有主鍵約束的數據表
(也可以直接輸入KEY,無需寫PRIMA)
輸入多個記錄后,再查看記錄,即可發現是自動編號的
唯一約束(UNIQUE KEY)
唯一約束可以保證記錄的唯一性
唯一約束的字段可以為空值(NULL);
每張數據表可以存在多個唯一約束。
【注】字段可以為空,表示兩條或兩條以上的記錄,這個字段都可以為空。但如果多個字段為空,那么就說明記錄是相同的,這與“保證記錄的唯一性”是背離的,所以只能有一個空值!
創建一個帶有主鍵約束和唯一約束的數據表
“username”插入相同的數據后,提示重復,即表示記錄是唯一的
默認約束
DEFAULT(默認值)
當插入記錄時,如果沒有明確為字段賦值,則自動賦予默認值。
創建一個帶有默認值的數據表
可以看到“sex”已經有了默認值
輸入username,不輸入sex的情況下,系統默認sex為3
11、約束(根據功能)
1.約束保證數據的完整性和一致性;
2.約束分為表級約束和列級約束。根據約束針對的字段多少決定的,如果約束只針對于某一字段來使用,
3.稱為列級約束;如果約束針對兩個或兩個以上的字段來使用,稱為表級約束。
約束按照類型(功能)劃分:
NOT NULL(非空約束)
PRIMARY KEY(主鍵約束)
UNIQUE KEY(唯一約束)
DEFAULT(默認約束)
FOREIGN KEY(外鍵約束)
外鍵約束
1.保證數據一致性,完整性;
2.實現一對一或一對多的關系;
3.外鍵約束的要求:
a.父表(子表參照的表)和子表(具有外鍵列的表)必須使用相同的存儲引擎,而且禁止使用臨時表;
b.數據表的存儲引擎只能為INNODB;
c.外鍵列(加過FOREIGN KEY的列)和參照列(外鍵列參照的列)必須具有相似的數據類型,其中數字的長度、是否有符號位必須相同;而字符的長度可以不同;
d.外鍵列和參照列必須創建索引,如果外鍵列不存在索引的話,MySQL將自動創建索引(參照列沒有索引,MySQL自動創建;外鍵列沒有索引,MySQL不會創建)。
編輯數據表的默認存儲引擎
MySQL配置文件
default-storage-engine=INNODB
創建一個數據表,默認存儲引擎為InnoDB
再次創建一個數據表,但外鍵列(pid)和參照列(id)的數據類型不一致,所以提示“無法添加外鍵約束”foreign key constraint(外鍵約束)
外鍵列(外鍵:pid)和參照列(主鍵:id)的數據類型一致時,查看參照列數據表索引,可以查到參照列id已經有索引
查看外鍵列數據表的索引,可以看到id和pid均有索引
顯示users數據表結構,可以看到
12、外鍵約束的參照操作
1.CASCADE:從父表刪除或更新記錄時,同時自動刪除或更新子表中匹配的行
2.SET NULL:從父表刪除或更新行,并設置子表中的外鍵列為NULL。如果使用該選項,必須保證子表列沒有指定NOT NULL
3.RESTRICT:拒絕對父表的刪除或更新操作
4.NO ACTION:標準SQL的關鍵字,在MySQL中與RESTRICT相同
進行了外鍵約束的創建以后,在更新表時,子表是否也進行相應的操作
CASCADE
要更新相應的行,必須要先存在記錄,所以要分別在兩張表中插入記錄。在插入記錄時,一定要先插入主表(province)中的記錄,在插入次表(user1)中的記錄,因為次表是要參照主表的,所以一定要遵循先后順序。
給主表插入數據
給子表插入數據
(為什么“id”不是“123”而是“134”——雖然('jack',7)記錄沒有寫入成功,但是編號已經遞增了1,所以編號變成了“134”。)
刪除主表中的一條記錄,子表相應的記錄也會刪除
只有數據表的存儲引擎為INnoDB的類型時,我們才能使用外鍵約束,如果是其他類型我們也想使用的話,就不能定義物理外鍵,要定義邏輯外鍵(那么我們在定義兩張表結構的時候,按照存在的某種結構去定義,但是不去使用“FOREIGN KEY”這個關鍵詞)。
13、表級約束與列級約束(根據操作數目)
對一個數據列建立的約束,稱為列級約束。
對多個數據列建立的約束,稱為表級約束。
列級約束既可以在列定義時聲明,也可以在列定以后聲明;表級約束只能在列定義后聲明。
NOT NULL ,DEFAULT就不存在表級約束
列級約束
14、修改數據表
添加單列
ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
FIRST:所添加的列放在首列;
AFTER col_name:放所添加的列在某列之后。
不加 [FIRST | AFTER col_name]所添加的列在所有列的最后面。
添加單列,所有的列不需要加入小括號,可以指定位置關系
添加多列
ALTERTABLE tbl_name ADD [COLUMN] (col_name column_definition,…)
添加單列,所有的列需要加入小括號,不可以指定位置關系,添加后就在原來列的后方
刪除列
ALTER TABLE tbl_name DROP [COLUMN] col_name
也可以讓刪除、添加列同時進行~
添加主鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,…)
添加唯一約束
創建的時候約束寫在列名稱、類型之后,添加的時候約束卸載列名稱、類型之前
唯一約束可以有多個,主鍵約束只能有一個
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY] [index_name] [index_type] (index_col_name,…)
添加外鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,…) reference_defintion
添加/刪除默認約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
15、修改數據表
刪除主鍵約束
ALTER TABLE tbl_name DROP PRIMARY KEY
刪除唯一約束
ALTER TABLE tbl_name DROP {INDEX | KEY} index_name
查看索引 ,確定唯一約束名稱
刪除唯一約束,查看索引,已經刪除
刪除外鍵約束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
查看外鍵約束名稱
刪除外鍵約束后,可以查看已刪除
修改列定義
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
把“age”放在數據表的第一列
修改類型
(有大類型改成小類型,可能會導致數據丟失)
修改列名稱
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER] col_name
修改列名稱、定義
修改數據表名稱
法①
ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name
法②(可為多張數據表更名)
RENAME TABLE tbl_name TO new_tabl_name [, tbl_name2 TO new_tbl_name2] …
法①
法②:
【注】以后盡量少使用數據列、數據表修改,假如表名、列名被引用的話,修改之后可能會導致某些視圖或過程無法正常的工作
16、操作數據表
插入記錄1(行)
INSERT [INTO] tbl_name [(col_name,…)] {VALUES | VALUE} ({exper | DEFAULT},…),(…),…
如果列名稱(col_name)省略掉的話,所有的字段都需要賦值,每個字段之間要用逗號分隔,否則將出現錯誤。
為默認的自動編號的字段賦值,可以寫入空值(NULL)或者默認值(DDEFAULT),仍然遵守默認遞增的形式
也可插入表達式
[圖片上傳中。。。(63)]
如表格中某個字段是默認值(這里是age),當該字段插入“DEFAULT”時,將自動賦值默認值
一次性插入多條記錄(md5哈希值)
[圖片上傳中。。。(65)]
插入記錄2(set語句)
INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},…
與上一種的區別在于,此方法可以使用子查詢(SubQuery),這個一次性只能插入一條記錄
插入記(SELECT語句)
INSERT [INTO] tbl_name [(col_name,…)] SELECT …
此方法可以將查詢結果插入到指定數據表
單表更新記錄(UPDATE)
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]… [WHERE whre_condition]
如果省略where條件,修改列中的所有的記錄都將更新
可以同時修改多列
增加條件語句,只會修改對應的記錄(id%2=0:表示偶數,除以2的余數為0)
單表刪除記錄
DELETE FROM tbl_name [WHERE where_condition]
刪除記錄,再次插入,此編號為原來所有記錄編號+1
查詢表達式解析、查找記錄
SELECT select_expr [,select_expr …]
[
FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | position} [ASC | DESC],…]
[HAVING where_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC], …]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
]
每一個表達式表示想要的一列,必須至少有一個;
多個列之間以英文逗號分隔;
星號()表示所有列,tbl_name.可以表示命名表的所有列;
查詢表達式可以使用[AS] alias_name為其賦予別名;
別名可用于GROUP BY ,ORDRE BY或HAVING子句。
只查詢數據表中的部分記錄
查詢表達式的順序可以和原數據表中字段的順序不一致
(SELECT查詢表達式的順序將影響著結果的順序)
在使用多表連接的時候,存在兩張不同的表存在相同的字段,如果致謝字段名的話就分不清這個字段到底屬于哪張數據表,tbl_name.col_name可以清晰地分辨出這個字段屬于哪張數據表
查詢數據表并賦予別名
(字段的別名也會影響結果集當中的字段的別名)
[圖片上傳中。。。(75)]
AS可以省略,但最好寫下,因為當別名和數據表中真實存在的字段一致的情況下,它指的就是別名,而不是這個字段。
條件表達式
對記錄進行過濾,如果沒有指定WHERE子句,則顯示所有記錄。
在WHERE表達式中,可以使用MySQL支持的函數或運算符。
17、查詢結果
查詢結果分組
[GROUP BY {col_name | position} [ASC | DESC],…]
分組的時候既可以指定列的列名,也可以指定列的位置。ASC 升序(默認),DESC降序。多個分組條件之間要用逗號進行分割,
按照性別對所有記錄進行分組
SELECT語句中第一個出現的字段,建議不要指定位置
分組條件
[HAVING where_condition]
分組可以對全部記錄進行分組,也可以對指定記錄進行分組。在指定HAVING分組條件的時候,一定要保證分組的條件要么為一個聚合函數(只有一個返回結果的函數),要么抱著這個字段必須出現在當前的SELECT語句中,否則會出現錯誤
[圖片上傳中。。。(79)]
分組結果進行排序
[ORDER BY {col_name | expr | position} [ASC | DESC],…]
可以按某一個字段排序,也可以按位置進行排序
也可以多個字段進行排序,如果第1個字段沒有排列出自己想要的結果,那就會一次進行第2個、3個依次類推。
age升序排列(默認),相同的age記錄根據id降序進行排列
限制分組結果返回的數量
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
查詢結果,顯示兩條記錄(從第一條記錄開始計數)
[圖片上傳中。。。(82)]
SELECT語句記錄是從0開始編號,若想顯示編號“3、4”則輸入“2,2”
id號和結果集中排列順序沒有任何關系,只要排在結果集中第一個位置,那么就是0(offset偏移值)。不管它ID是多少
[圖片上傳中。。。(84)]
INSERT SELECT 將查詢的結果插入到數據表
[圖片上傳中。。。(85)]
18、SELECT子查詢
記錄的寫操作:INSERT(增)、DELETE(刪)、UPDATE(改)
記錄的讀取操作:SELECT(查)
出現亂碼時要使用gbk的形式,而不是utf8的形式。
在客戶端以gbk的形式顯示數據,但是它不影響數據表中的數據類型,僅僅改變的顯示的類型
SET NAMES gbk;
子查詢概述
子查詢(Subquery)是指出現在其他SQL語句內的SELECT子句。子查詢指嵌套在查詢內部,切必須始終出現在圓括號內。子查詢可以包含多個關鍵字或條件,如:
DISTINCT、GROUP BY、ORDER BY、LIMIT、函數等
子查詢的外層查詢可以是:SELECT,INSERT,UPDATE,SET或DO
示例:
SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2);
其中SELECT * FROM t1,稱為Out Query/Out Statement (外層查詢/外層聲明)
SELECT col2 FROM t2,稱為Subquery
在外層查詢中可以發現,其中的增、刪、改、查都可以帶有子查詢,這里的查詢指的是已知的所有SQL命令的統稱
子查詢的結果可以是標量、一行、一列或子查詢,結果可以被其他SQL語句所使用
使用比較運算符的子查詢
使用比較運算符
=、>、<、>=、<=、<>、!=、<=>
語法結構
operand comparison_operator subquery
SELECT AVG (col_name) FROM tbl_name;
查找數據表中某列的平均值
[圖片上傳中。。。(86)]
對平均值四舍五入,并保留小數點后的2位
[圖片上傳中。。。(87)]
查詢本表中哪些商品的價格超過5636.36
SELECT goods_id,goods_name,goods_price FROM tdb_goods FROM tdb_goods WHERE goods_price >= 5636.36;
通過子查詢
SELECT goods_id,goods_name,goods_price FROM tdb_goods FROM tdb_goods WHERE goods_price >= (SELECT ROUND (AVG(goods_price),2) FROM tdb_goods);
查詢某個數據的一個屬性
查詢所有超極本的數量
SELECT goods_price FROM tdb_goods WHERE goods_cate ='超極本'
[圖片上傳中。。。(88)]
用ANY、SOME或ALL修飾的比較運算符
operand comparison_operator ANY (subquery) 滿足其中一個就可以
operand comparison_operator SOME (subquery) 滿足其中一個就可以
operand comparison_operator ALL (subquery) 滿足所有才可以
使用ANY、SOME、ALL關鍵字的返回值
ANY
SOME
ALL
、>=
最小值
最小值
最大值
<、<=
最大值
最大值
最小值
=
任意值
任意值
<>、!=
任意值
查詢哪些商品的的價格超過超極本的價格
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > ANY (SELECT goods_price FROM tdb_goods WHERE goods_cate ='超極本');
[NOT] IN 子查詢
operand comparison_operator [NOT] IN (subquery)
=ANY運算符與IN等效;
!=ALL或<>ALL運符與NOT IN等效
[NOT] EXISTS子查詢
如果子查詢返回任何行,EXISTS將返回TRUE;否則為FALSE。
將查詢結果寫入數據表
INSERT [INTO] tbl_name [(col_name,…)] SELECT …
(查詢列結構 DESC tbl_name)
示例~
查詢結果:
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
將查詢結果寫入數據表:
INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
19、多表更新
參照另外的表更新本標的記錄
UPDATE table_references SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]…[WHEREwhere_condition]
語法結構
table_reference
{[INSERT | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
table_REFERENCE
ON conditional_expr
連接類型
INNER JOIN,內連接
在MySQL中,JOIN、CROSS JOIN和INNER JOIN是等價的
LEFT [OUTER] JOIN,左外連接
RIGHT [OUTER] JOIN,右外鏈接
示例:
UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate =cate_name SET goods_cate = cate_id;
CREATE…SELECT
創建數據表同時將查詢結果寫入到數據表
CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition,…)] select_statement
[圖片上傳中。。。(89)]
當兩個數據表格都有相同的列時,更新此列的數據要給表格設置別名
UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name SET g.brand_name = b.brand_id
但是原來的數據表結構無法改變
[圖片上傳中。。。(90)]
20、連接
MySQL在SELECT語句、多表更新、奪標刪除語句中支持JOIN操作。
table_reference {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN} tabl_reference ON conditional_expr
兩張表之間的連接,連接類型有:內連接、左外連接、有外鏈接,ON 后面跟的是連接條件
數據表參照
table_reference tbl_name [ [AS] alias ] | table_subquery [AS] alias
數據表可以使用tbl_name AS alias_name 或 tbl_name alias_name 賦予別名,table_subquery可以作為子查詢使用在FROM子句中,這樣的子查詢必須為其賦予別名。
連接條件
使用ON關鍵字來設定連接條件,頁可以使用WHERE來代替,通常使用ON關鍵字來設定連接條件,使用WHERE關鍵字進行結果集記錄的過濾。
連接類型
內連接
INNER JOIN,內連接(在MySQL中,JOIN,CROSS JOIN 和 INNER JOIN 是等價的)
僅顯示同時符合左、右兩表之間連接條件的記錄
示例:
SELECT goods_id,goods_name,cate_name FROm tdb_goods INNER JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;
左外連接
LEFT [OUTER] JOIN ,左外連接
顯示坐標全部的記錄及右表符合連接條件的記錄
示例:
SELECT goods_id,goods_name,cate_name FROm tdb_goods LEFT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;
右外連接
RIGHT [OUTER] JOIN,右外連接
顯示坐標全部的記錄及左表符合連接條件的記錄
示例:
SELECT goods_id,goods_name,cate_name FROm tdb_goods RIGHT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;
多表連接
示例:
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id;
連接說明
外連接
A LEFT JOIN B join_condition
數據表B的結果集依賴數據表A;
數據表A的結果集根據左鏈接條件依賴所有數據表
20、無限級分類表設計
無限級分類一般包括:分類的ID、分類的名稱、父類的ID
查找無限分類的數據表就需要進行自身連接
示例,一張無限分類的數據表
[圖片上傳中。。。(91)]
自身連接
同一個數據表對其自身進行連接
【注】若一字表做自身連接一定要給表取一個別名
示例:參照子表 (左邊是父表,右邊是字表子表)
SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;
[圖片上傳中。。。(92)]
示例:參照父表 (左邊是子表,右邊是字表父表)
SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id;
[圖片上傳中。。。(93)]
示例:參照子表并分組按照順序排列
SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id;
[圖片上傳中。。。(94)]
顯示子類數量
SELECT p.type_id,p.type_name,count (s.type_name)child_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id;
[圖片上傳中。。。(95)]
多表刪除
DELETE tbl_name[.] [,tbl_name[.]]… FROM table_references [WHERE where_condition]
要先查找
【查找具有兩條及兩條以上記錄的數據:
DELETE tbl_name[.] [,tbl_name[.]]… FROM table_references GROUP BY tbl_name[.*] HAVING count ()】having引用