SQL 簡介
SQL 是 Structure Query Language(結構化查詢語言)的縮寫痕钢,它是使用關系模型的數(shù)據(jù)庫應用語言。
SQL 入門
這里主要介紹標準 SQL 的基本語法和 MySQL 的部分拓展語法
SQL 分類
SQL語言主要可以劃分為以下 3 個類別:
- DDL(Data Definition Languages)語句:數(shù)據(jù)定義語言敢靡,這些語句定義了不同的數(shù)據(jù)段彩扔、數(shù)據(jù)庫址晕、表痹愚、列、索引等數(shù)據(jù)庫對象入篮。常用的語句關鍵字主要包括 create陈瘦、drop、alter 等潮售。
- DML(Data manipulation Languages)語句:數(shù)據(jù)操縱語句痊项,用于添加、刪除饲做、更新和查詢數(shù)據(jù)庫記錄线婚,并檢查數(shù)據(jù)完整性遏弱。常用的語句關鍵字主要包括 insert盆均、delete、update漱逸、select 等泪姨。
- DCL(Data Control Languages)語句:數(shù)據(jù)控制語言游沿,用于控制不同數(shù)據(jù)段直接的許可和訪問級別的語句。這些語句定義了數(shù)據(jù)庫肮砾、表诀黍、字段、用戶的訪問權限和安全級別仗处。主要的語句關鍵字包括 grant眯勾、revoke 等。
DDL 語句
DDL 是數(shù)據(jù)定義語言的縮寫婆誓,簡單來說吃环,就是對數(shù)據(jù)庫內(nèi)部的對象進行創(chuàng)建、刪除洋幻、修改等操作的語言郁轻。它和 DML 語句的最大區(qū)別是 DML 只是對表內(nèi)部數(shù)據(jù)操作,而不涉及表的定義文留、結構的修改好唯,更不會涉及其它對象。DDL 語句更多地由數(shù)據(jù)庫管理員使用燥翅,開發(fā)人員一般很少使用骑篙。
創(chuàng)建數(shù)據(jù)庫
create database test1;
如果想要查看系統(tǒng)中有哪些數(shù)據(jù)庫,可以用如下命令:
show databases;
可以用如下命令選擇要操作的數(shù)據(jù)庫:
use test1;
刪除數(shù)據(jù)庫
drop database test1;
創(chuàng)建表
create table tablename (
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
...
column_name_n column_type_n constraints
)
因為 MySQL 的表名是以目錄的形式存在于磁盤上森书,所以表名的字符可以用任何目錄名允許的字符替蛉。
column_name 是列的名字;column_type 是列的數(shù)據(jù)類型拄氯;constraints 是這個列的約束條件躲查。
查看表的定義
desc tablename;
查看創(chuàng)建表的 SQL 語句
show create table tablename;
刪除表
drop table tablename;
修改表
修改表類型
alter table tablename modify column_col datatype [first|after col_name];
增加表字段
alter table tablename add [column] column_col datatype [first|after col_name];
刪除表字段
alter table tablename drop [column] col_name;
字段改名
alter table tablename change [column] old_col_name column_definition datatype [first|after column_name];
修改字段排列順序
字段增加和修改語法(add/change/modify)中,都有一個可選項 first|after column_name
译柏,這個選項可以用來修改字段在表中的位置镣煮。
add 增加的新字段默認是加在表的最后位置,而 change/modify 默認都不會改變字段的位置鄙麦。
change first|after column
這些關鍵字都屬于 MySQL 在標準 SQL 上的擴展典唇,在其他數(shù)據(jù)庫上不一定適應。
更改表名
alter table tablename rename [to] new_tablename;
DML 語句
DML 操作是指對數(shù)據(jù)庫中表記錄的操作胯府,主要包括表記錄的插入(insert)介衔、更新(update)、刪除(delete)和查詢(select)骂因,是開發(fā)人員日常使用最頻繁的操作炎咖。
插入
insert into tablename(field1,field2,...,fieldn) values(value1,value2,...,valuen);
也可以不指定字段名稱,但是 values 后面的順序應該和字段的排列順序一致。
也可以一次性插入多條記錄:
insert into tablename(field1,field2,...,fieldn)
values
(record1_value1,record1_value2,...,record1_valuen),
(record2_value1,record2_value2,...,record2_valuen),
...
(recordn_value1,recordn_value2,...,recordn_valuen);
更新
update tablename set field1=value1,field2=value2,...,fieldn=valuen [where condition];
在 MySQL 中乘盼,update 命令可以同時更新多個表中數(shù)據(jù):
update t1,t2,...tn set t1.field=expr1,tn.fieldn=exprn [where condition];
刪除
delete from tablename [where condition];
在 MySQL 中可以一次刪除多個表的數(shù)據(jù):
delete t1,t2,...tn from t1,t2,...,tn [where condition];
如果 from 后面的表名用別名升熊,則 delete 后面也要用相應的表明。
查詢記錄
select * from tablename [where condition];
查詢不重復的記錄
select distinct col_name from tablename;
排序
select * from tablename [where condition] [order by field1 [desc\asc], field2 [desc\asc],...,fieldn [desc\asc]];
其中绸栅,desc 和 asc 是排序順序關鍵字级野,desc 表示按照字段進行降序排序,asc 則表示升序排序粹胯,如果不寫此關鍵字默認是升序排序蓖柔。
如果排序字段的值一樣,則值相同的字段按照第二個排序字段進行排序风纠,依次類推渊抽。如果只有一個排序字段,則這些字段相同的記錄將會無序排列议忽。
限制行數(shù)
select * from tablename [limit offset_start,row_count];
其中懒闷,offset_start 表示記錄的起始偏移量,row_count 表示顯示的行數(shù)栈幸。
在默認情況下愤估,起始偏移量為0,只需要寫記錄行數(shù)就可以速址,這是玩焰,實際顯示的就是前 n 條記錄。
limit 屬于 MySQL 拓展 SQL92 后的語法芍锚,在其他數(shù)據(jù)庫上并不能適應昔园。
聚合
select [field1,field2,fieldn] fun_name
from tablename
[where where_condition]
[group by field1,field2,...fieldn]
[with rollup]
[having where_condition];
其中:
fun_name 表示要做的聚合操作,也就是聚合函數(shù)并炮,常用的有 sum(求和)默刚、count(*)(記錄數(shù))、max(最大值)逃魄、min(最小值)荤西。
group by 關鍵字表示要進行分類聚合的字段,比如要按照班級統(tǒng)計學生平均分伍俘,班級就應該寫在 group by 后面邪锌。
with rollup 是可選語法,表明是否對分類聚合后的結果進行再匯總癌瘾。
having 關鍵字表示對分類后的結果再進行條件的過濾觅丰。
having 和 where 的區(qū)別在于,having 是對聚合后的結果就行條件的過濾妨退,而 where 是在聚合前就對記錄進行過濾妇萄,如果邏輯允許蜕企,盡可能用 where 先過濾記錄,這樣因為結果集減小嚣伐,將對聚合的效率大大提高糖赔,最后再根據(jù)邏輯看是否用 having 進行再過濾
表連接
當需要同時顯示多個表中的字段時萍丐,就可以用表連接來實現(xiàn)這樣的功能轩端。
從大類上分,表連接分為內(nèi)連接和外連接逝变,它們之間的最主要區(qū)別是基茵,內(nèi)連接僅選出兩張表中互相匹配的記錄,而外連接會選出其它不匹配的記錄壳影。
外連接又分為左連接和右連接拱层,具體定義如下:
- 左連接(left join):包含所有的左邊表中的記錄甚至是右邊表中沒有和它匹配的記錄。
- 右連接(right join):包含所有的右邊表中的記錄甚至是左邊表中沒有和它匹配的記錄宴咧。
內(nèi)連接有兩種方式:
select t1.*,t2.* from tablename1 t1,tablename2 t2 where t1.field1 = t2.field2;
select t1.*,t2.* from tablename1 t1 join tablename2 t2 where t1.field1 = t2.field2;
子查詢
某些情況下根灯,當進行查詢的時候,需要的條件是另外一個 select 語句的結果掺栅,這個時候烙肺,就要用到子查詢。用于子查詢的關鍵字主要包括 in
氧卧、not in
桃笙、=
、!=
沙绝、exists
搏明、not exists
等。
記錄聯(lián)合
當需要把兩個表的數(shù)據(jù)按照一定的查詢條件查詢出來后闪檬,將結果合并到一起顯示出來星著,這個時候,就需要用 union 和 union all 關鍵字來實現(xiàn)這樣的功能粗悯。
select * from t1
union\union all
select * from t2
...
union\union all
select * from tn;
需要注意的是强饮,union\union all 之間的查詢結果列數(shù)量需要相同。
union 和 union all 的主要區(qū)別是 union all 是把結果集直接合并在一起为黎,而 union 是將 union all 后的結果進行一次 distinct邮丰,去除重復記錄后的結果。
DCL 語句
DCL 語句主要是用來管理系統(tǒng)中的對象權限時使用铭乾。
創(chuàng)建用戶
create user 'username'@'hostIP' identified by 'password';
hostIP 用于指定該用戶只能在哪個 ip 登錄剪廉,如果要想在任意 ip 登錄的話,將 hostIP 改為 %
炕檩。
用戶授權
grant privileges on database.tablename to username@hostIP;
privileges 指操作權限斗蒋,常用有以下幾種:
- select:查詢
- insert:插入
- update:更新
- delete:刪除
- create:創(chuàng)建表
- alter:修改表結構
- drop:刪除表
- index:操作索引
- create view:創(chuàng)建視圖
- show view:查看視圖
- create routine:創(chuàng)建存儲過程捌斧、函數(shù)
- alter routine:修改存儲過程、函數(shù)
- execute routine:執(zhí)行存儲過程泉沾、函數(shù)
如果要賦予多個權限捞蚂,可以用逗號,
隔開,如果要賦予所有權限跷究,可以用 all privileges
代替姓迅,其中 privileges 可以省略。