簡單全面的SQL語法講解與詳細例項步驟
MYSQL查詢
參考Jennifer Widom的Pdf
簡介:MySql資料庫是一種關係型的資料庫,SQL語言資料庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關係資料庫系統。
內容簡介:本文將從SQL語言的四大功能DDL,DML,DCL以及其他命令詳細講解SQL語法。
1.DDL (Data Definition Language )資料庫定義語言
用於定義資料庫的三級結構,包括外模式、概念模式、內模式及其相互之間的映像,定義資料的完整性、安全控制等約束
DDL不需要commit.
命令 | 作用 | 舉例 |
---|---|---|
create | 建立資料庫,表等 | create database databasename |
drop | 刪除資料庫,表等 | drop database databasename |
alter | 修改資料庫,表等 | Alter table table_name add column_name column_type [default 預設值] |
… | … | … |
2.DML (Data Manipulation Language)資料操縱語言
包括select/insert/delete/update。由DBMS提供,用於讓使用者或程式設計師使用,實現對資料庫中資料的操作。
DML分成互動型DML和嵌入型DML兩類。
依據語言的級別,DML又可分成過程性DML和非過程性DML兩種。
需要commit.
3.DCL(Data Control Language)資料庫控制語言 授權,角色控制等
例如GRANT 授權 /REVOKE 取消授權。
4.TCL(Transaction Control Language)事務控制語言
SAVEPOINT 設定儲存點 /ROLLBACK 回滾 /SET TRANSACTION
綜上,SQL主要分成四部分:
(1)資料定義。(SQL DDL)用於定義SQL模式、基本表、檢視和索引的建立和撤消操作。
(2)資料操縱。(SQL DML)資料操縱分成資料查詢和資料更新兩類。資料更新又分成插入、刪除、和修改三種操作。
(3)資料控制。包括對基本表和檢視的授權,完整性規則的描述,事務控制等內容。
(4)嵌入式SQL的使用規定。涉及到SQL語句嵌入在宿主語言程式中使用的規則。
基礎的語法結構應該是
select A1,A2,A3...An
from R1,R2,R3...Rn
where condition
下面開始運用幾個資料表進行每種語法的實戰。提供以下資料集。
需要注意的是sql不區分大小寫。結尾分號
college(cName,statem,enrollment) -- 包含大學名字,地區,和錄取人數
student(sID,sName,GPA,sizeH) -- 學生編號,高中學校名字,GPA,學校規模
apply(sID,cName,major,decision) -- 學生編號,申請學校名字,申請專業,申請結果
資料集具體如下:
college(cName,statem,enrollment) – 包含大學名字,地區,和錄取人數
student(sID,sName,GPA,sizeH) – 學生編號,高中學校名字,GPA,學校規模
apply(sID,cName,major,decision) – 學生編號,申請學校名字,申請專業,申請結果
SQL/Basic SELECT Statement
select
- GPA大於3.7的學生姓名和編號
select sID,sName
from student
where GPA>3.7;
- 選擇學生的sName和GPA,滿足這些學生高中規模SizeHS<1000,申請了Stanford的CS專業,同時得到錄取結果。
select sName,GPA,decision
from student s,apply a
where s.sID = apply.sID
and sizeHS<1000 and cName='Stanford' and major='CS';
- ids,names and gpas,cname,enrollment of students
select s.sid,sname,gpa,c.cname,enrollment
from student s,apply a,college c
where s.sid=a.sid and a.cname=c.cname;
distinct
- 選擇有重複和不重複的sID/major(distinct)
select sid,major
from apply;
select distinct sid,major
from apply;
order by
- 以gpa對學生姓名進行排序並選擇出gpas
- 降序升序
- 限制輸出個數,即輸出前幾名之類的意思
- 以gpa做第一排序,sname做第二排序
select sname,gpa from student order by gpa desc;
select sname,gpa from student order by gpa asc;
select sname,gpa from student order by gpa desc limit 3;;
select sname,gpa from student order by gpa desc limit 5;
select sname,gpa from student order by gpa,sname;
like predicate
- 輸出學生編號和專業,滿足申請了含有bio字母的專業(類似生物等)
select sid,major
from apply
where major like '%bio%';
*
- 返回student這個表的所有屬性
select *
from student;
Using arithmetic within SQL clauses
在SQL子句中使用算術
- 返回某種加權GPA
select sid,sname,sizeHS,gpa,gpa*(sizeHS/1000.0)
from student;
select sid,sname,sizeHS,gpa,gpa*(sizeHS/1000.0) as scaleGPA
from student;
Self join自連線
- 返回有同樣GPA的學生(含自己==自己的情況和不含自己的情況)
select s1.sname,s1.gpa,s2.sname,s2.gpa
from student s1,student s2
where s1.gpa=s2.gpa;
select s1.sname,s1.gpa,s2.sname,s2.gpa
from student s1,student s2
where s1.gpa=s2.gpa and s1.sname<>s2.sname;
Union
select sname from student
union
select cname from college;
select sname from student
union all
select cname from college;
Subqueries in Where
in/not in
- 申請了cs的學生名字
select sid,sname
from student
where sid in
(select sid
from apply
where major ='cs');
- 申請了cs但是沒有ee的學生gpa
select gpa
from student
where sid in
(select sid from apply where major='cs')
and sid not in
(select sid from apply where major='ee');
Exists/Not Exists
- 最高GPA學生的GPA和名字
select sname,gpa
from student s1
where not exists
(select *
from student s2
where s2.gpa>s1.gpa);
All/Any
- 最高GPA學生的GPA和名字
select sname,gpa
from student
where gpa>=all(
select gpa
from student);
select sname,gpa
from student s1
where gpa>all(
select gpa from student s2
where s1.sid<>s2.sid);
From
- 加權gpa與gpa差距大於1的學生
select *
from(select sid,sname,gpa,gpa*(sizeHS/1000.0) as scaledGPA from student) as G
where abs(scaledGPA-GPA)>1.0;
The Join family of operators
內連線
- 選擇學生的sName和GPA,滿足這些學生高中規模SizeHS<1000,申請了Stanford的CS專業,同時得到錄取結果。
select sName,GPA,decision
from student s,apply a
where s.sID = apply.sID
and sizeHS<1000 and cName='Stanford' and major='CS';
也可以用using連線
select sName,GPA,decision
from student join apply
using(sid)
where sizeHS<1000 and cName='Stanford' and major='CS';
連線超過兩個表
select a.sid,sname,gpa,a.cname,enrollment
from apply a,student s,college c
where a.sid=s.sid and a.cname=c.cname;
自然連線
- 選擇學生的sName和GPA,滿足這些學生高中規模SizeHS<1000,申請了Stanford的CS專業,同時得到錄取結果。
select sName,GPA,decision
from student natural join apply
where sizeHS<1000 and cName='Stanford' and major='CS';
連線超過兩個表
select apply.sid,sname,gpa,apply.cname,enrollment
from(apply natural join student)natural join college;
左連線
- 學生的錄取資訊:姓名/ID/大學名字/申請專業
select sname,sid,cname,major
from student left join apply using(sid);
全連線(笛卡爾集)
- 學生的錄取資訊:姓名/ID/大學名字/申請專業
select sname,sid,cname,major
from student full join apply using(sid);
描述性計算
sum/avg/min/max
- 返回平均GPA
- 返回總GPA
- 返回最小GPA
- 返回最大GPA
- 計數count
select avg(gpa) from student;
select sum(gpa) from student;
select min(gpa) from student;
select max(gpa) from student;
select count(*) from student;
Group by
- 返回每個大學專業數
select cname,count(distinct sid)
from apply
group by cname;
select cname,sum(distinct sid)
from apply
group by cname;
having
- 查詢申請數小於5的大學
select cname,count(*)
from apply
group by cname
having count(*)<5
NULL
insert into student values(432,'klevin',null,1500)
select sid from student where sname is null;
select count(*)
from student
where sname is null;
INSERT
insert into Table values(A1,A2,..An)
insert into Table values select-statement
Delete
delete from Table where condition
Update
update Table
set attr = Expreesion
where condition