SQL数据基本操作
數據的基本操作
插入表:
create table 系部
(
?系部代碼 char(6) not null primary key,
?系部名稱 varchar(30) not null ,
?系主任 char(8)
)
go
create table 專業
(
?專業代碼 char(4) not null primary key,
?專業名稱 varchar(20) not null,
?系部代碼 char(6) constraint wz11 references 系部(系部代碼)
)
go
create table 班級
(
?班級代碼 char(9) not null primary key ,
?班級名稱 varchar(20) ,
?專業代碼 char(4) constraint wz1 references 專業(專業代碼),
?系部代碼 char(6)? constraint wz2 references 系部(系部代碼),
?備注? varchar(50)
)
go
create table 學生
(
?學號 char(12) not null primary key ,
?姓名 char(8),
?性別 char(2),
?出生日期 datetime,
?入學時間 datetime,
?班級代碼 char(9) constraint wz3 references 班級(班級代碼),
?系部代碼 char(6) constraint wz4 references 系部(系部代碼),
?專業代碼 char(4) constraint wz5 references 專業(專業代碼),
?高考分數 int
)
內容:
insert 系部(系部代碼,系部名稱,系主任) values('01','計算機系','老張')
go
insert 系部(系部代碼,系部名稱,系主任) values('02','經濟管理系','老陳')
go
insert 系部(系部代碼,系部名稱,系主任) values('03','機械系','老李')
go
insert 系部(系部代碼,系部名稱,系主任) values('04','數學系','老梁')
go
?
insert 專業(專業代碼,專業名稱,系部代碼) values('0101','軟件工程','01')
go
insert 專業(專業代碼,專業名稱,系部代碼) values('0102','網絡工程','01')
go
insert 專業(專業代碼,專業名稱,系部代碼) values('0103','信息工程','01')
go
insert 專業(專業代碼,專業名稱,系部代碼) values('0201','工商管理','02')
go
insert 專業(專業代碼,專業名稱,系部代碼) values('0202','物流管理','02')
go
insert 專業(專業代碼,專業名稱,系部代碼) values('0301','模具加工','03')
go
insert 專業(專業代碼,專業名稱,系部代碼) values('0302','機電一化','03')
go
insert 專業(專業代碼,專業名稱,系部代碼) values('0401','應用數學','04')
go
insert 專業(專業代碼,專業名稱,系部代碼) values('0402','金融數學','04')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('010101','軟件工程1班','0101','01','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('010102','軟件工程2班','0101','01','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('010103','網絡工程1班','0102','01','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('010104','網絡工程2班','0102','01','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('010105','信息工程1班','0103','01','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('010106','工商管理1班','0201','02','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('010107','物流管理1班','0202','02','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('010108','模具加工1班','0301','03','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('010109','應用數學1班','0401','04','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('0101010','金融數學1班','0402','04','暫無')
go
insert 班級(班級代碼,班級名稱,專業代碼,系部代碼,備注)
values('0101011','金融數學2班','0402','04','暫無')
go
insert 學生 values('010101000000','劉德華','男','1988-5-5','2010-9-1','010101','01','0101',356)
go
insert 學生 values('010101000001','張學友','男','1988-1-4','2010-9-1','010101','01','0101',354)
go
insert 學生 values('010101000002','梁靜茹','女','1988-2-1','2010-9-1','010101','01','0101',342)
go
insert 學生 values('010101000003','陳奕迅','男','1983-5-3','2010-9-1','010102','01','0101',441)
go
insert 學生 values('010101000004','張韶涵','女','1987-8-6','2010-9-1','010102','01','0101',354)
go
insert 學生 values('010101000005','林俊杰','男','1988-6-6','2010-9-1','010102','01','0101',498)
go
insert 學生 values('010101000006','孫燕姿','女','1984-5-3','2010-9-1','010106','02','0201',522)
go
insert 學生 values('010101000007','周華健','男','1986-8-6','2010-9-1','010106','02','0201',378)
go
insert 學生 values('010101000008','尚雯婕','女','1988-6-6','2010-9-1','010106','02','0201',365)
go
insert 學生 values('010101000009','任賢齊','男','1984-5-3','2010-9-1','010108','03','0301',421)
go
insert 學生 values('010101000010','魏晨','男','1986-8-6','2010-9-1','010108','03','0301',574)
go
insert 學生 values('010101000011','龐龍','男','1988-6-6','2010-9-1','010108','03','0301',452)
go
insert 學生 values('010101000012','劉若英','女','1988-5-3','2010-9-1','0101011','04','0402',354)
go
insert 學生 values('010101000013','李圣杰','男','1989-8-6','2010-9-1','0101011','04','0402',324)
go
insert 學生 values('010101000014','克群','男','1989-2-9','2010-9-1','0101011','04','0402',321)
go
?
--外連接查詢表--------------------------------------------------------
create table 產品
(
?產品編號 char(9) not null ,
?產品名稱 varchar(20)? not null ,
)
go
create table 產品銷售
(
?產品編號 char(9) not null ,
?銷量 int
)
go
?insert 產品 values('001','顯視器')
?insert 產品 values('002','鍵盤')
?insert 產品 values('003','鼠標')
insert 產品銷售 values('001','25')
insert 產品銷售 values('003','35')
insert 產品銷售 values('005','30')
--st_table ------------------------------------------------------
create table st_table
(
?學號 int not null identity,
?姓名 char(8) not null,
?專業方向 varchar(50) not null,
?系部代碼 char(2) not null,
?備注 varchar(50),
?高考分數 int
)
go
insert st_table values('張學友','網絡','01','沒有','411')
insert st_table values('劉德華','計算機','02','沒有','412')
insert st_table values('舒淇','計算機','01','沒有','413')
insert st_table values('梁詠琪','動漫','02','沒有','431')
insert st_table values('楊千嬅','計算機','01','沒有','465')
insert st_table values('李宇春','動漫','02','沒有','485')
insert st_table values('蔡依林','網絡','01','沒有','468')
insert st_table values('鄭源','計算機','02','沒有','510')
insert st_table values('陳楚生','動漫','01','沒有','550')
insert st_table values('張韶涵','計算機','02','沒有','421')
insert st_table values('猛非','動漫','01','沒有','423')
insert st_table values('鄭秀文','網絡','02','沒有','411')
insert st_table values('林俊杰','計算機','01','沒有','511')
insert st_table values('羽泉','計算機','01','沒有','500')
insert st_table values('郭富城','網絡','02','沒有','400')
insert st_table values('黃品源','動漫','02','沒有','589')
insert st_table values('梁朝偉','計算機','02','沒有','530')
insert st_table values('李克勤','網絡','01','沒有','520')
insert st_table values('陳小春','國際金融','02','沒有','512')
insert st_table values('劉若英','證券期貨','02','沒有','421')
insert st_table values('劉嘉玲','房地產金融','01','沒有','428')
insert st_table values('譚詠麟','房地產金融','02','沒有','498')
insert st_table values('張學友','證券期貨','01','沒有','454')
insert st_table values('張衛健','證券期貨','02','沒有','515')
insert st_table values('周傳雄','房地產金融','01','沒有','532')
insert st_table values('周星馳','國際金融','02','沒有','423')
insert st_table values('游鴻明','房地產金融','02','沒有','477')
insert st_table values('言承旭','國際金融','02','沒有','488')
insert st_table values('許志安','國際金融','01','沒有','582')
insert st_table values('葉倩文','房地產金融','01','沒有','495')
insert st_table values('葉世榮','房地產金融','02','沒有','499')
insert st_table values('張雨生','證券期貨','02','沒有','531')
insert st_table values('周潤發','國際金融','01','沒有','531')
insert st_table values('張信哲','證券期貨','01','沒有','424')
insert st_table values('周渝民','證券期貨','02','沒有','412')
insert st_table values('太極樂隊','證券期貨','02','沒有','423')
?
一、連接查詢
前面所講的查詢是單表查詢。若一個查詢時涉及兩個或兩個以上的
表,則稱為連接查詢。連接查詢是關系數據庫中最主要的查詢,包括
等值與非等值查詢、自然連接、自身連接查詢、外連接查詢和復合條
件連接查詢等。交叉連接的語法格式:
?
SELECT?列表列名?FROM?表名1?CROSS?JOIN?表名2
CROSS?JOIN???交叉表連接關鍵字
如:SELECT?*?FROM?學生?cross?join?班級
?
?
1、交叉連接查詢
(1) 把A表中的所有數據,跟B表中的每一條數據進行拼接,從而形成了的新的數據集
新數據集=A表所有記錄?x?B表所有記錄
代碼:SELECT?學生.姓名,學生.性別,班級.班級名稱?FROM?學生?cross?join?班級
?
(2)進行拼接時,加個條件語句
把學生表的每條記錄的班級代碼,與班級表的表的班級代碼進行比較,如果列值相等,則拼接形成一條記錄,否則不拼接。
代碼:SELECT?學生.姓名,學生.性別,班級.班級名稱?FROM?學生?cross?join?班級
WHERE?學生.班級代碼=班級.班級代碼
?
2、自然連接
用來連接兩個表的條件稱為連接條件或連接謂詞,其中,比較運算符主要是:=、>、<、>=、<=、!=
等值連接的過程類似于交叉連接,不過它只拼接滿足連接條件的記錄到結果集中。語法格式為:
SELECT?列表列名?FROM?表名1?JOIN?表名2??
ON?表名.列名=表名2.列名
代碼:SELECT?學生.姓名,學生.性別,班級.班級名稱?FROM?學生?join?班級
ON?學生.班級代碼=班級.班級代碼
?
3、自身連接查詢
連接操作既可在多表之間進行,也可以是一個表與其自己進行連接,稱為表的自身連接。使用自身連接時,必須為表指定兩個別名,以示區別。
代碼:select?a.姓名,b.性別?from?學生?as?a??join?學生?as?b??on?a.學號=b.學號
?
?4、外連接查詢
外連接的結果集不但包含滿足連接條件的行,還包括相應表中的所有行,也就是說,即使某些行不滿足連接條件,但仍需要輸出該行記錄。外連接包括三種:左外連接、右外連接和完全外連接。
?
代碼:SELECT?*?FROM?產品??JOIN?產品銷售???ON?產品.產品編號=產品銷售.產品編號
?
(1)左外連接(LEFT?OUTER?JOIN)
左外連接是結果表中除了包含滿足連接條件的記錄外,還包含左表中不滿足連接條件的記錄。左表中不滿足條件的記錄與右表記錄拼接時,右表的相應列上填充NULL值。左外連接的語法格式為:
SELECT?列表列名?FROM?表名1?LEFT?[OUTER]?JOIN?表名2
ON?表名1.列名=表名2.列名
代碼:
SELECT?*?FROM?產品??right?JOIN?產品銷售
ON?產品.產品編號=產品銷售.產品編號
(2)右外連接(LEFT?OUTER?JOIN)
右外連接是結果表中除了包含滿足連接條件的記錄外,還包含右表中不滿足連接條件的記錄。右表中不滿足條件的記錄與左表記錄拼接時,左表的相應列上填充NULL值。右外連接的語法格式為:
?
SELECT?列表列名?FROM?表名1?RIGHT?[OUTER]?JOIN?表名2
ON?表名1.列名=表名2.列名
代碼:SELECT?*?FROM?產品?LEFT??JOIN?產品銷售
ON?產品.產品編號=產品銷售.產品編號
?
(3)完全外連接(FULL?OUTER?JOIN)
完全外連接是結果表中除了包含滿足連接條件的記錄外,還包含右表中不滿足連接條件的記錄。左(右)表中不滿足條件的記錄與右(左)表記錄拼接時,右(左)表的相應列上填充NULL值。完全外連接的語法格式為
SELECT?列表列名?FROM?表名1?FULL?[OUTER]?JOIN?表名2
ON?表名1.列名=表名2.列名
代碼:
SELECT?*?FROM?產品??full?JOIN?產品銷售
ON?產品.產品編號=產品銷售.產品編號
?
11、合并結果集
使用UNION?語句可以將查詢結果集合并為一個結果集,也就合并操作語法如下:
SELECT?語句
??{UNION?SELECT?語句}[,…n]
參加UNION操作的各結果集的列數必須相同,對應的數據類型也必須相同。
系統將自己動去掉并集的得復記錄
代碼:SELECT?學生.姓名,學生.性別?FROM?學生
??????Union
??????SELECT?學生.姓名,學生.性別?FROM??new-table
5、復合連接條件查詢
前面所介紹的連接查詢中,ON連接條件表達式只有一個條件,允許ON連接表達式有多個連接條件,稱為復合條件連接,或多表連接.
代碼:
SELECT?學生.學號,學生.姓名,學生.性別,班級.班級名稱,專業.專業名稱,
系部.系部名稱
FROM?學生?JOIN?班級?ON?學生.班級代碼=班級.班級代碼
??JOIN?專業?ON?學生.專業代碼=專業.專業代碼
??JOIN?系部?ON?學生.系部代碼=系部.系部代碼
?
二、子查詢
將一個查詢塊嵌套在另一個查詢塊的WHERE?子句或HAVING?短語條件中的查詢叫做嵌套查詢。我們把括號內的查詢塊稱為子查詢或內層查詢,與之相對的概念是父查詢或外層查詢,即包含子查詢的查詢塊。SQL?允許多層嵌套。但是子查詢的SELECT語句中不能使用ORDER?BY?子句,ORDER?BY?只能對最終查詢結果進行排序。
?
1、帶有IN運算符的子查詢(IN運算符的子查詢返回的結果是集合)
SELECT?列名?FROM?表名?WHERE?列名?IN?
(SELECT?列名?FROM?表名?WHERE?列名?IN
?SELECT?列名?FROM?表名?WHERE?列名?IN(1,2,3)
)
代碼?
SELECT?*?FROM?學生?WHERE?班級代碼?IN?
(SELECT?班級代碼?FROM?班級?WHERE?專業代碼?IN
(SELECT?專業代碼?FROM?專業?WHERE?系部代碼?IN
? (SELECT?系部代碼?FROM?系部?WHERE?系部代碼?IN(01))
)
)
?
2、帶有比較運算符的子查詢
父查詢與子查詢之間通過比較運算符連接,便形成了帶有比較運算符的子查詢。
父查詢中的一個表達式與子查詢返回的結果(單值)進行比較
(1)帶有比較運算符的子查詢返回的結果是單值
(2)若IN的子查詢結果集為單值,則”=”符號和IN?可以互換
SELECT?*?FROM?表名?WHERE?列名=
(SELECT?列名?FROM?表名?WHERE?列名=‘X’)
代碼:SELECT?*?FROM?學生?WHERE?出生日期?>=
(SELECT?出生日期?FROM?學生?WHERE?姓名='李圣杰')
實驗現象是查出了年紀最小的
?
3、帶有ANY?或?ALL運算符的子查詢
子查詢返回單值時可以使用比較運算符,而使用ANY?或ALL運算符時還必須同時使用比較運算符,帶有ANY?或ALL?運算符的子查詢的處理過程是:父查詢通過ANY?或ALL運算符將父查詢中的一個表達式與子查返回結果集中的某個值進行比較。
?
代碼:SELECT?*?FROM?st_table?WHERE?高考分數?>=?any
(SELECT?高考分數?FROM?st_table?WHERE?學號?in(25,29))
實驗現象,查出st_table表中分數大于等于學號為25或29的人的記錄
代碼:SELECT?*?FROM?st_table?WHERE?高考分數?>=?all
(SELECT?高考分數?FROM?st_table?WHERE?學號?in(25,29))
實驗現象,查出st_table表中分數大于等于學號為25和29分數的人的記錄
?
4、帶有EXISTS運算符的子查詢
使用EXISTS運算符后,子查詢不返回任何數據,此時,若子查詢結果非空(即至小存在一條記錄)?則父查詢的WHERE?子句返回真(TRUE),否則返回假(FLASE)
代碼:SELECT?*?FROM?st_table?as?a?WHERE?EXISTS
(SELECT?*?FROM?學生?where?a.姓名?=?學生.姓名)
實驗現象:查出兩個表中具有相同姓名的數據
?
?這個app潮流公眾帳號主要是推薦給手機用戶最近最潮的軟件,讓大家隨時跟上時尚。我們會提供給你們最好的服務,喜歡我們就幫我們推薦吧!
?
轉載于:https://www.cnblogs.com/shaoyangjiang/archive/2012/03/15/2398676.html
總結
- 上一篇: 模式 与 原则
- 下一篇: Decorator Pattern -