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