第六講 SQL語言概述

SQL語言概述

  • 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ù)庫

可定義的數(shù)據(jù)類型
--- 創(chuàng)建一個(gè)數(shù)據(jù)庫
create database Learn_sql_SCT;
-- 刪除一個(gè)數(shù)據(jù)庫
drop database Learn_sql_SCT;
-- 切換一個(gè)數(shù)據(jù)庫
use learn_sql_SCT;
-- 定義一個(gè)學(xué)生表Student
-- 反引號(hào)它是為了區(qū)分mysql的保留字與普通字符而引入的符號(hào). 我在這里使用mysql進(jìn)行練習(xí), 為了避免沖突, 把表名和列名括起來
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ù)庫和表(使用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');

-- 檢索語句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é)束, 所以這樣寫的好處是語句清晰 
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 表示選擇出來的結(jié)果(做投影)沒有重復(fù)
-- 在選課表中, 檢索成績大于80分的所有學(xué)號(hào)(有重復(fù)示例)
select `S#` from `SC` where Score>80;
-- 在選課表中, 檢索成績大于80分的所有學(xué)號(hào)(無重復(fù)示例)
select distinct `S#` from `SC` where Score>80;

-- 根據(jù)選擇出來的結(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)并按成績由高到低順序顯示
-- 降序排列
select `S#` from `SC` 
where `C#`='002' and Score > 80 
order by Score desc;

-- 模糊查詢問題
-- 含有"like"或者"not like"來表示 "字符串", 匹配規(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)課成績由高到低順序顯示所有學(xué)生的姓名(二表連接)
-- 表名.屬性名的方式限定該屬性屬于哪個(gè)表, 如果屬性只出現(xiàn)一次, 也可以不加
select Sname from Student, SC  
where Student.`S#`=SC.`S#` and  SC.`C#` = '001' 
order by Score desc;

-- 按 數(shù)據(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'的, 最后連接起來即可
select SC1.`S#` from SC SC1, SC SC2  where SC1.`C#`='001' and SC2.`C#`='002' and SC1.`S#`=SC2.`S#`;

-- 求'001'號(hào)課成績比'002'號(hào)課成績高的所有的學(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), 將檢索到的成績及格同學(xué)的記錄新增到該表中
Insert Into SCt (S#, C#, Score)
    Select S#, C#, Score From SC
    Where Score>=60 ;
-- 追加成績優(yōu)秀同學(xué)的記錄
Insert Into SCt (S#, C#, Score)
    Select S#, C#, Score From SC
    Where Score>=90 ;
--新建Table: St(S#, Sname, avgScore), 將檢索到的同學(xué)的平均成績新增到該表中
-- 此SELECT語句的書寫語法后面再解釋
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é)(簡單的嵌套子查詢)
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)課的成績低于該課程平均成績時(shí),將該同學(xué)該門課成績提高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í)該門課的平均成績
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ù)庫: 修正數(shù)據(jù)庫的定義, 主要是修正表的定義
-- 修正基本表的定義
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ù)庫
drop database 數(shù)據(jù)庫名;
-- 指定當(dāng)前數(shù)據(jù)庫
use 數(shù)據(jù)庫名;
-- 關(guān)閉當(dāng)前數(shù)據(jù)庫
close 數(shù)據(jù)庫名;



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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容