SQL語句與Mysql的語句大體上比較相似。以下是sql server的一套練習題,是很好的數據庫操作語句學習資料,學校的學習資料,在此整理了以下。
數據庫exam:這是一個模擬電子商務,網上直銷的數據,主要銷售計算機配件。該數據庫包含了訂單數據、經銷商基本數據、產品基本數據以及供應商基本數據等。該數據庫共包含6個表,表名分別為:orders、distributors、suppliers、city、items和products。各個表的內容與格式如下:
表1 網上直銷訂單表格,表名為:orders
列名 |
描述 |
數據類型 |
OrderNum |
訂單號碼 |
Int |
OrderDate |
訂購日期 |
Datatime |
DistriNum |
經銷商號碼 |
Int |
PaidDate |
付款日期 |
Datatime |
表2 經銷商表格,表名為:distributors
列名 |
描述 |
數據類型 |
DistriNum |
經銷商號碼 |
Int |
BossName |
經理名稱 |
Char |
Company |
公司名稱 |
Char |
CityCode |
所屬市區代碼 |
Char |
Address |
公司地址 |
Char |
Phone |
公司電話號碼 |
Char |
表3 供應商表格,表名為:suppliers
列名 |
描述 |
數據類型 |
SuppCode |
供應商代碼 |
Char |
SuppName |
供應商名稱 |
Char |
表4 市區表格,表名為:city
列名 |
描述 |
數據類型 |
CityCode |
市區代碼 |
Char |
CityName |
市區名稱 |
Char |
表5 訂單項目表格,表名:items
列名 |
描述 |
數據類型 |
Item |
訂單項目號碼 |
Int |
OrderNum |
訂單號碼 |
Int |
ProdNum |
產品號碼 |
Int |
SuppCode |
供應商代碼 |
Char |
Quantity |
單項定購數量 |
Int |
TotalPrice |
單項總價 |
Money |
表6 產品表格,表名:products
列名 |
描述 |
數據類型 |
ProdNum |
產品號碼 |
Int |
SuppCode |
供應商 |
Char |
Descriptions |
產品名稱 |
Char |
UnitPrice |
產品單價 |
Money |
一、數據表的簡單操作
用SQL語句選取表中所有的列:
1、 查詢exam數據庫中city表中所有的列的內容
select * from city;
2、 查詢exam數據庫中orders表OrderDate列的內容
select OrderDate from orders;
選取惟一的數值:
消除重復關鍵字:distinct (放在select后面)
1、 查詢exam數據庫中orders表中的訂購日期OrderDate,並且相同的訂購日期只顯示一次(distinct)
select distinct OrderDate from orders;
2、對記錄進行操作——選取特定的記錄:
查詢exam數據庫中供應商代碼為HHT的供應商的實際名稱
select SuppName from city where SuppCode= "HHT";
3、對記錄進行操作——排除特定的記錄:
查詢exam數據庫中供應廠代碼不為HHT的所有供應商的實際名稱
select SuppName from city where SuppCode!= "HHT";
3、對數據進行操作——選取介於某一范圍的數據:
查詢exam數據庫的products表中所有單價不超過20元的產品的名稱及其對應的價格
select Descriptions,UnitPrice from products where UnitPrice <= 20;
4、對數據進行操作——選取屬於某一子集合的數據:
in:在...里
查詢exam數據庫中經銷商號碼為1006、1009、1013、1014、1017的經理名稱以及其所在的公司名稱
select DistriNum,BossName,Company from distributors where DistriNum in (1006,1009,1013,1014,1017);
5、對字符串進行操作——選取子字符串:
查詢exam數據庫中所有經銷商的電話區號
select substring(Phone,1,3) from distritubors; //第一位和從這一位開始幾位
查詢exam數據庫中所有經銷商的姓
select substring(BossName,1,1) from distributors;
6、對字符串進行操作——搜索子字符串:
‘%’:表示N個任意字符
查詢exam數據庫中所有經理姓“王”的公司的名稱、電話以及公司地址
select BossName,Company,Phone,Address from distributors where BossName like '王%';
二、一般數據查詢與處理
1、同時執行多個SQL語句:
實現在一次查詢中同時查詢exam數據庫中orders表和distributors表所有列的內容
select * from orders; go select * from distributors; go
2、用order by子句對數據進行排序:
查詢exam數據庫products表格中所有的記錄,查詢結果根據單價由小到大的順序(降序)排序
select * from products order by UnitPrice desc;
3、使用算術運算符:
查詢exam數據庫products表中的所有記錄,並且把每個產品單價顯示成調高10%后的價格(只顯示,數據庫不變)
select ProNum,SuppCode,description,UnitPrice * 1.1from products;
3、 查詢exam數據庫products表中的所有記錄,並且把每個產品單價顯示成8折后的價格
select ProNum,SuppCode,description,UnitPrice * 0.8 from products;
5、搜索單一長度的任意字符串:
‘_’:表示一個任意字符
查詢exam數據庫suppliers表中供應商代碼的第1、3位分別為H和T的所有供應商的記錄
select * from suppliers where SuppCode like "H_T";
6、使用常用的字符串函數:
查詢exam數據庫distribuotrs表中經銷商號碼為1001的地址字符串的長度
select len(Address) from distributors where DistriNum = "1001";
7、查詢字符串的長度
select len(‘中華人民共和國’);
8、將字符串‘I LOVE SQL SERVER‘的所有字母轉換成小寫字母
select LOWER('I LOVE SQL SERVER');
9、將字符串‘abcdefg’中的小寫字母轉換成大寫字母
select UPPER('abcdefg');
10、將字符串‘ abcdefg’前的空格去掉
select ltrim(' abcdefg);
11、將字符串‘uvwxyz ’后的空格去掉
select rtrim('uvwxyz ');
12、將字符串‘我喜歡數據庫’中的字符由左至右反轉排列
select REVERSE('我喜歡數據庫');
13、求出字符A的ASCII碼
select ASCII('A');
14、判斷數字5的正負號,如果正返回1,負返回-1
select SIGN(5);
15、使用常用的數學函數:
計算出以下三個數的絕對值:-2.5,0.0,7.4
select ABS(-2.5),ABS(0.0),ABS(7.4);
16、返回分別大於或等於以下數字的最小整數:5.5,-7.2,0.0
select floor(5.5),floor(-7.2),floor(0.0);
17、返回π(PI)的值
select PI();
18、返回630.67的近似值,並將該數分別四舍五入到1、-2、3、0長度的小數
select ROUND(630.67,1),ROUND(630.67,-2),ROUND(630.67,3),ROUND(630.67,0);
19、返回以下3個數的平方值:4、-6,6.6
select SQUARE(4),SQUARE(-6),SQUARE(6.6);
20、返回以下3個數的算數平方根:4,0,50
select SQRT(4),SQRT(0),SQRT(50);
21、計算Cos(3.1415926)的值 sin(3.14159260) ctg(3.14) tg(3.1415926)
select COS(3.1415926),SIN(3.14159260),COT(3.14),TAN(3.1415926);
22、計算2的自然對數、指數值
select LOG(2),EXP(2);
23、計算1000的以10為底的對數
select LOG10(1000);
24、計算2的10次方
select POWER(2,10);
三、常用函數
常用的集總函數的應用:
1、 查詢exam數據庫products表中共銷售多少種產品
select COUNT(*) from products;
2、 查詢exam數據庫items表中代碼為HSC的供應商已訂貨的總金額
select SuppCode,SUM(TotalPrice) from items where SuppCode = 'HSC';
3、 查詢exam數據庫products表中所有供應商所供應的貨品的平均單價
select SuppCode,AVG(UnitPrice) from products group by SuppCode;
4、 查詢exam數據庫products表中每一個供應商產品的最高單價/最低單價
select SuppCode,MAX(UnitPrice),MIN(UnitPrice) from products group by SuppCode;
6、時間函數:
(1)獲取當前時間
select getdate();
(2)、在1991-07-10 2:30:00.000時間上增加21天
select dateadd(d,21,’ 1991-07-10 2:30:00.000’);
(3)、返回1991-07-10 2:30:00.000五天前的時間
select DATEADD(D,-5,'1991-07-10 2:30:00.000');
(4)、返回兩個日期間隔的時間
select DATEDIFF(D,'02/20/1999','02/28/1999');
(5)、以字符串形式返回當天幾年
select DATENAME(Y,GETDATE());
(6)、以整數形式返回當天幾號
select DATEPART(D,GETDATE());
(7)、查詢當前UTC時間(協調時間)
select GETUTCDATE();
四、高級數據查詢與處理
1、在一個select語句中使用多個表格:
查詢exam數據庫中每一個經銷商所有的訂單數據,列出經銷商號碼、公司名稱、電話號碼以及訂貨日期
select distributors.DistriNum,Company,Phone,OrderDate from distributors,orders where orders.DistriNum = distributors.DistriNum
2、在select語句中使用子查詢:
查詢exam數據庫中與經理名稱為‘王為’的經銷商同在一個市區的所有經銷商的數據內容
select * from distributors where CityCode=(select CityCode from distributors where BossName='王為');
3、用union運算符實現從不同的表格抽取相同格式的數據:
查詢exam數據庫中單價不大於25元或者是已訂貨項目中數量小於2的產品數據
select ProdNum,SuppCode,Description,UnitPrice from products where UnitPrice <= 25 union select ProdNum,SuppCode,Quantity from items where Quantity <2
4、添加記錄:
在orders表中添加一筆記錄,OrderNum為119,OrderDate為1905-06-8,DistriNum為1022,PaidDate為1905-06-9
insert into orders(OrderNum,OrderDate,DistriNum,PaidDate) values(119,1905-06-8,1022,1905-06-9);
5、刪除記錄:
刪除orders表中OrderNum為119的記錄
delete from orders where OrderNum = 119
6、更新記錄:
將orders表中訂單號為118的訂單的訂購日期改為2003-07-11
update orders set OrderDate = "2003-07-11" where OrderNum = 118
7、實現查詢exam數據庫中每一個經銷商的訂單號碼(orders表中)與經銷商公司所屬市區的代碼(ditributoirs表中)
select orders.DistriNum,OrderNum,distributors.CityCode from orders,distributors where orders.DistriNum = distributors.DistriNum
8、實現查詢exam數據庫中公司在宣武區的所有經銷商的數據內容
select * from distributors where CityCode= (select CityCode from city where CityName='宣武區')
9、實現查詢exam數據庫中訂單號碼為100對應的經銷商的情況
select * from distributors where DistriNum= (select DistriNum from orders where OderNum = 100)
五、設計數據庫
用T-SQL語句實現默認值與列的結合:
默認值創建:create default 關鍵字 as XX
綁定默認值:sp_bindefault ‘默認值名’,’表名.[列名]’
重命名默認值:exec sp_rename ‘舊名稱’,’新名稱’
1.在exam數據庫中新建名為moren的默認值,值為100,並把該默認值與orders表的OrderNum列結合(sp_bindefault)
create default moren as 100
go
sp_bindefault 'moren','orders.[OrderNum]'
go
sp_bindefault 將新默認值綁定到列(盡管最好使用 DEFAULT 約束)或者綁定到別名數據類型。原有默認值將被覆蓋。
2、新建SQL查詢,輸入Transact-SQL語句,解除(sp_unbindefault)上步中建立的默認值與列的結合,並刪除(drop)該默認值。
sp_unbindefault 'orders.[OrderNum]' go drop default moren go
3、建立新的用戶自定義的數據類型:bigint,允許NULL值,類型名稱為newtype,
sp_addtype newtype,'bigint','null'
4、建立新的名為newrule的規則(create rule newrule as @values),並把這個規則與orders表的OrderNum列結合(sp_bindrule)
create rule newrule as @value between 100 and 150
go
sp_bindrule 'newrule','orders.[OrderNum]'
go
5、解除上步中建立的規則與列的結合,並刪除該規則。操作成功后,保存該查詢
sp_unbindrule 'orders.[OrderNum]' go drop rule newrule go
6、建立新的名為newview的視圖,建立orders表格中的OrderNum、OrderDate列的視圖
create view newview
as
select OrderNum,OrderDate from orders go select * from newview
7、刪除上步中建立的視圖
drop view newview
六、存儲過程和觸發器
創建存儲過程:
創建存儲過程:create procedure 名稱
執行存儲過程:exec 名稱
1、在exam數據庫中新建名為storedproc的存儲過程,用來查詢orders表中OrderNum和OrderDate的列,並執行該存儲過程
create procedure storedproc as select OrderNum,OrderDate from orders go exec storedproc go
2、重命名存儲過程:
重命名為newproc
sp_rename storedproc,newproc
3、刪除存儲過程:
刪除存儲過程:drop proc 名稱
drop procedure newproc
4、創建觸發器:
create trigger 觸發器名
on 表名
for XX ——創建XX操作觸發器
建立名為newtrigger的觸發器,規定當orders表的OrderNum列的數值發生變化的時候,顯示出‘訂單號碼已被更改,觸發器起到作用’,再更改orders表的OrderNum列的數值以觸發該觸發器
create trigger newtrigger
on orders
for update as if update(OrderNum)
print '訂單號碼已被更改,觸發器起到作用。'
go
//例如
update orders set OrderNum='100' where OrderNum='101'
go
5、查看系統內所有的觸發器列表:
顯示出系統內全部的觸發器
select * from sysobjects where XTYPE='tr'
七、數據庫的管理和數據索引
增加數據庫空間:
用企業管理器新建一個名為module7的數據庫,將主要數據庫文件和日志文件分別命名為module7_Data.MDF和module7_Log.LDF,大小都設置成1M(默認值)並將這兩個文件存放在C盤的根目錄下;打開查詢分析器,加入名為modu2.ldf的文件,使得數據庫module7的日志文件容量增大5M,此時該數據庫顯示的大小為7M
alter database module7 add file ( name=modu2, filename=’c:\modu2.ldf’, size=5, filegrowth=1 )
1、縮小數據庫空間:
將上步建立的module7數據庫的日志文件的大小縮小為原來的一半
dbcc shrinkdatabase(module7,50) //50為50%
2、刪除數據庫:
刪除module7數據庫
drop database module7
3、創建索引:
創建索引:create unique/clustered/nonclustered index 索引名 on 表名(列名)
唯一值/聚集索引/非聚集索引
建立名為theindex的索引,orders表OrderNum,唯一值
create unique index theindex on orders(OrderNum)
4、重命名索引:
將上步建立的索引重命名為newindex
exec sp_rename ‘orders.theindex’,’newindex’,’index’
5、刪除索引:
刪除建立的索引
drop index orders.newindex