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)的額儲存引擎 |
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ù)
- 修改(更新)指定行
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ī)則如下:
python中使用正則表達(dá)式(導(dǎo)入python下的re模塊)
-
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 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;