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ù)
--- 創(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ù)名;