SQL Server 第三章 結構化查詢語言


SQL腳本:

create database electric;

use electric
go

create table Salvaging(
prj_no int primary key,
prj_name varchar(255),
start_date datetime,
end_date datetime,
prj_status bit
)

insert Salvaging values (20100015,'220kV清經線接地箱及接地線被盜搶修','2010-10-12','2010-10-13',1);
insert Salvaging values (20100016,'沙河站2#公變出線電纜老化燒毀搶修','2010-11-05','2010-11-05',1);
insert Salvaging values (20100001,'西麗站電纜短路燒毀搶修工程','2011-01-03','2011-01-03',1);
insert Salvaging values (20100002,'西麗站電纜接地搶修','2011-01-03','2011-01-05',1);
insert Salvaging values (20100003,'觀瀾站光纜搶修','2011-02-10','2011-02-11',1);
insert Salvaging values (20100004,'小徑墎低壓線被盜搶修','2011-02-15','2011-02-15',1);
insert Salvaging values (20100005,'明珠立交電纜溝蓋板破損搶修','2011-03-02','2011-03-05',0);
insert Salvaging values (20100010,'朝陽圍公變低壓線被盜搶修','2011-03-08','2011-03-10',0);

create table Stock(
mat_no varchar(4) primary key,
mat_name varchar(50),
speci varchar(50),
warehouse varchar(50),
amount int,
unit decimal(8,2),
total decimal(8,2)
)

insert Stock values('m001','護套絕緣電線','BVV-120','供電局1#倉庫',220,89.80,19756.00);
insert Stock values('m002','架空絕緣電線','10KV-150','供電局1#倉庫',30,17.00,510.00);
insert Stock values('m003','護套絕緣電線','BVV-35','供電局2#倉庫',80,22.80,1824.00);
insert Stock values('m004','護套絕緣電線','BVV-50','供電局2#倉庫',283,32.00,9056.00);
insert Stock values('m005','護套絕緣電線','BVV-70','供電局2#倉庫',130,40.00,5200.00);
insert Stock values('m006','護套絕緣電線','BVV-150','供電局3#倉庫',46,null,null);
insert Stock values('m007','架空絕緣電線','10KV-120','供電局3#倉庫',85,14.08,1196.80);
insert Stock values('m009','護套絕緣電線','BVV-16','供電局3#倉庫',90,null,null);
insert Stock values('m011','護套絕緣電線','BVV-95','供電局3#倉庫',164,null,null);
insert Stock values('m012','交聯聚乙烯絕緣電纜','YJV22-15KV','供電局4#倉庫',45,719.80,32391.00);
insert Stock values('m013','戶外真空短路器','ZW12-12','供電局4#倉庫',1,13600.00,13600.00);

create table Out_Stock(
prj_no int,
mat_no varchar(4),
amount int,
get_date datetime,
department varchar(20),
primary key (prj_no,mat_no),
foreign key (prj_no) references Salvaging(prj_no),
foreign key (mat_no) references Stock(mat_no),
)

insert Out_Stock values(20100015,'m001',2,'2010-10-12','工程1部');
insert Out_Stock values(20100015,'m002',1,'2010-10-12','工程1部');
insert Out_Stock values(20100016,'m001',3,'2010-11-05','工程1部');
insert Out_Stock values(20100016,'m003',10,'2010-11-05','工程1部');
insert Out_Stock values(20100001,'m001',2,'2011-01-03','工程2部');
insert Out_Stock values(20100002,'m001',1,'2011-01-03','工程2部');
insert Out_Stock values(20100002,'m013',1,'2011-01-03','工程2部');
insert Out_Stock values(20100003,'m001',5,'2011-02-11','工程3部');
insert Out_Stock values(20100003,'m012',1,'2011-02-11','工程3部');
insert Out_Stock values(20100004,'m001',3,'2011-02-15','工程3部');
insert Out_Stock values(20100004,'m004',20,'2011-02-15','工程3部');
insert Out_Stock values(20100005,'m001',2,'2011-03-02','工程2部');
insert Out_Stock values(20100005,'m003',10,'2011-03-02','工程2部');
insert Out_Stock values(20100005,'m006',3,'2011-03-02','工程2部');
insert Out_Stock values(20100010,'m001',5,'2011-03-09','工程1部');

 

查詢實例:

 

--查詢三個表。
select * from Salvaging;
select * from Stock;
select * from Out_Stock;

--查詢所有配電物資的物資編號、物資名稱、規格。
select mat_no,mat_name,speci from Stock;

--查詢所有配電物資的物資名稱、物資編號、規格和所在倉庫名稱。
select mat_name,mat_no,speci,warehouse from Stock;

--查詢所有配電物資的記錄。
select * from Stock;

--查詢所有搶修工程的搶修天數。
--getdate() 獲取當前系統時間 year(date)獲取年份 month(date)獲取月份 day(date)獲取天 datediff(datepart,start_date,end_date)獲取相差時間
select prj_no,prj_name,datediff(day,start_date,end_date) from Salvaging;

--查詢所有搶修工程的搶修天數,並在實際搶修天數列前加入一個列,此列的每行數據均為‘搶修天數’常量值。
select prj_no,prj_name,'搶修天數',datediff(day,start_date,end_date) from Salvaging;

--用戶可以通過指定別名來改變查詢結果的列標題,語法格式為:列名|表達式 [AS] 列標題  或:列標題=列名|表達式
select prj_no,prj_name,datediff(day,start_date,end_date) '搶修天數' from Salvaging;

--在配電物資庫存記錄表中查詢出所有的倉庫名稱,並去掉結果表中的重復行。
select distinct warehouse from Stock;

--查詢供電局1#倉庫存放的所有物資編號、物資名稱、規格以及數量。
select mat_no,mat_name,speci,amount from Stock where warehouse='供電局1#倉庫';

--查詢所有單價小於80的物資名稱、數量及其單價。
select mat_name,amount,unit from Stock where unit<80;
select mat_name,amount,unit from Stock where not unit>=80;

--查詢單價在50~100之間的物資名稱、數量及其單價。
select mat_name,amount,unit from Stock where unit>=50 and unit<=100;
select mat_name,amount,unit from Stock where unit between 50 and 100;

--查詢存放在供電局1#倉庫和供電局2#倉庫的物資名稱、規格及其數量。
select mat_name,speci,amount from Stock where warehouse in('供電局1#倉庫','供電局2#倉庫');
select mat_name,speci,amount from Stock where warehouse='供電局1#倉庫' or warehouse='供電局2#倉庫';

--查詢既沒有存放在供電局1#倉庫,也沒有存放在供電局2#倉庫的物資名稱、規格及其數量。
SELECT mat_name, speci, amount FROM stock WHERE warehouse NOT IN ('供電局1#倉庫','供電局2#倉庫');

--找出滿足給定匹配條件的字符串,其格式為:[NOT] LIKE  ‘<匹配串>’[ESCAPE ‘<換碼字符>’]
--查詢存放在供電局1#倉庫的物資的詳細情況。
SELECT * FROM stock WHERE warehouse LIKE '供電局1#倉庫'

--查詢所有絕緣電線的物資編號、名稱和規格。
select * from stock where mat_name like '%絕緣電線';

--查詢物資名稱中第三、四個字為“絕緣”的物資編號、名稱和規格。
select * from stock where mat_name like '__絕緣%';

--查詢所有不帶絕緣兩個字的物資編號、名稱和規格。
SELECT mat_num , mat_name, speci FROM stock WHERE mat_name NOT LIKE '%絕緣%'

--查詢物資名稱為‘斷路器_戶外真空’物資信息。
select * from stock where mat_name like '斷路器\_戶外真空' escape '\';

--查詢無庫存單價的物資編號及其名稱。
select mat_no,mat_name from stock where unit is null;

--查詢規格為BVV-120的護套絕緣電線的物資編號、庫存數量及庫存地點。
select mat_no,amount,warehouse from Stock where speci='BVV-120' and mat_name='護套絕緣電線';

--查詢“護套絕緣電線”的物資編號及其單價,查詢結果按單價降序排列。
select mat_no,unit from Stock order by unit desc

--查詢所有物資的信息,查詢結果按所在倉庫名降序排列,同一倉庫的物資按庫存量升序排列。
select * from Stock order by warehouse desc,amount;

--TOP n子句:在查詢結果中輸出前面的n條記錄;
--TOP n PERCENT子句:在查詢結果中輸出前面占結果記錄總數的n%條記錄。
--顯示stock表中,庫存量最大的兩條記錄。
select top 2 * from stock order by amount desc;

/*
--顯示stock表中占總數20%的記錄。(注意,top子句不能和Stock關鍵字一起使用)
select 20 percent * from  stock;
Some Problems
*/

--統計領取了物資的搶修工程項目數。
select count(distinct prj_no) '搶修項目數' from Out_stock;

--查詢使用m001號物資的搶修工程的最高領取數量、最低領取數量以及平均領取數量。
select max(amount) '最高領取數量',min(amount) '最低領取數量',avg(amount) '平均領取數量' from out_stock where mat_no='m001';

--GROUP BY子句可以將查詢結果表按一列或多列取值相等的原則進行分組。
--分組進行聚合函數的聚合
--查詢每個搶修工程項目號及使用的物資種類。
select prj_no,count(*) '物資種類' from out_stock group by prj_no; 

--HAVING可以針對集函數的結果值進行篩選,它是作用於分組計算的結果集;跟在Group By子句的后面,有GROUP BY才有HAVING
--查詢使用了2種以上物資的搶修工程項目號。
select prj_no,count(*) '物資種類' from out_stock group by prj_no having count(*)>2;

--統計存放於供電局2#倉庫的所有物資的總價值。
SELECT mat_name,speci,amount,unit,total FROM stock WHERE warehouse='供電局2#倉庫' COMPUTE  SUM(total)

--統計存放於各個倉庫的物資總價值,並查詢物資名稱、規格、單價、數量等,按倉庫分組顯示查詢結果。
select * from stock order by warehouse compute sum(total) by warehouse

 

--
--連接查詢
--

use electric
go

--查詢項目號為“20100015”搶修項目所使用的物資編號、物資名稱、規格和使用數量
select Stock.mat_no,mat_name,speci,Out_Stock.amount from Stock,Out_Stock where Stock.mat_no=Out_Stock.mat_no and prj_no='20100015';

--查詢同時使用了物資編號為m001和m002的搶修工程的工程號與工程名稱
select A.prj_no from Out_Stock A,Out_Stock B where A.prj_no=B.prj_no and A.mat_no='m001' and B.mat_no='m002';

--
--嵌套查詢
--

--查詢與規格為“BVV-120”的“護套絕緣電線”在同一個倉庫存放的物資名稱、規格和數量
select mat_name,speci,amount from Stock where warehouse in (select warehouse from Stock where speci='BVV-120' and mat_name='護套絕緣電線');

--查詢工程項目為“觀瀾站光纜搶修”搶修所使用的物資編號和名稱
select mat_no,mat_name from Stock where mat_no in (select mat_no from Salvaging where prj_name='觀瀾站光纜搶修');

--查詢出庫存量 超過該倉庫物資 平均庫存量的 物資編號、名稱、規格及數量
select mat_no,mat_name,speci,amount from Stock where amount > (select avg(amount) from Stock);

--
--帶有ANY或ALL謂詞的子查詢
--

--查詢其他倉庫中比供電局1#倉庫的某一物資庫存量少的物資名稱、規格和數量
select mat_name,speci,amount from Stock where warehouse != '供電局1#倉庫' and amount < any (select amount from stock where warehouse = '供電局1#倉庫');

--查詢其他倉庫中比供電局1#倉庫的所有物資庫存量少的物資名稱、規格和數量
select mat_name,speci,amount from Stock where warehouse != '供電局1#倉庫' and amount < all (select amount from stock where warehouse = '供電局1#倉庫');

--
--帶有EXISTS謂詞的子查詢
--

--查詢所有使用了m001號物資的工程項目名稱
select prj_name from salvaging S where exists (select * from out_stock where prj_no=S.prj_no and mat_no='m001');

--查詢沒有使用了m001號物資的工程項目名稱
select prj_name from salvaging S where not exists (select * from out_stock where prj_no=S.prj_no and mat_no='m001');

--
--Union Intersect Except 集合查詢
--

--查詢存放在供電局1#倉庫的物資及單價不大於50的物資
select * from stock where warehouse='供電局1#倉庫' union select * from stock where unit<=50;

--查詢使用了物資編號為m001或m002的搶修工程的工程號
select prj_no from out_stock where mat_no='m001' union select prj_no from out_stock where mat_no='m002';

--查詢存放在供電局1#倉庫且單價不大於50的物資
select * from stock where warehouse='供電局1#倉庫' intersect select * from stock where unit<=50;

--查詢同時使用了物資編號為m001和m002的搶修工程的工程號
select prj_no from out_stock where mat_no='m001' intersect select prj_no from out_stock where mat_no='m002';

--查詢存放在供電局1#倉庫的物資與單價不大於50的物資的差集
select * from stock where warehouse='供電局1#倉庫' except select * from stock where unit<=50;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM