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;