MySQL 系列 —— SQL

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 可以省略。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俊马,一起剝皮案震驚了整個濱河市丁存,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柴我,老刑警劉巖解寝,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異艘儒,居然都是意外死亡聋伦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門界睁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觉增,“玉大人,你說我怎么就攤上這事晕窑∫制” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵杨赤,是天一觀的道長敞斋。 經(jīng)常有香客問我,道長疾牲,這世上最難降的妖魔是什么植捎? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮阳柔,結果婚禮上焰枢,老公的妹妹穿的比我還像新娘。我一直安慰自己舌剂,他們只是感情好济锄,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霍转,像睡著了一般荐绝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上避消,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天低滩,我揣著相機與錄音召夹,去河邊找鬼。 笑死恕沫,一個胖子當著我的面吹牛监憎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婶溯,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲸阔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爬虱?” 一聲冷哼從身側響起隶债,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腾它,失蹤者是張志新(化名)和其女友劉穎跑筝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞒滴,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡曲梗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妓忍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虏两。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖世剖,靈堂內(nèi)的尸體忽然破棺而出定罢,到底是詐尸還是另有隱情,我是刑警寧澤旁瘫,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布祖凫,位于F島的核電站,受9級特大地震影響酬凳,放射性物質發(fā)生泄漏惠况。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一宁仔、第九天 我趴在偏房一處隱蔽的房頂上張望稠屠。 院中可真熱鬧,春花似錦翎苫、人聲如沸权埠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攘蔽。三九已至,卻和暖如春粱快,著一層夾襖步出監(jiān)牢的瞬間秩彤,已是汗流浹背叔扼。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漫雷,地道東北人瓜富。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像降盹,于是被迫代替她去往敵國和親与柑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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