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