SQL學習小記
/**************************************建立表*********************************************/
//建立表-定義主鍵
CREATE TABLE T_Person(
FId INTEGER,
FName VARCHAR(20),
FAge INTEGER DEFAULT '18',
PRIMARY KEY (FId)
)
/**************************************表關聯-外來鍵*********************************************/
//公司表
CREATE TABLE T_FIRM(
FId INTEGER,
FName VARCHAR(20),
FAddress VARCHAR(10),
PRIMARY KEY (FId)
)
//員工表-外來鍵CId 關聯T_FIRM表FId
CREATE TABLE T_STAFF(
PId INTEGER,
PName VARCHAR(20),
CId INTEGER,
PRIMARY KEY (FId),
FOREIGN KEY (CId) REFERENCES T_FIRM (FId)
)
/**************************************修改資料庫表*********************************************/
//新增列欄位
ALTER TABLE T_STAFF ADD FSex VARCHAR(10)
//去除列欄位
ALTER TABLE T_STAFF DROP Column FSex
/**************************************資料的增改刪*********************************************/
//建表
create table T_PERSON(PId INTEGER ,PName VARCHAR ,PSex VARCHAR,PAge integer ,PRIMARY KEY (PId))
//插入資料
insert into T_PERSON (PId , PName , PSex , PAge ) values (1,'Jack','男',13)
//修改表中的資料
update T_PERSON set PAge='18',PSex='男' where PName='Juice'
//刪除表中資料
delete frome T_PERSON where PAge>17
/**************************************資料的簡單查詢******************************************/
select FName,FAge as '年齡',FSalary from T_Worker
select FName from T_Worker where FAge>30 and FSalary>5000
select * from T_Worker order by FAge asc
/**************************************過濾查詢**********************************************/
SELECT * FROM T_Worker WHERE (FAgeBETWEEN 18 AND 20) OR ( FAgeBETWEEN 30 AND 50 )
//MIN,MAX,SUM,AVG,COUNT---------聚合計算
/**************************************資料分組**********************************************/
//使用GROUP BY子句來完成資料的分組!分組的目的也是為了進行聚合運算~可以把這個分組看成一個臨時的結果集
//資料分組~將表中的資料,按表中的欄位來進行分組,然後再對這些分組進行聚合運算,MIN,MAX,SUM,AVG,COUNT的計算
SELECT PCity FROM T_Product GROUP BY PCity
SELECT PCity,COUNT(PCity) AS '數量' FROM T_Product where PKind='日用品類' GROUP BY PCity
select PCity,max(PPrice) from T_Product group by PCity
select PCity,PKind,count(*) as '數量' from T_Product group by PCity,PKind
select PCity,max(PPrice) as '價格最大' ,min(PPrice) as '價格最小' from T_Product group by PPrice
/***********************************HAVING語句分組進行過濾***********************************/
//聚合函式不能在WHERE語句中使用
//先把表中資料按PCity來分組,然後篩選出記錄條數大於1的部分!
select PCity from T_Product group by PCity HAVING count(PCity)>1
select PCity,max(PPrice) from T_Product group by PCity HAVING count(PCity)>1
select PCity,min(PPrice) from T_Product group by PCity HAVING count(PCity)>1
//1.HAVING子句需要放在GROUP BY子句之後!
//2.HAVING子句不能包含未分組的列名,就是沒寫在GROUP BY後面的~
/****************************************limit分頁*****************************************/
select * from T_Product limit 5 , 3
//5 = startIndex,3=size 第5條資料開始取3條
/**************************************抑制資料重複****************************************/
//DISTINCT是針對整個結果集來進行資料重複抑制的,而不是針對每一個列!!!
SELECT DISTINCT PCity FROM T_Product
SELECT DISTINCT PKind,PCity FROM T_Product
/**************************************欄位間計算****************************************/
FNum as '商品總價' from T_Product
select,PPrice FNum as '總價' from T_Product where PPrice
FNum>5000/**************************************聯合結果集****************************************/
//UIO/">NION運算子-----把多個查詢結果集放到一個結果集
SELECT '商品最高單價',MAX(PPrice) FROM T_Product
UNION
SELECT '商品最低單價',MIN(PPrice) FROM T_Product
UNION
SELECT '員工最高薪資',MAX(FSalary) FROM T_Worker
UNION
SELECT'員工最低薪資',MIN(FSalary) FROM T_Worker
/**************************************索引與約束****************************************/
CREATE INDEX idx_person_union ON T_Worker(FName,FAge,FSex)
ALTER TABLE T_Person ADD PRIMARY KEY(FId)
ALTER TABLE T_Person ADD CONSTRAINT FOREIGN KEY(PId) REFERENCES T_FIRM(FId)
/**********************************表連線來操作多個表*************************************/
1.內連線(INNER JOIN) ------返回到結果集中僅包含符合條件的行
select * from T_Student inner join T_Class on T_Student.Class_id=T_Class.Class_id
select SId,SName,Class_name from T_Student inner join T_Class on T_Student.Class_id=T_Class.Class_id
select SId,SName,Class_name,Dorm_name from T_Student inner join T_Class on T_Student.Class_id=T_Class.Class_id inner join T_Dorm on T_Student.Dorm_id=T_Dorm.Dorm_id
2.外連線(LEFT OUTER JOIN === RIGHT OUT JOIN) ------返回到結果集中的不僅包含符合條件的行,還包括左表(左外連線)、右表(右外連線)或者兩個連線表(完全連線)中的所有資料行!
select * from T_Student left outer join T_Class on T_Student.Class_id=T_Class.Class_id
select * from T_Student right outer join T_Class on T_Student.Class_id=T_Class.Class_id //不支援sqlite
select * from T_Student full outer join T_Class on T_Student.Class_id=T_Class.Class_id//不支援sqlite
3.交叉連線(cross join)
SELECT * FROM T_Student cross join T_Class
4.自連線(INNER JOIN)---即連線關鍵字的兩邊都是同一個表
select a.C_Name,b.C_Name from T_City as a inner join T_City as b on a.C_Id=b.B_Id