SQL語句分類
- DDL(Data Definition Language): 數據定義語言,用來定義數據對象:庫,表,列等。
- DML(Data Manipulation Language): 數據操作語言,用來定義數據庫記錄(數據)。
- DCL(Data Control Language):數據控制語言,用來定義訪問權限和安全級別。
- DQL(Data Query Language):數據查詢語言,用來查詢記錄。
DDL使用
用途 | 操作 |
---|---|
創建數據庫 | create database [庫名] |
查看數據庫 | show databases |
查看之前創建的數據庫的定義信息 | show create database [庫名] |
修改數據庫字符集 | alter database [庫名] character set utf8 |
刪除 | drop database[庫名] |
查看當前使用的數據庫 | select database() |
切換數據庫 | use [庫名] |
創建表 | create table [表名] (字段 字段類型(長度) 約束); |
查看錶的字段信息 | desc [表名] |
增加一列 | alter table [表名] add [列名] blob |
修改一列 | alter table [表名] modify [列名] |
重命名錶 | rename table [表名] to [新表名] |
修改列名 | alter table [表名] change [列名] [新列名] 字段類型(長度) |
刪除一列 | alter table [表名] drop [列名] |
修改表的字符集 | alter table [表名] character set [新字符集] |
注:一般DDL並不怎麼使用,自我感覺不如圖形化界面修改方便。而且在一般情況下,數據庫以及表的結構不用去修改。
DML使用
用途 | 操作 |
---|---|
插入 | insert into [表名] (列名1,列名2…) values(列值1,列值2); |
修改 | update [表名] set 列名=列值 where 列名 =值 |
刪除 | delete from [表名] where 列名=值 |
刪除 | truncate table [表名] |
注:雖然delete和truncate都是刪除表中數據,但是delete是保留表結構,刪除的數據還可以找回;truncate是將表刪除,然後再創建一個同樣的表,刪除數據不能找回,不過執行速度比delete快。
DCL使用
用途 | 操作 |
---|---|
授權 | GRANT |
提交 | COMMIT |
回滾 | ROLLBACK |
注:commit是提交事務,事務就是一組要麼同時執行成功,要麼同時執行失敗的SQL語句,是數據庫操作的一個執行單元。rollback使用前需要設置保存點。
補充 事務隔離級別分爲四類:
- 髒讀:所有事務都可以看到其他未提交事務的執行結果。
- 不可重複讀:在同一事務中,同一select返回不同結果。
- 幻讀:在讀取某一範圍數據時,另一個事務在該範圍內插入了新行,當用戶再次讀取該範圍數據時,發現有新的“幻影”行。
- 可串行化:在每個讀的數據行上加共享鎖,但這個級別可能導致大量超時現象和鎖競爭。
Mysql默認的是第三級別,Oracle默認是第二級。
DQL使用
用途 | 操作 |
---|---|
條件查詢 | where ( in / not in / is null / between and / is not null |
模糊查詢 | like ‘ [ _ 代表任意一個字母 %代表0或多個任意字符]’ |
去重 | distinct |
排序 | order by [列名] (asc 正序 desc 倒序) 默認爲正序 |
分組 | group by |
過濾 | having 跟在分組後對數據進行過濾 |
限制 | limit [begin,end] 查詢從begin行到end行的數據 |
SQL優化
-
儘量避免在where子句中對字段進行null值判斷,避免在where字句中使用!=或<>操作符,避免在where子句中使用or來連接條件,否則將導致引擎放棄索引而進行全表索引。
-
應儘量避免全表掃描,應考慮在where及order by 涉及的列上建立索引。
-
in和not in要慎用,否則會導致全表掃描。
-
儘量避免在where子句中對字段進行表達式操作。
-
儘量避免在where子句中對字段進行函數操作。
-
很多時候用exists代替in是一個好的選擇。
-
儘量使用數字型字段。
-
儘量使用varchar代替char。
-
任何地方都不要用*,不要返回用不到的任何字段。
-
儘量使用表變量代替臨時表。
-
避免頻繁創建和刪除臨時表。
-
在新建臨時表時,如果一次插入數據量很大,使用insert into代替create table;如果數據量不大,先create table 然後insert。
summed up by JiaMingcan 轉載請署名:JiaMingcan