1. 程式人生 > >簡單全面的SQL語法講解與詳細例項步驟

簡單全面的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