第六講 SQL語(yǔ)言概述

SQL語(yǔ)言概述

  • 1974年首次由Boyce和Chamber提出
  • 1975-1979年, 由IBM的San Jose研究室在System R上首次實(shí)現(xiàn)
  • 1986年ANSI/ISO推出SQL標(biāo)準(zhǔn): SQL-86
  • 1989年ANSI/ISO推出SQL標(biāo)準(zhǔn): SQL-89
  • 1992年進(jìn)一步推出了SQL標(biāo)準(zhǔn): SQL-92, 也稱為SQL2
  • 1999年進(jìn)一步推出了SQL標(biāo)準(zhǔn): SQL-99. 也稱為SQL3
  • SQL 2003; SQL 2006; SQL 2008

利用SQL建立數(shù)據(jù)庫(kù)

可定義的數(shù)據(jù)類型
--- 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
create database Learn_sql_SCT;
-- 刪除一個(gè)數(shù)據(jù)庫(kù)
drop database Learn_sql_SCT;
-- 切換一個(gè)數(shù)據(jù)庫(kù)
use learn_sql_SCT;
-- 定義一個(gè)學(xué)生表Student
-- 反引號(hào)它是為了區(qū)分mysql的保留字與普通字符而引入的符號(hào). 我在這里使用mysql進(jìn)行練習(xí), 為了避免沖突, 把表名和列名括起來(lái)
create table `Student`(`S#` char(8) not null, `Sname` char(10), `Ssex` char(2), `Sage` integer, `D#` char(2), `Sclass` char(6));
-- 定義課程表Course
create table `Course`(`C#` char(3), `Cname` char(12), `Chours` integer, `Cred` float(1), `T#` char(3));

-- 都不給圖數(shù)據(jù)庫(kù)和表(使用DDL), 向表中追加元組(使用DML)
-- 向表中追加新的元組: Insert
-- 追加學(xué)生表中的元組
-- 方式一, 不給列名, 則值需要和定義時(shí)的列名順序一致
insert into `Student` values ('98030101', 'SanZhang', 'male', 20, '03', '980301');
-- 方式二, 給出列名
insert into `Student`(`S#`, `Sname`, `Ssex`, `Sage`, `D#`, `Sclass`) values('98030102', 'SiZhang', 'female', 20, '03', '980301');
-- 追加課程表中的原組
insert into `Course` values('001', 'database', 40, 6, '001');
insert into `Course`(`Cname`, `C#`, `Cred`, `Chours`, `T#`) values('data structure', '003', 6, 40, '003');

-- 檢索語(yǔ)句select
-- 檢索學(xué)生表中的所有信息
select * from Student;
-- 檢索學(xué)生表中所有學(xué)生的姓名和年齡
select Sname, Sage from Student;
-- 檢索學(xué)生表中所有小于等于19歲的學(xué)生的年齡及姓名
select Sage, Sname from Student where Sage <= 19;
-- 可以這樣寫, 分號(hào)表示結(jié)束, 所以這樣寫的好處是語(yǔ)句清晰 
select Sage, Sname
from Student
where Sage <= 19;

-- 檢索條件的書寫
-- 邏輯運(yùn)算的優(yōu)先次序要注意, 可以使用括號(hào)規(guī)定優(yōu)先級(jí)別避免歧義, 優(yōu)先級(jí)排序: not --> and --> or
-- 檢索教師表中所有工資少于1500元或者大于2000元 并且是03系的教師的姓名(錯(cuò)誤示例)
select `Tname` from `Teacher` 
where `Salary`<1500 or `Salary` > 2000 and `D#`='03';
-- 正確示例
select `Tname` from `Teacher` 
where (`Salary`<1500 or `Salary` > 2000) and `D#`='03';

-- 求學(xué)過001號(hào)課程, 或者學(xué)過002號(hào)課程的學(xué)生的學(xué)號(hào)
select `S#` 
from SC 
where `C#`='001' or `C#`='002';
-- 求既學(xué)過001號(hào)課程, 又學(xué)過002號(hào)課程的學(xué)生的學(xué)號(hào)(錯(cuò)誤示例)
-- 對(duì)于`C#`而言, 其不可能是'001', 同時(shí)又是'002'
select `S#` from SC
where `C#`='001' and `C#`='002';
-- 正確示例

-- distinct 表示選擇出來(lái)的結(jié)果(做投影)沒有重復(fù)
-- 在選課表中, 檢索成績(jī)大于80分的所有學(xué)號(hào)(有重復(fù)示例)
select `S#` from `SC` where Score>80;
-- 在選課表中, 檢索成績(jī)大于80分的所有學(xué)號(hào)(無(wú)重復(fù)示例)
select distinct `S#` from `SC` where Score>80;

-- 根據(jù)選擇出來(lái)的結(jié)果進(jìn)行排序
-- 按學(xué)號(hào)由小到大的順序顯示出所有學(xué)生的學(xué)號(hào)及姓名
-- 默認(rèn)是升序asc, 可以不寫
select `S#`, Sname 
from Student
order by `S#` asc;
-- 檢索002號(hào)課大于80分的所有同學(xué)學(xué)號(hào)并按成績(jī)由高到低順序顯示
-- 降序排列
select `S#` from `SC` 
where `C#`='002' and Score > 80 
order by Score desc;

-- 模糊查詢問題
-- 含有"like"或者"not like"來(lái)表示 "字符串", 匹配規(guī)則:
-- "%"匹配零個(gè)或多個(gè)字符, "_" 匹配任意單個(gè)字符, "\" 轉(zhuǎn)義字符
-- 檢索所有姓張的學(xué)生的學(xué)號(hào)和姓名
select `S#`, Sname from Student where Sname like "%Zhang";
-- 檢索名字為張某某的所有同學(xué)姓名
-- 這個(gè)...
-- 檢索名字不姓張的所有同學(xué)姓名
select Sname from Student where Sname not like "%Zhang";

-- 多表聯(lián)合查詢
-- 按“001”號(hào)課成績(jī)由高到低順序顯示所有學(xué)生的姓名(二表連接)
-- 表名.屬性名的方式限定該屬性屬于哪個(gè)表, 如果屬性只出現(xiàn)一次, 也可以不加
select Sname from Student, SC  
where Student.`S#`=SC.`S#` and  SC.`C#` = '001' 
order by Score desc;

-- 按 數(shù)據(jù)庫(kù) 課的成績(jī)由高到低順序顯式所有同學(xué)姓名(三表連接)
select Sname from Student, SC, Course 
where Student.`S#`=SC.`S#` and SC.`C#`=Course.`C#` and Course.`Cname`='database'
order by Score desc;

-- 連接運(yùn)算涉及重名的問題時(shí), 使用別名加以區(qū)分(as)
-- 西塔連接之不等值連接
-- 求有薪水差額的任意兩位教師
select T1.Tname as Teacher1, T2.Tname as Teacher2 
from Teacher T1, Teacher T2 
where T1.Salary > T2.Salary;

-- 求年齡有差異的任意兩位同學(xué)的姓名
select S1.Sname as Student1, S2.Sname as Student2 from Student S1, Student S2 where S1.Sage > S2.Sage;

-- 求既學(xué)過'001'號(hào)課又學(xué)過'002'號(hào)可的所有同學(xué)的學(xué)號(hào)
-- 先選一個(gè)學(xué)過'001'的, 再選一個(gè)學(xué)過'002'的, 最后連接起來(lái)即可
select SC1.`S#` from SC SC1, SC SC2  where SC1.`C#`='001' and SC2.`C#`='002' and SC1.`S#`=SC2.`S#`;

-- 求'001'號(hào)課成績(jī)比'002'號(hào)課成績(jī)高的所有的學(xué)生的學(xué)號(hào)
select SC1.`S#` from SC SC1, SC SC2  
where SC1.`C#`='001' and SC2.`C#`='002' and SC1.Score > SC2.Score and SC1.`S#`=SC2.`S#`;

-- 列出沒學(xué)過李明老師講授課程的所有同學(xué)的姓名
-- 留待以后

-- 新增Insert, 更新update, 刪除delete
-- 單一元組新增
insert into Teacher(`T#`, Tname, `D#`, Salary) values ('005', 'XiaoqiRuan', '03', '1250');
insert into Teacher values ('006', 'XiaohuLi', '03', '950');

-- 批元組新增
-- 將檢索滿足條件的同學(xué)新增到表中
insert into St (S#, Sname)
    select S#, Sname from Student
    where Sname like '%偉';
insert into St (S#, Sname)
    select S#, Sname from Student order by Sname;
-- 新建Table: SCt(S#, C#, Score), 將檢索到的成績(jī)及格同學(xué)的記錄新增到該表中
Insert Into SCt (S#, C#, Score)
    Select S#, C#, Score From SC
    Where Score>=60 ;
-- 追加成績(jī)優(yōu)秀同學(xué)的記錄
Insert Into SCt (S#, C#, Score)
    Select S#, C#, Score From SC
    Where Score>=90 ;
--新建Table: St(S#, Sname, avgScore), 將檢索到的同學(xué)的平均成績(jī)新增到該表中
-- 此SELECT語(yǔ)句的書寫語(yǔ)法后面再解釋
Insert Into St (S#, Sname, avgScore)
    Select S#, Sname, Avg(Score) From Student, SC
    Where Student.S# = SC.S#
    Group by Student.S#;

-- 元組刪除Delete命令: 刪除滿足指定條件的元組
Delete From 表名 [ Where 條件表達(dá)式];
-- Where條件省略渗饮,則刪除所有的元組(!!!)
-- 刪除98030101號(hào)同學(xué)所選的所有課程
Delete From SC Where S# = '98030101';
-- 刪除自動(dòng)控制系的所有同學(xué)(簡(jiǎn)單的嵌套子查詢)
Delete From Student Where D# in
    (Select D# From Dept Where Dname = '自動(dòng)控制');
-- 刪除有四門不及格課程的所有同學(xué)(后面會(huì)講)
Delete From Student Where S# in
    ( Select S# From SC Where Score < 60
    Group by S# Having Count(*)>= 4 );

-- 元組更新Update命令: 用指定要求的值更新指定表中滿足指定條件的元組的指定列的值
Update 表名
    Set 列名 = 表達(dá)式 | (子查詢)
    [ [ , 列名 = 表達(dá)式 | (子查詢) ] … ]
    [ Where 條件表達(dá)式] ;
-- 將所有教師的工資上調(diào)%5
update Teacher
set Salary = Salary*1.05;
-- 將所有計(jì)算機(jī)系的教師工資上調(diào)10%
update Teacher
set Salary = Salary*1.1
where `D#` in
    (select `D#` from Dept where Dname='computer');
-- 當(dāng)某同學(xué)001號(hào)課的成績(jī)低于該課程平均成績(jī)時(shí)蝇摸,將該同學(xué)該門課成績(jī)提高5%
Update SC
Set Score = Score * 1.05
Where C# = ‘001’ and Score < some
    ( Select AVG(Score) From SC
    Where C# = '001' ) ;

-- 將張三同學(xué)001號(hào)課的成績(jī)置為其班級(jí)該門課的平均成績(jī)
Update SC
Set Score = ( Select AVG(SC2.Score)
    From SC SC1, Student S1, SC SC2, Student S2
    Where S1.Sclass = S2.Sclass and SC1.S# = S1.S#
    and SC2.S# = S2.S# and S1.Sname='張三'
    and SC1.C# = '001' and SC1.C# = SC2.C# )
Where C# = '001' and S# in ( Select S# From Student
    Where Sname = '張三' ) ;

-- 修正數(shù)據(jù)庫(kù): 修正數(shù)據(jù)庫(kù)的定義, 主要是修正表的定義
-- 修正基本表的定義
alter table tablename
[add {colname datatype, …}]    增加新列
[drop {完整性約束名}]            刪除完整性約束
[modify {colname datatype, …}] 修改列定義

-- 在學(xué)生表中增加兩列Saddr, PID
Alter Table Student Add Saddr char[40], PID char[18] ;
-- 在mysql中
alter table Student add `Saddr` char(40), add `PID` char(18);

-- 將上列表中的Sname列的數(shù)據(jù)類型增加兩個(gè)字符
alter table Student modify Sname char(10);

-- 刪除學(xué)生姓名必須取唯一值的約束
Alter Table Student Drop Unique( Sname );
-- 在mysql中
alter table tablename drop index columnname;

-- 撤銷表
drop table 表名;
-- 與delete的區(qū)別是, drop整個(gè)表包括表格式, 表中所有元組等都會(huì)被刪除, delete仍然會(huì)保留表的基本結(jié)構(gòu).
-- 撤銷數(shù)據(jù)庫(kù)
drop database 數(shù)據(jù)庫(kù)名;
-- 指定當(dāng)前數(shù)據(jù)庫(kù)
use 數(shù)據(jù)庫(kù)名;
-- 關(guān)閉當(dāng)前數(shù)據(jù)庫(kù)
close 數(shù)據(jù)庫(kù)名;



數(shù)據(jù)庫(kù)系統(tǒng)學(xué)習(xí)筆記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夹孔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子琅轧,更是在濱河造成了極大的恐慌埃唯,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹰晨,死亡現(xiàn)場(chǎng)離奇詭異墨叛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)模蜡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門漠趁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人忍疾,你說(shuō)我怎么就攤上這事闯传。” “怎么了卤妒?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵甥绿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我则披,道長(zhǎng)共缕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任士复,我火速辦了婚禮图谷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阱洪。我一直安慰自己便贵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布冗荸。 她就那樣靜靜地躺著承璃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚌本。 梳的紋絲不亂的頭發(fā)上盔粹,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音魂毁,去河邊找鬼玻佩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛席楚,可吹牛的內(nèi)容都是我干的咬崔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼垮斯!你這毒婦竟也來(lái)了郎仆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兜蠕,失蹤者是張志新(化名)和其女友劉穎扰肌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熊杨,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曙旭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晶府。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桂躏。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖川陆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情较沪,我是刑警寧澤鳞绕,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站尸曼,受9級(jí)特大地震影響们何,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骡苞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一垂蜗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧解幽,春花似錦、人聲如沸烘苹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)镣衡。三九已至霜定,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廊鸥,已是汗流浹背望浩。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惰说,地道東北人磨德。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親典挑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酥宴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

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