一、SQL,不區分大小寫
在數據庫中進行操作的腳本,稱爲sql,結構化查詢語言,當前關係型數據庫都支持使用sql語言進行操作,也就是說可以通過 sql 操作 oracle,sql server,mysql,sqlite 等等所有的關係型的數據庫。
sql語句主要分爲:
1 DQL:數據查詢語言,用於對數據進行查詢,如 select
2 DML:數據操作語言,對數據進行增、刪、查、改,如 insert 、update 、delete
3 TPL:事物處理語言,對事物進行處理,包括 begin transaction 、commit 、rollback
4 DCL:數據控制語言,進行授權與權限回收,如 grant 、revoke
5 DDL:數據定義語言,進行數據庫、表的管理,如 creat 、drop
6 CCL:指針控制語言,通過控制指針完成表的操作,如 declare cursor
對於web程序員來說,重點是數據的增刪查改,必須熟練掌握DQL 、DML 、DDL
SQL是一門特殊的語言,專門用來操作關係數據庫,且不區分大小寫
二、mysql 對數據庫的相關操作
1、mysql -u root -p 進入mysql操作界面
mysql -h 192.168.126.128 -u root -p 訪問該主機地址的mysql
2、查看數據庫: show databases;
2、創建數據庫: create database 數據庫 charset=utf8; ( 默認使用拉丁文字符串,不重置的話使用中文會報錯)
3、查看創建出來的數據庫: show create database 數據庫;
4、刪除數據庫: drop database 數據庫;
5、選擇數據庫: use 數據庫;
6、查看正在使用的數據庫: select database( );
7、查看默認存儲引擎: show variables like"%storage_engine%";
8、查看 mysql 數據庫系統支持的儲存引擎的類型
9、強調說明
數據庫中,名字中帶有中橫線的,會當成特殊意義,需要使用 ` ` 將其括起來 ( Esc鍵下面, Tab鍵上面)
三、mysql 對數據庫表的相關操作
1、創建數據庫表: create table 表名( 字段1 約束 ,字段2 約束 . . . . . );
① 表名不能爲 sql 語言的關鍵字,一個表中可以有多個字段,定義時,字母大小寫均可,各字段之間使用逗號分隔開,最後一個字段後不需要加逗號,字段後面可以加上完整性約束條件
②完整性約束條件:完整性約束條件是對字段進行限制,要求用戶對該屬性進行的操作符合特定的要求,如果不滿足完整性約束條件,數據庫系統將不執行用戶的操作,其目的是爲了保證數據庫中數據的完整性
主鍵 primary key:物理上存儲的順序
非空 not null:此字段不允許填寫空值
唯一 unique:此字段的值不允許重複
默認 default:當不填寫值時,會使用默認着,填寫時,以填寫內容爲準
外鍵 foreign key:對關係字段進行約束,當爲關係字段填寫值時,會到關聯的表中查詢此值是否存在,如果存在則填寫成功,如果不存在則填寫失敗並拋出異常(雖然外鍵約束可以保證數據的有效性,但是在進行數據的增加、修改、刪除、查詢時,都會降低數據庫的性能,所以不推薦使用,那麼如何保證數據的有效性呢:在邏輯層進行控制)
auto_increment :標識該屬性的值自動增加
③常用數據類型:使用char定義長度時,即使沒有寫入數據,也會佔用字節,使用varchar時,則根據寫入的數據佔用字節,所以通常使用varchar來定義
2、查看當前數據庫中的數據庫表: show tables;
3、修改表名: alter table 原表名 rename 新表名; 或 alter table 原表名 rename to 新表名;
4、刪除沒有被關聯的普通數據表: drop table 表名;
5、查看數據表的基本結構 (字段):desc(describe) 表名; 或 show create table 表名; 或 show create table 表名 \G
6、查看錶的所有字段數據信息: select * from 表名;
圖上,表示當前表的字段中沒有任何數據
7、向表中添加新字段:
①向表的末尾添加字段: alter table 表名 add 字段名 數據類型 約束;
②向表的首位添加字段: alter table 表名 add 字段名 數據類型 約束 first;
③向表的指定位置添加字段: alter table 表名 add 字段名 數據類型 約束 after 某一個已存在的字段名;
④一次性添加多個字段:alter table 表名 add (字段名1 數據類型1 約束1,字段名2 數據類型2 約束2 ......)
8、刪除字段: alter table 表名 drop 字段名;
9、修改字段
①修改字段(不重命名): alter table 表名 modify 字段名 數據類型 約束 ;
②修改字段並移到首位 : alter table 表名 modify 字段名 數據類型 約束 first ;
③修改字段並移到指定位置: alter table 表名 modify 字段名 數據類型 約束 after 某個已存在的字段名;
③修改字段(重命名) : alter table 表名 change 原字段名 新字段名 數據類型 約束 ;
10、向表中插入數據
表的字段如下: 其中 sex 字段爲枚舉類型
①全列插入數據: insert into 表名 values( 數據內容1 ,數據內容2 ) ;
插入數據時,數據的類型需要與對應字段的數據類型一致,字符串需要加上引號,
可以使用 0 、null 、default 三種方法,爲主鍵以及自動增加的 id 字段的值進行佔位(不佔位的話不符合格式要求,會報錯)
當字段爲枚舉類型時,也可以這樣插入內容:
②部分插入數據: insert into 表名( 字段1,字段2,字段3 ......) values( 值1,值2,值3 ),values( 值1 ',值2 ',值3 ' ) ......
沒有賦值的字段,數據庫系統會爲其插入默認值,如果某個字段沒有設置默認值,而且是非空屬性,那麼就必須爲其賦值,否則會報錯,通過這種方式也可以隨意的設置字段的內容,不一定非要按照定義時的字段順序,一 一對應的爲其賦值
11、更改數據內容: update 列表名 set 字段=值 where 條件;(如果不加上條件,默認全部修改)
12、刪除數據 ( 物理刪除 ): delete from 表名 where 條件;(刪除時需要小心,不加上條件,默認全部刪除)(truncate 表名 ; 刪除表的全部內容,後面不能加條件,如where)
13、邏輯刪除:向表中添加 is_delete 字段,數據類型爲 bit ,默認值爲 0 ,當默認值修改爲1時,表示邏輯刪除,可恢復
14、重置表:例如,當表中存在一個自增長的id字段時,若將某一個id=6的記錄刪除,再次添加數據時,id不會重複,也就是說不會再出現id=6這種情況了,需要使用重置功能,將表重置即可。需要注意的是,重置表會刪除表的全部信息。
語法:truncate table 表名;
四、mysql 數據查詢
1、基礎查詢:
①select * from 列表名; 查詢列表的全部數據內容
select 列表名.* from 列表名; 查詢列表的全部數據內容
select 數據庫名.列表名.* from 列表名; 查詢列表的全部數據內容
②查詢列表的字段1和字段2數據內容
select 列表名.字段1,,列表名.字段2 from 列表名;
③ 去重查詢(去重時只看一個字段條件)
select distinct 字段 from 列表名;
④條件查詢 (比較運算符,邏輯運算符)
select * from 列表名 where 條件;
⑤模糊查詢(kile %表示任意字符, _表示一位字符)
select * from 列表名 where 模糊條件;
⑥範圍查詢 in表示非連續範圍, between ... and ... 表示連續範圍
select * from 列表名 where 字段 in (範圍) ;
⑦null 查詢,使用 is 或 is not 來進行判斷,這裏需要注意的是 null 與 " " 並不相等
select * from 列表名 where 字段 is null ; 查詢某個字段爲 null 的信息
select * from 列表名 where 字段 is not null ; 查詢某個字段不爲 null 的信息
⑧排序查詢 order by ( asc 升序,desc 降序)
select * from 列表名 order by height desc; 按照身高,降序查詢所有信息
select * from 列表名 order by height desc,age desc; 先按照身高,降序查詢所有信息,若身高相同,再按照年齡降序查詢
⑨聚合函數
⑴ count ( * ) 查詢總數量
select count( * ) from 表名;
⑵ min(字段) 求此字段的最小值 , max(字段) 求此字段的最大值
⑶ sum( 字段 ) 求此字段的和, avg( 字段 ) 求此字段的平均值
⑷ 分組: group by 字段
Ⅰ 分組:字段相同的數據放到一個組中( 執行效果與去重相同 ),分組後,分組依據顯示在結果集中,其他字段不會顯示,且分組時會升序排列
Ⅱ 分組 與 group_concat( ) 配合使用,可以依據分組,顯示出指定內容
Ⅲ 分組 與 聚合函數配合使用:
Ⅳ having 條件
配合分組使用,having 後面跟的是篩選條件,與 where類似,where 是對 from 後面的表進行篩選,而 having 是對 group by的結果進行篩選
⑸ limit 限制查詢結果數: limit x 限制查詢 x 個數據 limit x,y 限制從第 x 處查詢( 從第0個開始),且限制查詢 y 個數據
拓展:通過 limit 來顯示分頁的查詢結果
pageSize=3 表示每頁顯示3個數據, pageNow 表示當前處於第幾頁,allSum 表示所有符合查詢結果的數據
if allSum%pageSize == 0:
pageNow = allSum / pageSize
else:
pageNow = allSum / pageSize + 1
select * from students limit ( pageNow - 1 ) * pageSize,pageSize
2、高級查詢
①鏈接查詢 內連接: inner join ... on.... 左連接: left join ... on.... 右連接: right join ... on....
首先,看一個兩個表的數據:
⑴內連接:查詢結果爲匹配到的共同數據
⑵左連接:查詢結果爲匹配到的共同數據,左表的全部數據,右表沒有的使用 null 填充
⑶右連接:查詢結果爲匹配到的共同數據,右表的全部數據,左表沒有的使用 null 填充
使用時,也可以改個名(只針對此次操作)
②自關聯查詢
查詢全國的省份:
查詢廣東省的城市:
查詢廣州市的市區:
③子查詢:在一個 select 語句中,嵌入了另一個 select 語句 ,這個嵌入的 select 語句,被稱爲子查詢語句
子查詢嵌入到主查詢中,作用是輔助主查詢( 充當條件或數據源 ),子查詢是一條完整的 select 語句
查詢所有大於平均身高的學生的信息:
子查詢中出現的關鍵字:
any / some 主查詢 where 字段 = any( 子查詢); 查詢結果中匹配到任意一個即可,等價於 in
all 主查詢 where 字段 = all( 子查詢); 等於裏面所有的條件
主查詢 where 字段 <> all( 子查詢); 不等於裏面所有的條件
in 主查詢 where 字段 = in ( 子查詢); 查詢結果中匹配到任意一個即可,
主查詢 where 字段 = not in ( 子查詢); 查詢結果中不能匹配到其中任何一個,
五、視圖、事務、索引
1、視圖:本質就是對一個查詢的 sql 語句的封裝
① 創建一個視圖: create view 視圖名 as select * from 表名;
② 刪除一個視圖: drop view 視圖名
2、事務:事務是併發控制的基本單位,是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。 例如: 銀行的轉賬工作,從一個賬戶扣錢並將錢轉到另一個賬戶,只有兩個操作都完成,轉賬工作才完成
①事務的四大特性( ACID ):
原子性:事務中的全部操作在數據庫中都是不可分割的,要麼全部完成,要麼均不執行
一致性:幾個並行執行的事務,其執行結果必須與按某一順序串執行的結果一致
隔離性:事務的執行不受其他事務的干擾,事務執行的中間結果對其他事物必須是透明的
持久性:對於任意已提交的事物,系統必須保證該事物對數據庫的改變不被丟失,即使數據庫出現故障
②開啓事務後,對數據庫的更新操作不會立即影響到數據庫,只有在成功之後,執行提交操作,纔會將變化提交給源數據庫
③使用事務時,需要注意的是:表的引擎類型必須是 innodb 類型,纔可以使用事務,(innodb 是 mysql 的默認引擎)
修改表的存儲引擎爲 innodb引擎: alter table 表名 engine = innodb;
④ begin 開啓事務, commit 提交事務 , rollback 回滾事務
從圖上,我們可以看出,當 begin 開啓事務後,對錶進行了更新操作,雖然再次查詢表數據時顯示出來剛剛更新的數據,但實際上,在數據庫中並沒有對剛剛更新的數據進行更新,它僅僅是緩存了起來,
只有我們 commit 提交數據之後,數據庫纔會更新緩存中變更的數據
同理,使用 rollback 則放棄緩存中變更的數據
3、索引:索引是一種特殊的文件,它包含着對數據表所有記錄的引用指針
創建索引: 如果指定字段類型是字符串,需要指定長度;如果字段類型不是字符串,則不需要指定長度
create index 索引名 on 表名( 字段名( 長度 ) );
刪除索引: drop index 索引名 on 表名;
使用索引需要注意的是:只有當表的數據結構夠複雜,數據量較大時,才能體現出索引的優勢所在,當表的結構簡單,使用索引反而效果不佳
六、數據備份與還原
1、備份: mysqldump -u username -p dbname table1 table2 > backupname.sql
其中,dbname參數表示數據庫名稱, table1、table2參數表示表的名稱,沒有該參數時將備份整個數據庫,backupname.sql 參數備份文件的名稱,通常後綴爲 .sql ,文件名前面可以加上一個絕對路徑
下面是備份 192.168.242.150 主機的 mysql 數據庫中,一個叫做 python1807A 的數據庫,
2、還原: mysql -u root -p dbname < backupname.sql
七、python 與 mysql 交互
1、流程圖( python3 使用前需要先導入 pymysql包 )
2、Connection對象
①用於建立與數據庫的連接,創建對象調用 connect 方法
格式: connect( 參數列表 )
⑴參數 host:連接的 mysql 主機,如果是本機,則爲 " localhost " ⑵參數 port:連接的 mysql 主機的端口號,默認是3306
⑶參數 database:數據庫的名稱 ⑷ 參數 user:連接的用戶名
⑸ password:連接的密碼 ⑸ 參數 charset:通信採用的編碼方式,推薦使用utf8
②Connection對象的方法:
close( ) 關閉連接
commit( ) 提交
rollback( ) 回滾
cursor( ) 返回Cursor對象,用於執行sql 語句,並獲得結果
3、Cursor對象:通過調用 Connection 對象的 cursor 方法獲取,用於執行 sql 語句,如:select、insert、update、delete
①對象的屬性:
connection 獲得當前連接對象
rowcount 只讀屬性,表示最近一次 execute( ) 執行後受影響的行數
②Cursor對象的方法:
close( ) 關閉
execute( ) 執行語句
fetchone( ) 執行查詢語句時,獲取查詢結果集的第一個行數據,返回一個元組
fetchall( ) 執行查詢語句時,獲取查詢結果集的所有行,一行構成一個元組,再將這些元組裝入一個元組返回
4、實例
需要注意的是,佔位時如果字段類型是字符串,需要使用引號引住,且傳參時,需要使用列表傳參,
還有一點值得注意的是,雙引號內不允許再次出現雙引號,