MySQL(Structured Query Language)基礎(chǔ)篇

1. 創(chuàng)建數(shù)據(jù)庫與數(shù)據(jù)庫的操作

語句 說明
CREATE DATABASE database_name; 創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE IF NOT EXISTS database_name; 判斷數(shù)據(jù)庫是否存在颜及,不存在則創(chuàng)建,存在則不創(chuàng)建
CREATE DATABASE database_name charset=utf8; 創(chuàng)建數(shù)據(jù)庫焰络,并制定字符集
show databases; 顯示所有的數(shù)據(jù)庫
USE database_name; 選擇數(shù)據(jù)庫
SELECT database; 顯示當(dāng)前的數(shù)據(jù)庫
SHOW VARIABLES LIKE "character_set_database"; 查看當(dāng)前數(shù)據(jù)庫的編碼格式
ALTER DATABASE database_name charset=utf8; 修改數(shù)據(jù)庫的字符集
DROP DATABASE database_name; 刪除數(shù)據(jù)庫
DROP DATABASE IF NOT EXISTS database_name; 判斷數(shù)據(jù)庫是否存在后刪除數(shù)據(jù)庫愉老。

2.數(shù)據(jù)庫的儲存引擎 和 數(shù)據(jù)類型

語句 說明
SHOW ENGINES; 查看所有的儲存引擎
SHOW VARIABLES LIKE 'default_storage_engine'; 查看默認(rèn)的SQL儲存引擎
SET default_storage_engine=INNODB; 修改默認(rèn)的額儲存引擎
儲存引擎的類型
數(shù)字?jǐn)?shù)據(jù)類型
文本數(shù)據(jù)類型
日期的數(shù)據(jù)類型

3.數(shù)據(jù)庫中的表的操作

CREATE TABLE IF NOT EXISTS table_name(id INT NOT NULL AUTO_INCREMENT,name CHAR(10) NOT NULL,PRIMARY KEY(id));
創(chuàng)建的表 并蝗,設(shè)置數(shù)據(jù)類型句携,限制宏怔,AUTO_INCREMENT 設(shè)置自增長 鹃唯,PRIMARY KEY() 指定主鍵,主鍵是唯一的阵幸,是表中每一行的唯一標(biāo)示

語句 說明
SHOW TABLES 查看表
SHOW CREATE TABLE table_name 查看表詳細(xì)信息
DESC table_name 查看表的結(jié)構(gòu)
DESC 數(shù)據(jù)表名 列名 查看某一列的信息
CREATE TABLE students( stu_id int NOT NULL AUTO_INCREMENT, birthday date NOT NULL, address varchar(50) NOT NULL *__DEFAULT “山西長治”__*, PRIMARY_KEY(stu_id) ); 設(shè)置默認(rèn)值
ALTER ATBLE table_name ADD age int DEFAULT 0 添加新字段(列)
ALTER ATBLE students ADD( gender int default 0, phonenum int(11) ); 添加多個新字段花履,用逗號分隔
ALTER TABLE 表名 CHANGE 字段名 新字段名 數(shù)據(jù)類型; 修改字段名(列)
ALTER TABLE 表名 DROP 字段名; 刪除字段名
ALTER TABLE 表名稱 ALTER column 要修改的字段名 SET DEFAULT 修改為的默認(rèn)值; 修改默認(rèn)值
ALTER TABLE 表明 ALTER column 要刪除的字段名 DROP DEFAULT; 刪除默認(rèn)值
重命名表
RENAME TABLE 數(shù)據(jù)表名1 To 數(shù)據(jù)表名2 1
ALTER TABLE oldtable RENAME AS newtable; 2
刪除表
DROP TABLE [IF EXISTS] 數(shù)據(jù)表名; 刪除表
復(fù)制表(結(jié)構(gòu))
CREATE TABEL IF NOT EXISTS 表名 LIKE 源表名; 復(fù)制表(復(fù)制表結(jié)構(gòu))

4. 表內(nèi)容的操作

CREATE TABLE customers ( userid int NOT NULL AUTO_INCREMENT, name char(50) NOT NULL, address char(200) NOT NULL, email char(50) NOT NULL, PRIMARY KEY(userid) ); 創(chuàng)建一個表

語句 說明
INSERT INTO customers values(10010,'李同學(xué)','北京市朝陽區(qū)','1234567@qq.com') 插入完整的行(表中的所有字段必須全部插入)
SELECT * FROM customers; 查詢以插入的內(nèi)容
INSERT INTO customers(userid,name,adress,email) values('10011','黃同學(xué)','北京市通州區(qū)','1234789@qq.com') 根據(jù)列插入內(nèi)容(沒有設(shè)置默認(rèn)值和設(shè)置為空的字段芽世,必須放在字段中)
INSERT INTO customers(userid,name,adress,email) values ('10011','黃同學(xué)','北京市通州區(qū)','1234789@qq.com'), ('10012','黃同學(xué)','北京市通州區(qū)','1234789@qq.com'), ('10013','黃同學(xué)','北京市通州區(qū)','1234789@qq.com'); 多行插入(用“,”逗號隔開)
將一個表的內(nèi)容插入到另一個表中
INSERT INTO 表名稱1 (字段名…) SELECT 字段名… from 表名稱2 將表2的數(shù)據(jù)內(nèi)容插入表1中(插入的內(nèi)容必須一一的對應(yīng))
INSERT INTO customer1 (userid,name,address,email) SELECT userid,name,address,email FROM customer; `
刪除數(shù)據(jù)
1) DELETE FROM customers WHERE userid=10010; 從表中刪除指定的行(where 后面指定要刪除的行)
2)DELETE FROM 表名稱; 從表中刪除所有的行

修改(更新)數(shù)據(jù)

  1. 修改(更新)指定行
    UPDATE 表名 SET 字段名=修改為的內(nèi)容 WHERE 指定的主鍵;
    eg: UPDATE customers SET email='1234@sina.com' WHERE userid=10010;
    2)修改對應(yīng)字段的所有值:
    UPDATE customers SET gender=1;
    3)修改(更新)多個列`
    UPDATE customers SET email='123@sian.com',name='劉先生' WHERE userid=10013;

5.mySQL檢索數(shù)據(jù)

語句 說明
SELECT 列名 FROM 表名; 檢索單個列
SELECT DISTINCT 列名 FROM 表名; 檢索不同的列
SELECT * FROM 表名; 檢索全部內(nèi)容
SELECT 列名,列名,…,列名 FROM 表名; 檢索多個列
SELECT 表名.列名 FROM 表名; 完全限制表名
SELECT 表名.列 FROM 數(shù)據(jù)庫.表; 完全限制表名(可以選擇不先選擇數(shù)據(jù)庫)

6.表數(shù)據(jù)的查詢where(過濾)

語句 說明
where 的句子的一般形式: SELECT 字段名 FROM 表名 WHERE 條件;
= 等于 select name from customers where name='李逵';
<> 不等于 select name from customers where name<>'李逵';
!= 不等于 select name from customers where name!='李逵';
< 小于 (一般情況下后面會跟數(shù)字) select name from customers where name<'李逵'; select name from customers where name<'李逵';
<= 小于等于 select * from customers where userid<=10014;
> 大于 select * from customers where userid>10014;
>= 大于等于 select * from customers where userid>=10014;
BETWEEN .. AND ..在指定的兩個值之間 select name from customers where userid between 10010 and 10014; 注意:在使用BETWEEN時诡壁,必須指定兩個值,所需范圍的低端值和高端值济瓢。這兩個值必須用AND關(guān)鍵字分隔。BETWEEN匹配范圍中所有的值妹卿,包括指定的開始值和結(jié)束值.
空值檢查(IS NULL)
一般格式 SELECT 列 FROM students WHERE 列 IS NULL;
例子 SELECT name from customers WHERE age is NULL;
AND 操作符
一般格式: SELECT 列,列 FROM students WHERE 條件1 and 條件2;
eg: SELECT name,adress FROM customers WHERE userid<=10015 AND adress='北京市';
OR操作符
一般格式: SELECT 列,列 FROM students WHERE 條件1 OR 條件2;
eg: SELECT * FROM customers WHERE userid<100 or age >19;
IN操作符 相當(dāng)于多個or連在一起旺矾,包含其中的一個即可
一般格式: SELECT 列 FROM 表名 WHERE 列 IN(列值,列值);
eg: SELECT name FROM customers WHERE userid IN(10011,10013);
NOT操作符 否定它之后所跟的任何條件(可以和其他的進(jìn)行配合)
eg: SELECT name FROM customers WHERE userid NOT IN(10011,10013);

7.通配符查詢(過濾)

符號 說明
%(百分號) %表示任何字符出現(xiàn)任意次數(shù)
% SELECT name FROM students WHERE name like “李%”
_(下劃線) 下劃線只匹配任意的單個字符
_ SELECT name FROM customers WHERE name LIKE "李_";

通配符搜索的處理一般要比前面討論的其他搜索所花時間更長,所以一般不是很推薦使用通配符

8.正則表達(dá)式

正則表達(dá)式的匹配規(guī)則如下:

正則表達(dá)式的匹配

python中使用正則表達(dá)式(導(dǎo)入python下的re模塊)

  1. match函數(shù)處理
    match 方法用于查找字符串的頭部(也可以指定起始位置)纽帖,它是一次匹配宠漩,只要找到了一個匹配的結(jié)果就返回,而不是查找所有匹配的結(jié)果懊直。它的一般使用形式如下:
    當(dāng)匹配成功時,返回一個 Match 對象火鼻,如果沒有匹配上室囊,則返回 None。
import re
使用match方法進(jìn)行匹配操作
result = re.match(正則表達(dá)式,要匹配的字符串)
如果上一步匹配到數(shù)據(jù)的話魁索,可以使用group方法來提取數(shù)據(jù)
result.group()  提取match函數(shù)得到的值

2..search函數(shù)的處理
earch 方法用于查找字符串的任何位置融撞,它也是一次匹配,只要找到了一個匹配的結(jié)果就返回粗蔚,而不是查找所有匹配的結(jié)果尝偎,它的一般使用形式如下:
當(dāng)匹配成功時,返回一個 Match 對象鹏控,如果沒有匹配上致扯,則返回 None。

3..findall函數(shù)的處理
上面的 match 和 search 方法都是一次匹配当辐,只要找到了一個匹配的結(jié)果就返回抖僵。然而,在大多數(shù)時候缘揪,我們需要搜索整個字符串耍群,獲得所有匹配的結(jié)果。
findall 方法的使用形式如下:
findall 以列表形式返回全部能匹配的子串找筝,如果沒有匹配蹈垢,則返回一個空列表。
4.sub函數(shù)的處理
sub方法用于替換
ret = re.sub(r"\d+", '998', "python = 997") 袖裕,要替換的內(nèi)容曹抬,替換為,被替換的內(nèi)容
5.split函數(shù)的處理
根據(jù)匹配進(jìn)行切割字符串陆赋,并返回一個列表
ret = re.split(',','你是一頭豬嗎沐祷?Are you a pig,please tell me.'); 用來切割的字符嚷闭,要被切割的語句
結(jié)果:["你是一頭豬嗎?Are you a pig:","please tell me."]
6.finditer函數(shù)的處理
finditer方法的行為跟 findall 的行為類似赖临,也是搜索整個字符串胞锰,獲得所有匹配的結(jié)果。但它返回一個順序訪問每一個匹配結(jié)果(Match 對象)的迭代

貪婪和非貪婪

Python里數(shù)量詞默認(rèn)是貪婪的(在少數(shù)語言里也可能是默認(rèn)非貪婪)兢榨,總是嘗試匹配盡可能多的字符嗅榕;
非貪婪則相反,總是嘗試匹配盡可能少的字符吵聪。
*? 重復(fù)任意次凌那,但盡可能少重復(fù)
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
?? 重復(fù)0次或1次吟逝,但盡可能少重復(fù)

9.mysql的正則匹配

select * from studentinfo where student_name regexp '^牛';
SELECT name,email FROM studentinfo WHERE email REGEXP '.'; python中匹配一些特殊的字符的時候帽蝶,需要用到轉(zhuǎn)義字符“\”,將對應(yīng)的符號轉(zhuǎn)換成原來的意思块攒。

10.排序和限制查詢

1)單列排序(并指定方向)
升序排列:

SELECT age,name FROM customers ORDER BY age ASC;

降序排列:

SELECT age,name FROM customers ORDER BY age DESC;

2)多列排序(并指定方向)

SELECT name,adress,age FROM customers ORDER BY age DESC,name ASC;
SELECT * FROM studentinfo WHERE gender=1 ORDER BY age; 查詢出性別為1的并按照年齡升序排列
SELECT * FROM studentinfo WHERE gender=0 ORDER BY age DESC; 查詢出性別為1的并按照年齡j降序排列

限制查詢(可以指定開始的位置和顯示的條數(shù))
指定返回的行數(shù)

SELECT name FROM customers LIMIT 5;

指定從第幾行起励稳,返回多少行

SELECT name FROM badboy LIMIT 5,5; 指定開始位置是5(不包括5),返回5行 ``````無頭有尾````
SELECT name FROM customers LIMIT 0,1; 注意: 行0 檢索出來的第一行為行0而不是行1囱井。

分頁:
已知:每頁顯示m條數(shù)據(jù)驹尼,當(dāng)前顯示第n頁求第n頁的數(shù)據(jù)
SELECT * FROM sudents WHERE is_delete=0 LIMIT (n-1)*m,m

使用ORDER BY和LIMIT的組合

SELECT name,age FROM customers ORDER BY age DESC LIMIT 1; 取最大值
SELECT name,age FROM customers ORDER BY age LIMIT 1; => SELECT name,age FROM customers ORDER BY age ASC LIMIT 1; 取最小值

LIMIT 和其他的語句進(jìn)行配合使用的時候,要放在語句的末尾庞呕,作為最后的限制新翎。

11. 聚合函數(shù)(匯總函數(shù))

AVG()函數(shù)

AVG()通過對表中行數(shù)計數(shù)并計算特定列值之和,求得該列的平均值住练。 AVG()可用來返回所有列的平均值地啰,也可以用來返回特定列或行的平均值。

SELECT AVG(age) as avg_age FROM customers;
SELECT AVG(age) as avg_age FROM customers WHERE adress LIKE '北%';

COUNT()函數(shù)

COUNT()函數(shù)進(jìn)行計數(shù)澎羞∷枵溃可利用COUNT()確定表中行的數(shù)目或符合特定條件的行的數(shù)目。
COUNT()函數(shù)有兩種使用方式妆绞。 使用COUNT(*)對表中行的數(shù)目進(jìn)行計數(shù)顺呕, 不管表列中包含的是空值( NULL)還是非空值。

SELECT COUNT(*) FROM customers;

使用COUNT(column)對特定列中具有值的行進(jìn)行計數(shù)括饶,忽略 NULL值株茶。 SELECT COUNT(name) FROM customers;

MAX()函數(shù)

MAX()返回指定列中的最大值。 MAX()要求指定列名图焰,如下所示
SELECT MAX(age) FROM customers;

MIN()函數(shù)

MIN()的功能正好與MAX()功能相反启盛,它返回指定列的最小值.如下所示
SELECT MIN(age) FROM customers;

SUM()函數(shù)

SUM()用來返回指定列值的和(總計)。如下所示
SELECT SUM(age) as sum_age from customers;

聚集不同值

下面的例子使用AVG()函數(shù)返回同學(xué)的平均價格。 它與上面的SELECT語句相同僵闯,但使用了DISTINCT參數(shù)卧抗,因此平均值只考慮各個不同的年齡:
SELECT AVG(DISTINCT age) from customers;

12.mysql的分組查詢

group by + 集合函數(shù)

SELECT COUNT(*) AS totalnum,age from customers group by age; AS 是給前面的集合函數(shù)返回的時候進(jìn)行了重新的命名

group by + group_concat()
  • group_concat(字段名)可以作為一個輸出字段來使用,
  • 表示分組之后鳖粟,根據(jù)分組結(jié)果社裆,使用group_concat()來放置每一組的某字段的值的集合

SELECT gender,group_concat(student_name) FROM studentinfo GROUP BY gender;

group_concat()

group by + with rollup

with rollup的作用是:在最后新增一行,來記錄當(dāng)前列里所有記錄的總和

SELECT gender,count(*) FROM studentinfo GROUP BY gender with rollup;

HAVING

HAVING非常類似于WHERE向图。事實上泳秀,目前為止所學(xué)過的所有類型的WHERE子句都可以用HAVING來替代。唯一的差別是WHERE過濾行榄攀,而HAVING過濾分組嗜傅。

  • having 條件表達(dá)式:用來分組查詢后指定一些條件來輸出查詢結(jié)果
  • having作用和where類似,但having只能用于group by

SELECT COUNT(),age,adress FROM customers GROUP BY age,adress HAVING COUNT() >= 2;

SELECT COUNT(*),age,adress FROM customers GROUP BY age,adress HAVING age >= 2;

SELECT COUNT(*),age,adress FROM customers GROUP BY age,adress HAVING age >= 2 and adress LIKE '%搜索關(guān)鍵字%';

HAVING和WHERE的差別 這里有另一種理解方法檩赢,WHERE在數(shù)據(jù)分組前進(jìn)行過濾,HAVING在數(shù)據(jù)分組后進(jìn)行過濾吕嘀。這是一個重要的區(qū)別, WHERE排除的行不包括在分組中贞瞒。這可能會改變計算值币他,從而影響HAVING子句中基于這些值過濾掉的分組

分組和排序

SELECT COUNT(*),age,phonenum FROM studentinfo WHERE gender=1 GROUP BY age,phonenum HAVING phonenum is null ORDER BY age DESC; ;

分組和排序、限定查詢

SELECT count(*),age,phonenum FROM studentinfo WHERE gender=1 GROUP BY age,phonenum HAVING phonenum is null ORDER BY age ASC LIMIT 2;

SELECT count(*),age,phonenum FROM studentinfo WHERE gender=1 GROUP BY age,phonenum HAVING phonenum is null ORDER BY age ASC LIMIT 2,2;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末憔狞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子彰阴,更是在濱河造成了極大的恐慌瘾敢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尿这,死亡現(xiàn)場離奇詭異簇抵,居然都是意外死亡,警方通過查閱死者的電腦和手機射众,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門碟摆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叨橱,你說我怎么就攤上這事典蜕。” “怎么了罗洗?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵愉舔,是天一觀的道長。 經(jīng)常有香客問我伙菜,道長轩缤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮火的,結(jié)果婚禮上壶愤,老公的妹妹穿的比我還像新娘。我一直安慰自己馏鹤,他們只是感情好征椒,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著假瞬,像睡著了一般陕靠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脱茉,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天剪芥,我揣著相機與錄音,去河邊找鬼琴许。 笑死税肪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的榜田。 我是一名探鬼主播益兄,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼箭券!你這毒婦竟也來了净捅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辩块,失蹤者是張志新(化名)和其女友劉穎蛔六,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體废亭,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡国章,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了豆村。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片液兽。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掌动,靈堂內(nèi)的尸體忽然破棺而出四啰,到底是詐尸還是另有隱情,我是刑警寧澤坏匪,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布拟逮,位于F島的核電站,受9級特大地震影響适滓,放射性物質(zhì)發(fā)生泄漏敦迄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罚屋。 院中可真熱鬧苦囱,春花似錦、人聲如沸脾猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猛拴。三九已至羹铅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愉昆,已是汗流浹背职员。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跛溉,地道東北人焊切。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像芳室,于是被迫代替她去往敵國和親专肪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容