(1)表名:購物信息 購物人 商品名稱 數量 A 甲 2 B 乙 4 C 丙 1 A 丁 2 B 丙 5 …… 給出所有購入商品為兩種或兩種以上的購物人記錄 答:select * from 購物信息 where 購物人 in (select 購物人 from 購物信息 group by 購物人 having count(*) >= 2); (2)表名:成績表 姓名 課程 分數 張三 語文 81 張三 數學 75 李四 語文 56 李四 數學 90 王五 語文 81 王五 數學 100 王五 英語 49 給出成績全部合格的學生信息(包含姓名、課程、分數),注:分數在60以上評為合格 答:select * from 成績表 where 姓名 not in (select distinct 姓名 from 成績表 where 分數 < 60) 或者: select * from 成績表 where 姓名 in (select 姓名 from 成績表 group by 姓名 having min(分數) >=60) (3)表名:商品表 名稱 產地 進價 蘋果 煙台 2.5 蘋果 雲南 1.9 蘋果 四川 3 西瓜 江西 1.5 西瓜 北京 2.4 …… 給出平均進價在2元以下的商品名稱 答:select 名稱 from 商品表 group by 名稱 having avg(進價) < 2 (4)表名:高考信息表 准考證號 科目 成績 語文 119 數學 108 物理 142 化學 136 物理 127 數學 149 英語 110 語文 105 英語 98 化學 129 …… 給出高考總分在600以上的學生准考證號 答:select 准考證號 from 高考信息表 group by 准考證號 having sum(成績) > 600 (5)表名:高考信息表 准考證號 數學 語文 英語 物理 化學 108 119 98 127 136 149 105 110 142 129 …… 給出高考總分在600以上的學生准考證號 答:select 准考證號 from 高考信息表 where (數學+語文+英語+物理+化學) > 600 (四部分) (一)表名:club id gender age M 19 F 30 F 27 F 16 M 32 …… 查詢出該俱樂部里男性會員和女性會員的總數 答:select gender,count(id) from club group by gender (二)表名:team ID(number型) Name(varchar2型) a b b a c c 要求:執行一個刪除語句,當Name列上有相同時,只保留ID這列上值小的 例如:刪除后的結果應如下: ID(number型) Name(varchar2型) a b c 請寫出SQL語句。 delete from team where id not in (select min(id) from team group by name) (三)表名:student name course score 張青 語文 72 王華 數學 72 張華 英語 81 張青 物理 67 李立 化學 98 張燕 物理 70 張青 化學 76 查詢出“張”姓學生中平均成績大於75分的學生信息 答:select * from student where name in (select name from student where name like '張%' group by name having avg(score) > 75) 1.一道SQL語句面試題,關於group by表內容: info 表 date result 2005-05-09 win 2005-05-09 lose 2005-05-09 lose 2005-05-09 lose 2005-05-10 win 2005-05-10 lose 2005-05-10 lose 如果要生成下列結果, 該如何寫sql語句? win lose 2005-05-09 2 2 2005-05-10 1 2 答案: (1) select date, sum(case when result = "win" then 1 else 0 end) as "win", sum(case when result = "lose" then 1 else 0 end) as "lose" from info group by date; (2) select a.date, a.result as win, b.result as lose from (select date, count(result) as result from info where result = "win" group by date) as a join (select date, count(result) as result from info where result = "lose" group by date) as b on a.date = b.date; 2.表中有A B C三列,用SQL語句實現:當A列大於B列時選擇A列否則選擇B列,當B列大於C列時選擇B列否則選擇C列 select (case when a > b then a else b end), (case when b > c then b else c end) from table; 3.請取出tb_send表中日期(SendTime字段)為當天的所有記錄? (SendTime字段為datetime型,包含日期與時間) select * from tb where datediff(dd,SendTime,getdate())=0 4.有一張表,里面有3個字段:chinese,math,english。其中有一條記錄chinese 70分,math 80分,english 58分,請用一條sql語句查詢出所有記錄並按以下條件顯示出來(並寫出您的思路): 大於或等於80表示excellent,大於或等於60表示pass,小於60分表示fail。 顯示格式: 以上面的chinese 70分,math 80分,english 58分 chinese math english pass excellent fail select (case when chinese >= 80 then "excellent" when chinese >= 60 then "pass" else "fail" end) as chinese, (case when math >= 80 then "excellent" when math >= 60 then "pass" else "fail" end) as math, (case when english >= 80 then "excellent" when english >= 60 then "pass" else "fail" end) as english from grade; 5.請用一個sql語句得出結果 從table1,table2中取出如table3所列格式數據,注意提供的數據及結果不准確,只是作為一個格式向大家請教。 如使用存儲過程也可以。 table1 月份mon 部門dep 業績yj ------------------------------- 一月份 01 10 一月份 02 10 一月份 03 5 二月份 02 8 二月份 04 9 三月份 03 8 table2 部門dep 部門名稱dname -------------------------------- 國內業務一部 國內業務二部 國內業務三部 國際業務部 table3 (result) 部門dep 一月份 二月份 三月份 -------------------------------------- 10 null null 10 8 null null 5 8 null null 9 ------------------------------------------ select t1.dep, sum(case when mon = 1 then yj else 0 end) as jun, sum(case when mon = 2 then yj else 0 end) as feb, sum(case when mon = 3 then yj else 0 end) as mar from t1 right join t2 on t1.dep = t2.dep group by t1.dep; 題目一、 有兩個表: TableX有三個字段Code、 Name、 Age、 其中Code為主鍵; TableY有三個字段Code、 Class、Score, 其中Code + Class 為主鍵。兩表記錄如下: Code Name Age Code Class Score 張三 22 97001 數學 80 趙四 21 97002 計算機 59 張飛 20 97003 計算機 60 李五 22 97004 數學 55 1、請寫出SQL,找出所有姓張的學生,並按年齡從小到大排列; 2、請寫出SQL,取出計算機科考成績不及格的學生; 3、通過等值聯接,取出Name、Class、Score,請寫出SQL即輸出結果 4、通過外聯接,取出每個學生的Name、Class、Score、請寫SQL輸出結果 5、請寫SQL,在TableX 表中增加一條學生記錄(學號:97005 姓名:趙六 年齡:20); 6、李五的年齡記錄錯了,應該是21,請寫SQL,根據主鍵進行更新; 7、請寫SQL,刪除TableX中沒有考試成績的學生記錄,請使用not in條件; 題目二、 有兩個表定義如下: create tableindividual ( firstname varchar2(20) not null lastname vatchar2(20) not null birthdate date gender varchar2(1) initial number(2) farorite varchar2(6) type varchar2(8) ); 在此表中建唯一索引 firstname + lastname create table chile_detail( firstname varchar2(20) lastname varchar2(20) cname varchar2(8) coment varchar2(2) type varchar2(8) ); 1、寫一個簡單的SQL語句實現:刪除表individual中一條出生日期(brithdate)為 1990年10月2日 出生的人的記錄 2、寫一修改語句實現: 將表child_detail 中的type 為 “kkd” 的記錄的Cname 值為“declear”,coment的值為“02” TableX有三個字段Code、 Name、 Age、 其中Code為主鍵; TableY有三個字段Code、 Class、Score, 其中Code + Class 為主鍵。兩表記錄如下: Code Name Age Code Class Score 張三 22 97001 數學 80 趙四 21 97002 計算機 59 張飛 20 97003 計算機 60 李五 22 97004 數學 55 1、請寫出SQL,找出所有姓張的學生,並按年齡從小到大排列; select * from TableX where name like '張%' order by age 2、請寫出SQL,取出計算機科考成績不及格的學生; select * from tableX where code in (select code from tableY WEHRE class='計算機' and score <60) 3、通過等值聯接,取出Name、Class、Score,請寫出SQL即輸出結果 select a.name,b.class,b.score from tableX a,tableY b where a.code=b.code 4、通過外聯接,取出每個學生的Name、Class、Score、請寫SQL輸出結果 select a.name,b.class,b.score from tableX full join tableY on a.code=b.code 5、請寫SQL,在TableX 表中增加一條學生記錄(學號:97005 姓名:趙六 年齡:20); insert into tablex values('97005','趙六',20) 6、李五的年齡記錄錯了,應該是21,請寫SQL,根據主鍵進行更新; update tablex set age=21 where code='97004' 7、請寫SQL,刪除TableX中沒有考試成績的學生記錄,請使用not in條件; delete tablex where code not in (select code from tabley) DELETE TABLEX WHERE CODE IN ( SELECT CODE FROM TABLEX WHERE CODE NOT IN(SELECT Y.CODE FROM TABLEY)) 但看了其它人的寫法,感覺自己寫的不簡潔,學習一下. 1、請寫出SQL,找出所有姓張的學生,並按年齡從小到大排列; SELECT * FROM TableX WHERE Name LIKE '張%' ORDER BY Age; 2、請寫出SQL,取出計算機科考成績不及格的學生; SELECT * FROM TableX x, TableY y WHERE x.Code = y.Code AND Class = '計算機' AND Score < 60; 3、通過等值聯接,取出Name、Class、Score,請寫出SQL即輸出結果 SELECT x.Name, y.Class, y.Score FROM TableX x, TableY y WHERE x.Code = y.Code 4、通過外聯接,取出每個學生的Name、Class、Score、請寫SQL輸出結果 Left Out:SELECT x.Name, y.Class, y.Score FROM TableX x, TableY y WHERE x.Code = y.Code(+) Right Out: SELECT x.Name, y.Class, y.Score FROM TableX x, TableY y WHERE x.Code(+) = y.Code Full Out:Left join union all right join 5、請寫SQL,在TableX 表中增加一條學生記錄(學號:97005 姓名:趙六 年齡:20); INSERT INTO TableX(Code, Name, Age) VALUES('97005','趙六',20); COMMIT; 6、李五的年齡記錄錯了,應該是21,請寫SQL,根據主鍵進行更新; UPDATE TableX SET Age = 21 WHERE Code in (SELECT Code FROM TableX WHERE Name = '李五') 7、請寫SQL,刪除TableX中沒有考試成績的學生記錄,請使用not in條件; DELETE FROM TableX WHERE Code Not in (SELECT Code FROM TableY WHERE NVL(Score,0) = 0) 在此表中建唯一索引 firstname + lastname CREATE UNIQUE INDEX NAME_UNINDEX ON individual(firstname,lastname) 1、寫一個簡單的SQL語句實現:刪除表individual中一條出生日期(brithdate)為 1990年10月2日 出生的人的記錄 DELETE FROM individual WHERE TO_CHAR(birthdate,'YYYY-MM-DD') = '1990-10-02'; COMMIT; 2、寫一修改語句實現: 將表child_detail 中的type 為 “kkd” 的記錄的Cname 值為“declear”,coment的值為“02” UPDATE chile_detail SET Cname = 'declear', coment = '02' WHERE type = 'kkd'; COMMIT; http://www.51testing.com/?uid-165528-action-viewspace-itemid-99563 http://www.cnblogs.com/zemliu/archive/2012/10/09/2717629.html http://bbs.csdn.NET/topics/270058476 [sql] view plain copy 一 單詞解釋(2分/個) 34 Data 數據Database 數據庫RDBMS 關系數據庫管理系統GRANT 授權 REVOKE取消權限DENY 拒絕權限DECLARE 定義變量PROCEDURE存儲過程 Transaction事務TRIGGER觸發器繼續 continue唯一 unqiue 主鍵 primary key標識列 identity外鍵 foreign kdy 檢查 check 約束 constraint 二 編寫SQL語句(5分/題)50 1) 創建一張學生表,包含以下信息,學號,姓名,年齡,性別,家庭住址,聯系電話 Create table stu (學號 int , 姓名 varchar(8), 年齡 int, 性別 varchar(4), 家庭地址 varchar(50), 聯系電話 int ); 2) 修改學生表的結構,添加一列信息,學歷 Alter table stu add 學歷 varchar(6); 3) 修改學生表的結構,刪除一列信息,家庭住址 Alter table stu drop column 家庭地址 4) 向學生表添加如下信息: 學號 姓名年齡性別聯系電話學歷 1A22男123456小學 2B21男119中學 3C23男110高中 4D18女114大學 Insert into stu values(1,’A’,22,’男’,123456,’小學’) Insert into stu values(2,’B’,21,’男’,119,’中學’) Insert into stu values(3,’C’,23,’男’,110,’高中’) Insert into stu values(4,’D’,18,’女’,114,’大學’) 修改學生表的數據,將電話號碼以11開頭的學員的學歷改為“大專” Update stu set 學歷=’大專’ where 聯系電話 like ‘11%’ 6) 刪除學生表的數據,姓名以C開頭,性別為‘男’的記錄刪除 Delect from stu where 性別=’男’ and 姓名 like ‘c%’ 7) 查詢學生表的數據,將所有年齡小於22歲的,學歷為“大專”的,學生的姓名和學號示出來 Select 姓名,學號 from stu where 年齡<22 and 學歷=’大專’ 8) 查詢學生表的數據,查詢所有信息,列出前25%的記錄 Select top 25 percent * from stu 9) 查詢出所有學生的姓名,性別,年齡降序排列 Select 姓名,性別 from stu order by 年齡 desc 10) 按照性別分組查詢所有的平均年齡 Select avg(年齡) from stu group by 性別 三 填空(3分/題) 36 1) 索引分為__聚集索引___和__非聚集索引__在一張表上最多可以創建1個 聚集索引_索引。但是可以創建_249個非 聚集索引 索引。 2) 系統存儲過程_sp-helptext__是用來顯示規則,默認值,未加密的存儲過程,用戶定義函數,觸發或視圖的文本 3) 事務開始:begin Transction 提交事務:commit Transction 回滾事務:rollback Transction 四 問答題(5分/題)60 1) 數據庫包含哪些那幾種后綴名的文件必須,這些文件分別存放在什么的信息? 主要數據文件(.mdf) 包含數據用戶收集的信息,還有數據庫其他相關的信息, 日志數據文件(.ndf) 存放用戶對數據庫的增刪改查的信息,用於備份恢復使用 2) TRUNCATE TABLE 命令是什么含義?和Delete from 表名有什么區? TRUNCATE TABLE: 提供了一種刪除表中所有記錄的快速方法 Delete from 表名:可以刪除表的一個或多條記錄 3) 說出以下聚合數的含義:avg ,sum ,max ,min , count ,count(*) AVG:求平均值 SUM:求和 MAX:求最大值 MIN:求最小值 COUNT(*):返回所有行數 COUNT返回滿足指定條件的記錄值 inner join 是什么意思?作用是什么?寫出基本語法結構 INNER JOIN 內聯接,用於返回兩個表中要查詢的列數據通信 Select * from 表名1 inner join 表名2 on 條件表達式 5) 左向外聯接,右向外聯接,全聯接的關健字如何寫? Left outer join 左向外聯接 Right outer join 右向外聯接 Full outer join 全聯接 6) 子查詢分為幾類,說明相互之間的別 了查詢分三種基本子查詢: 1.使用in 查詢返回一列或更多值 2.比較運算符,返回單個值勤做為外查詢的參數 3.用exists 查詢時相當於進行一次數據測試 7) 實現實體完整性,實現域完整性,實現 完整性(引用完整性),實現自定義完整性分別使用什么手段? 實現實體完整性: 主鍵約束 唯一約束 標識列 實現域完整性: 默認值約束 檢查約束 非空屬性 引和完整性: 外鍵引用 8) 視圖可以更新嗎?會影響到實際表嗎? 視圖是可以更新的,視圖只是基於基本表上的虛擬表,對視圖的更新會直接影響到實際表 9) 談談這樣幾個角色, dbo , Sysadmin public Dbo : 是數據庫的擁有者,對數據庫擁有所有操作的權限 Sysadmin : 可以對SQL SERVER執行任何活動 Public : 自動創建的,能捕獲數據庫中用戶的所有默認權限 10) 何為動態游標?何為靜態游標? 動態游標與靜態游標相對,反映結果集中所做的所有更改, 靜態游標的結果集在游標打開時,建立在tempdb中,總按照游標打開時的原樣顯示 11) 什么是存儲過程?為什么存儲過程要比單純的Sql 語句執行起來要快? 存儲過程:是一組預先編譯好的T-SQL代碼 在創建存儲過程時經過了語法和性能優化,執行不必重復的步驟,使用存儲過程可提高運行效率 12)什么是Inserted 表 ?什么是Deleted 表? Inserted表用於存儲inserted和update語句影響的副本 Deleted 表用於存儲delect 和 update語句影響的行的副本 (1)表名:購物信息 購物人 商品名稱 數量 A 甲 2 B 乙 4 C 丙 1 A 丁 2 B 丙 5 …… 給出所有購入商品為兩種或兩種以上的購物人記錄 答:select * from 購物信息 where 購物人 in (select 購物人 from 購物信息 group by 購物人 having count(*) >= 2); (2)表名:成績表 姓名 課程 分數 張三 語文 81 張三 數學 75 李四 語文 56 李四 數學 90 王五 語文 81 王五 數學 100 王五 英語 49 給出成績全部合格的學生信息(包含姓名、課程、分數),注:分數在60以上評為合格 答:select * from 成績表 where 姓名 not in (select distinct 姓名 from 成績表 where 分數 < 60) 或者: select * from 成績表 where 姓名 in (select 姓名 from 成績表 group by 姓名 having min(分數) >=60) (3)表名:商品表 名稱 產地 進價 蘋果 煙台 2.5 蘋果 雲南 1.9 蘋果 四川 3 西瓜 江西 1.5 西瓜 北京 2.4 …… 給出平均進價在2元以下的商品名稱 答:select 名稱 from 商品表 group by 名稱 having avg(進價) < 2 (4)表名:高考信息表 准考證號 科目 成績 語文 119 數學 108 物理 142 化學 136 物理 127 數學 149 英語 110 語文 105 英語 98 化學 129 …… 給出高考總分在600以上的學生准考證號 答:select 准考證號 from 高考信息表 group by 准考證號 having sum(成績) > 600 (5)表名:高考信息表 准考證號 數學 語文 英語 物理 化學 108 119 98 127 136 149 105 110 142 129 …… 給出高考總分在600以上的學生准考證號 答:select 准考證號 from 高考信息表 where (數學+語文+英語+物理+化學) > 600 (四部分) (一)表名:club id gender age M 19 F 30 F 27 F 16 M 32 …… 查詢出該俱樂部里男性會員和女性會員的總數 答:select gender,count(id) from club group by gender (二)表名:team ID(number型) Name(varchar2型) a b b a c c 要求:執行一個刪除語句,當Name列上有相同時,只保留ID這列上值小的 例如:刪除后的結果應如下: ID(number型) Name(varchar2型) a b c 請寫出SQL語句。 delete from team where id not in (select min(id) from team group by name) (三)表名:student name course score 張青 語文 72 王華 數學 72 張華 英語 81 張青 物理 67 李立 化學 98 張燕 物理 70 張青 化學 76 查詢出“張”姓學生中平均成績大於75分的學生信息 答:select * from student where name in (select name from student where name like '張%' group by name having avg(score) > 75) 1.一道SQL語句面試題,關於group by表內容: info 表 date result 2005-05-09 win 2005-05-09 lose 2005-05-09 lose 2005-05-09 lose 2005-05-10 win 2005-05-10 lose 2005-05-10 lose 如果要生成下列結果, 該如何寫sql語句? win lose 2005-05-09 2 2 2005-05-10 1 2 答案: (1) select date, sum(case when result = "win" then 1 else 0 end) as "win", sum(case when result = "lose" then 1 else 0 end) as "lose" from info group by date; (2) select a.date, a.result as win, b.result as lose from (select date, count(result) as result from info where result = "win" group by date) as a join (select date, count(result) as result from info where result = "lose" group by date) as b on a.date = b.date; 2.表中有A B C三列,用SQL語句實現:當A列大於B列時選擇A列否則選擇B列,當B列大於C列時選擇B列否則選擇C列 select (case when a > b then a else b end), (case when b > c then b else c end) from table; 3.請取出tb_send表中日期(SendTime字段)為當天的所有記錄? (SendTime字段為datetime型,包含日期與時間) select * from tb where datediff(dd,SendTime,getdate())=0 4.有一張表,里面有3個字段:chinese,math,english。其中有一條記錄chinese 70分,math 80分,english 58分,請用一條sql語句查詢出所有記錄並按以下條件顯示出來(並寫出您的思路): 大於或等於80表示excellent,大於或等於60表示pass,小於60分表示fail。 顯示格式: 以上面的chinese 70分,math 80分,english 58分 chinese math english pass excellent fail select (case when chinese >= 80 then "excellent" when chinese >= 60 then "pass" else "fail" end) as chinese, (case when math >= 80 then "excellent" when math >= 60 then "pass" else "fail" end) as math, (case when english >= 80 then "excellent" when english >= 60 then "pass" else "fail" end) as english from grade; 5.請用一個sql語句得出結果 從table1,table2中取出如table3所列格式數據,注意提供的數據及結果不准確,只是作為一個格式向大家請教。 如使用存儲過程也可以。 table1 月份mon 部門dep 業績yj ------------------------------- 一月份 01 10 一月份 02 10 一月份 03 5 二月份 02 8 二月份 04 9 三月份 03 8 table2 部門dep 部門名稱dname -------------------------------- 國內業務一部 國內業務二部 國內業務三部 國際業務部 table3 (result) 部門dep 一月份 二月份 三月份 -------------------------------------- 10 null null 10 8 null null 5 8 null null 9 ------------------------------------------ select t1.dep, sum(case when mon = 1 then yj else 0 end) as jun, sum(case when mon = 2 then yj else 0 end) as feb, sum(case when mon = 3 then yj else 0 end) as mar from t1 right join t2 on t1.dep = t2.dep group by t1.dep; 題目一、 有兩個表: TableX有三個字段Code、 Name、 Age、 其中Code為主鍵; TableY有三個字段Code、 Class、Score, 其中Code + Class 為主鍵。兩表記錄如下: Code Name Age Code Class Score 張三 22 97001 數學 80 趙四 21 97002 計算機 59 張飛 20 97003 計算機 60 李五 22 97004 數學 55 1、請寫出SQL,找出所有姓張的學生,並按年齡從小到大排列; 2、請寫出SQL,取出計算機科考成績不及格的學生; 3、通過等值聯接,取出Name、Class、Score,請寫出SQL即輸出結果 4、通過外聯接,取出每個學生的Name、Class、Score、請寫SQL輸出結果 5、請寫SQL,在TableX 表中增加一條學生記錄(學號:97005 姓名:趙六 年齡:20); 6、李五的年齡記錄錯了,應該是21,請寫SQL,根據主鍵進行更新; 7、請寫SQL,刪除TableX中沒有考試成績的學生記錄,請使用not in條件; 題目二、 有兩個表定義如下: create tableindividual ( firstname varchar2(20) not null lastname vatchar2(20) not null birthdate date gender varchar2(1) initial number(2) farorite varchar2(6) type varchar2(8) ); 在此表中建唯一索引 firstname + lastname create table chile_detail( firstname varchar2(20) lastname varchar2(20) cname varchar2(8) coment varchar2(2) type varchar2(8) ); 1、寫一個簡單的SQL語句實現:刪除表individual中一條出生日期(brithdate)為 1990年10月2日 出生的人的記錄 2、寫一修改語句實現: 將表child_detail 中的type 為 “kkd” 的記錄的Cname 值為“declear”,coment的值為“02” TableX有三個字段Code、 Name、 Age、 其中Code為主鍵; TableY有三個字段Code、 Class、Score, 其中Code + Class 為主鍵。兩表記錄如下: Code Name Age Code Class Score 張三 22 97001 數學 80 趙四 21 97002 計算機 59 張飛 20 97003 計算機 60 李五 22 97004 數學 55 1、請寫出SQL,找出所有姓張的學生,並按年齡從小到大排列; select * from TableX where name like '張%' order by age 2、請寫出SQL,取出計算機科考成績不及格的學生; select * from tableX where code in (select code from tableY WEHRE class='計算機' and score <60) 3、通過等值聯接,取出Name、Class、Score,請寫出SQL即輸出結果 select a.name,b.class,b.score from tableX a,tableY b where a.code=b.code 4、通過外聯接,取出每個學生的Name、Class、Score、請寫SQL輸出結果 select a.name,b.class,b.score from tableX full join tableY on a.code=b.code 5、請寫SQL,在TableX 表中增加一條學生記錄(學號:97005 姓名:趙六 年齡:20); insert into tablex values('97005','趙六',20) 6、李五的年齡記錄錯了,應該是21,請寫SQL,根據主鍵進行更新; update tablex set age=21 where code='97004' 7、請寫SQL,刪除TableX中沒有考試成績的學生記錄,請使用not in條件; delete tablex where code not in (select code from tabley) DELETE TABLEX WHERE CODE IN ( SELECT CODE FROM TABLEX WHERE CODE NOT IN(SELECT Y.CODE FROM TABLEY)) 但看了其它人的寫法,感覺自己寫的不簡潔,學習一下. 1、請寫出SQL,找出所有姓張的學生,並按年齡從小到大排列; SELECT * FROM TableX WHERE Name LIKE '張%' ORDER BY Age; 2、請寫出SQL,取出計算機科考成績不及格的學生; SELECT * FROM TableX x, TableY y WHERE x.Code = y.Code AND Class = '計算機' AND Score < 60; 3、通過等值聯接,取出Name、Class、Score,請寫出SQL即輸出結果 SELECT x.Name, y.Class, y.Score FROM TableX x, TableY y WHERE x.Code = y.Code 4、通過外聯接,取出每個學生的Name、Class、Score、請寫SQL輸出結果 Left Out:SELECT x.Name, y.Class, y.Score FROM TableX x, TableY y WHERE x.Code = y.Code(+) Right Out: SELECT x.Name, y.Class, y.Score FROM TableX x, TableY y WHERE x.Code(+) = y.Code Full Out:Left join union all right join 5、請寫SQL,在TableX 表中增加一條學生記錄(學號:97005 姓名:趙六 年齡:20); INSERT INTO TableX(Code, Name, Age) VALUES('97005','趙六',20); COMMIT; 6、李五的年齡記錄錯了,應該是21,請寫SQL,根據主鍵進行更新; UPDATE TableX SET Age = 21 WHERE Code in (SELECT Code FROM TableX WHERE Name = '李五') 7、請寫SQL,刪除TableX中沒有考試成績的學生記錄,請使用not in條件; DELETE FROM TableX WHERE Code Not in (SELECT Code FROM TableY WHERE NVL(Score,0) = 0) 在此表中建唯一索引 firstname + lastname CREATE UNIQUE INDEX NAME_UNINDEX ON individual(firstname,lastname) 1、寫一個簡單的SQL語句實現:刪除表individual中一條出生日期(brithdate)為 1990年10月2日 出生的人的記錄 DELETE FROM individual WHERE TO_CHAR(birthdate,'YYYY-MM-DD') = '1990-10-02'; COMMIT; 2、寫一修改語句實現: 將表child_detail 中的type 為 “kkd” 的記錄的Cname 值為“declear”,coment的值為“02” UPDATE chile_detail SET Cname = 'declear', coment = '02' WHERE type = 'kkd'; COMMIT; http://www.51testing.com/?uid-165528-action-viewspace-itemid-99563 http://www.cnblogs.com/zemliu/archive/2012/10/09/2717629.html http://bbs.csdn.NET/topics/270058476 [sql] view plain copy 一 單詞解釋(2分/個) 34 Data 數據Database 數據庫RDBMS 關系數據庫管理系統GRANT 授權 REVOKE取消權限DENY 拒絕權限DECLARE 定義變量PROCEDURE存儲過程 Transaction事務TRIGGER觸發器繼續 continue唯一 unqiue 主鍵 primary key標識列 identity外鍵 foreign kdy 檢查 check 約束 constraint 二 編寫SQL語句(5分/題)50 1) 創建一張學生表,包含以下信息,學號,姓名,年齡,性別,家庭住址,聯系電話 Create table stu (學號 int , 姓名 varchar(8), 年齡 int, 性別 varchar(4), 家庭地址 varchar(50), 聯系電話 int ); 2) 修改學生表的結構,添加一列信息,學歷 Alter table stu add 學歷 varchar(6); 3) 修改學生表的結構,刪除一列信息,家庭住址 Alter table stu drop column 家庭地址 4) 向學生表添加如下信息: 學號 姓名年齡性別聯系電話學歷 1A22男123456小學 2B21男119中學 3C23男110高中 4D18女114大學 Insert into stu values(1,’A’,22,’男’,123456,’小學’) Insert into stu values(2,’B’,21,’男’,119,’中學’) Insert into stu values(3,’C’,23,’男’,110,’高中’) Insert into stu values(4,’D’,18,’女’,114,’大學’) 修改學生表的數據,將電話號碼以11開頭的學員的學歷改為“大專” Update stu set 學歷=’大專’ where 聯系電話 like ‘11%’ 6) 刪除學生表的數據,姓名以C開頭,性別為‘男’的記錄刪除 Delect from stu where 性別=’男’ and 姓名 like ‘c%’ 7) 查詢學生表的數據,將所有年齡小於22歲的,學歷為“大專”的,學生的姓名和學號示出來 Select 姓名,學號 from stu where 年齡<22 and 學歷=’大專’ 8) 查詢學生表的數據,查詢所有信息,列出前25%的記錄 Select top 25 percent * from stu 9) 查詢出所有學生的姓名,性別,年齡降序排列 Select 姓名,性別 from stu order by 年齡 desc 10) 按照性別分組查詢所有的平均年齡 Select avg(年齡) from stu group by 性別 三 填空(3分/題) 36 1) 索引分為__聚集索引___和__非聚集索引__在一張表上最多可以創建1個 聚集索引_索引。但是可以創建_249個非 聚集索引 索引。 2) 系統存儲過程_sp-helptext__是用來顯示規則,默認值,未加密的存儲過程,用戶定義函數,觸發或視圖的文本 3) 事務開始:begin Transction 提交事務:commit Transction 回滾事務:rollback Transction 四 問答題(5分/題)60 1) 數據庫包含哪些那幾種后綴名的文件必須,這些文件分別存放在什么的信息? 主要數據文件(.mdf) 包含數據用戶收集的信息,還有數據庫其他相關的信息, 日志數據文件(.ndf) 存放用戶對數據庫的增刪改查的信息,用於備份恢復使用 2) TRUNCATE TABLE 命令是什么含義?和Delete from 表名有什么區? TRUNCATE TABLE: 提供了一種刪除表中所有記錄的快速方法 Delete from 表名:可以刪除表的一個或多條記錄 3) 說出以下聚合數的含義:avg ,sum ,max ,min , count ,count(*) AVG:求平均值 SUM:求和 MAX:求最大值 MIN:求最小值 COUNT(*):返回所有行數 COUNT返回滿足指定條件的記錄值 inner join 是什么意思?作用是什么?寫出基本語法結構 INNER JOIN 內聯接,用於返回兩個表中要查詢的列數據通信 Select * from 表名1 inner join 表名2 on 條件表達式 5) 左向外聯接,右向外聯接,全聯接的關健字如何寫? Left outer join 左向外聯接 Right outer join 右向外聯接 Full outer join 全聯接 6) 子查詢分為幾類,說明相互之間的別 了查詢分三種基本子查詢: 1.使用in 查詢返回一列或更多值 2.比較運算符,返回單個值勤做為外查詢的參數 3.用exists 查詢時相當於進行一次數據測試 7) 實現實體完整性,實現域完整性,實現 完整性(引用完整性),實現自定義完整性分別使用什么手段? 實現實體完整性: 主鍵約束 唯一約束 標識列 實現域完整性: 默認值約束 檢查約束 非空屬性 引和完整性: 外鍵引用 8) 視圖可以更新嗎?會影響到實際表嗎? 視圖是可以更新的,視圖只是基於基本表上的虛擬表,對視圖的更新會直接影響到實際表 9) 談談這樣幾個角色, dbo , Sysadmin public Dbo : 是數據庫的擁有者,對數據庫擁有所有操作的權限 Sysadmin : 可以對SQL SERVER執行任何活動 Public : 自動創建的,能捕獲數據庫中用戶的所有默認權限 10) 何為動態游標?何為靜態游標? 動態游標與靜態游標相對,反映結果集中所做的所有更改, 靜態游標的結果集在游標打開時,建立在tempdb中,總按照游標打開時的原樣顯示 11) 什么是存儲過程?為什么存儲過程要比單純的Sql 語句執行起來要快? 存儲過程:是一組預先編譯好的T-SQL代碼 在創建存儲過程時經過了語法和性能優化,執行不必重復的步驟,使用存儲過程可提高運行效率 12)什么是Inserted 表 ?什么是Deleted 表? Inserted表用於存儲inserted和update語句影響的副本 Deleted 表用於存儲delect 和 update語句影響的行的副本 (1)表名:購物信息 購物人 商品名稱 數量 A 甲 2 B 乙 4 C 丙 1 A 丁 2 B 丙 5 …… 給出所有購入商品為兩種或兩種以上的購物人記錄 答:select * from 購物信息 where 購物人 in (select 購物人 from 購物信息 group by 購物人 having count(*) >= 2); (2)表名:成績表 姓名 課程 分數 張三 語文 81 張三 數學 75 李四 語文 56 李四 數學 90 王五 語文 81 王五 數學 100 王五 英語 49 給出成績全部合格的學生信息(包含姓名、課程、分數),注:分數在60以上評為合格 答:select * from 成績表 where 姓名 not in (select distinct 姓名 from 成績表 where 分數 < 60) 或者: select * from 成績表 where 姓名 in (select 姓名 from 成績表 group by 姓名 having min(分數) >=60) (3)表名:商品表 名稱 產地 進價 蘋果 煙台 2.5 蘋果 雲南 1.9 蘋果 四川 3 西瓜 江西 1.5 西瓜 北京 2.4 …… 給出平均進價在2元以下的商品名稱 答:select 名稱 from 商品表 group by 名稱 having avg(進價) < 2 (4)表名:高考信息表 准考證號 科目 成績 語文 119 數學 108 物理 142 化學 136 物理 127 數學 149 英語 110 語文 105 英語 98 化學 129 …… 給出高考總分在600以上的學生准考證號 答:select 准考證號 from 高考信息表 group by 准考證號 having sum(成績) > 600 (5)表名:高考信息表 准考證號 數學 語文 英語 物理 化學 108 119 98 127 136 149 105 110 142 129 …… 給出高考總分在600以上的學生准考證號 答:select 准考證號 from 高考信息表 where (數學+語文+英語+物理+化學) > 600 (四部分) (一)表名:club id gender age M 19 F 30 F 27 F 16 M 32 …… 查詢出該俱樂部里男性會員和女性會員的總數 答:select gender,count(id) from club group by gender (二)表名:team ID(number型) Name(varchar2型) a b b a c c 要求:執行一個刪除語句,當Name列上有相同時,只保留ID這列上值小的 例如:刪除后的結果應如下: ID(number型) Name(varchar2型) a b c 請寫出SQL語句。 delete from team where id not in (select min(id) from team group by name) (三)表名:student name course score 張青 語文 72 王華 數學 72 張華 英語 81 張青 物理 67 李立 化學 98 張燕 物理 70 張青 化學 76 查詢出“張”姓學生中平均成績大於75分的學生信息 答:select * from student where name in (select name from student where name like '張%' group by name having avg(score) > 75) 1.一道SQL語句面試題,關於group by表內容: info 表 date result 2005-05-09 win 2005-05-09 lose 2005-05-09 lose 2005-05-09 lose 2005-05-10 win 2005-05-10 lose 2005-05-10 lose 如果要生成下列結果, 該如何寫sql語句? win lose 2005-05-09 2 2 2005-05-10 1 2 答案: (1) select date, sum(case when result = "win" then 1 else 0 end) as "win", sum(case when result = "lose" then 1 else 0 end) as "lose" from info group by date; (2) select a.date, a.result as win, b.result as lose from (select date, count(result) as result from info where result = "win" group by date) as a join (select date, count(result) as result from info where result = "lose" group by date) as b on a.date = b.date; 2.表中有A B C三列,用SQL語句實現:當A列大於B列時選擇A列否則選擇B列,當B列大於C列時選擇B列否則選擇C列 select (case when a > b then a else b end), (case when b > c then b else c end) from table; 3.請取出tb_send表中日期(SendTime字段)為當天的所有記錄? (SendTime字段為datetime型,包含日期與時間) select * from tb where datediff(dd,SendTime,getdate())=0 4.有一張表,里面有3個字段:chinese,math,english。其中有一條記錄chinese 70分,math 80分,english 58分,請用一條sql語句查詢出所有記錄並按以下條件顯示出來(並寫出您的思路): 大於或等於80表示excellent,大於或等於60表示pass,小於60分表示fail。 顯示格式: 以上面的chinese 70分,math 80分,english 58分 chinese math english pass excellent fail select (case when chinese >= 80 then "excellent" when chinese >= 60 then "pass" else "fail" end) as chinese, (case when math >= 80 then "excellent" when math >= 60 then "pass" else "fail" end) as math, (case when english >= 80 then "excellent" when english >= 60 then "pass" else "fail" end) as english from grade; 5.請用一個sql語句得出結果 從table1,table2中取出如table3所列格式數據,注意提供的數據及結果不准確,只是作為一個格式向大家請教。 如使用存儲過程也可以。 table1 月份mon 部門dep 業績yj ------------------------------- 一月份 01 10 一月份 02 10 一月份 03 5 二月份 02 8 二月份 04 9 三月份 03 8 table2 部門dep 部門名稱dname -------------------------------- 國內業務一部 國內業務二部 國內業務三部 國際業務部 table3 (result) 部門dep 一月份 二月份 三月份 -------------------------------------- 10 null null 10 8 null null 5 8 null null 9 ------------------------------------------ select t1.dep, sum(case when mon = 1 then yj else 0 end) as jun, sum(case when mon = 2 then yj else 0 end) as feb, sum(case when mon = 3 then yj else 0 end) as mar from t1 right join t2 on t1.dep = t2.dep group by t1.dep; 題目一、 有兩個表: TableX有三個字段Code、 Name、 Age、 其中Code為主鍵; TableY有三個字段Code、 Class、Score, 其中Code + Class 為主鍵。兩表記錄如下: Code Name Age Code Class Score 張三 22 97001 數學 80 趙四 21 97002 計算機 59 張飛 20 97003 計算機 60 李五 22 97004 數學 55 1、請寫出SQL,找出所有姓張的學生,並按年齡從小到大排列; 2、請寫出SQL,取出計算機科考成績不及格的學生; 3、通過等值聯接,取出Name、Class、Score,請寫出SQL即輸出結果 4、通過外聯接,取出每個學生的Name、Class、Score、請寫SQL輸出結果 5、請寫SQL,在TableX 表中增加一條學生記錄(學號:97005 姓名:趙六 年齡:20); 6、李五的年齡記錄錯了,應該是21,請寫SQL,根據主鍵進行更新; 7、請寫SQL,刪除TableX中沒有考試成績的學生記錄,請使用not in條件; 題目二、 有兩個表定義如下: create tableindividual ( firstname varchar2(20) not null lastname vatchar2(20) not null birthdate date gender varchar2(1) initial number(2) farorite varchar2(6) type varchar2(8) ); 在此表中建唯一索引 firstname + lastname create table chile_detail( firstname varchar2(20) lastname varchar2(20) cname varchar2(8) coment varchar2(2) type varchar2(8) ); 1、寫一個簡單的SQL語句實現:刪除表individual中一條出生日期(brithdate)為 1990年10月2日 出生的人的記錄 2、寫一修改語句實現: 將表child_detail 中的type 為 “kkd” 的記錄的Cname 值為“declear”,coment的值為“02” TableX有三個字段Code、 Name、 Age、 其中Code為主鍵; TableY有三個字段Code、 Class、Score, 其中Code + Class 為主鍵。兩表記錄如下: Code Name Age Code Class Score 張三 22 97001 數學 80 趙四 21 97002 計算機 59 張飛 20 97003 計算機 60 李五 22 97004 數學 55 1、請寫出SQL,找出所有姓張的學生,並按年齡從小到大排列; select * from TableX where name like '張%' order by age 2、請寫出SQL,取出計算機科考成績不及格的學生; select * from tableX where code in (select code from tableY WEHRE class='計算機' and score <60) 3、通過等值聯接,取出Name、Class、Score,請寫出SQL即輸出結果 select a.name,b.class,b.score from tableX a,tableY b where a.code=b.code 4、通過外聯接,取出每個學生的Name、Class、Score、請寫SQL輸出結果 select a.name,b.class,b.score from tableX full join tableY on a.code=b.code 5、請寫SQL,在TableX 表中增加一條學生記錄(學號:97005 姓名:趙六 年齡:20); insert into tablex values('97005','趙六',20) 6、李五的年齡記錄錯了,應該是21,請寫SQL,根據主鍵進行更新; update tablex set age=21 where code='97004' 7、請寫SQL,刪除TableX中沒有考試成績的學生記錄,請使用not in條件; delete tablex where code not in (select code from tabley) DELETE TABLEX WHERE CODE IN ( SELECT CODE FROM TABLEX WHERE CODE NOT IN(SELECT Y.CODE FROM TABLEY)) 但看了其它人的寫法,感覺自己寫的不簡潔,學習一下. 1、請寫出SQL,找出所有姓張的學生,並按年齡從小到大排列; SELECT * FROM TableX WHERE Name LIKE '張%' ORDER BY Age; 2、請寫出SQL,取出計算機科考成績不及格的學生; SELECT * FROM TableX x, TableY y WHERE x.Code = y.Code AND Class = '計算機' AND Score < 60; 3、通過等值聯接,取出Name、Class、Score,請寫出SQL即輸出結果 SELECT x.Name, y.Class, y.Score FROM TableX x, TableY y WHERE x.Code = y.Code 4、通過外聯接,取出每個學生的Name、Class、Score、請寫SQL輸出結果 Left Out:SELECT x.Name, y.Class, y.Score FROM TableX x, TableY y WHERE x.Code = y.Code(+) Right Out: SELECT x.Name, y.Class, y.Score FROM TableX x, TableY y WHERE x.Code(+) = y.Code Full Out:Left join union all right join 5、請寫SQL,在TableX 表中增加一條學生記錄(學號:97005 姓名:趙六 年齡:20); INSERT INTO TableX(Code, Name, Age) VALUES('97005','趙六',20); COMMIT; 6、李五的年齡記錄錯了,應該是21,請寫SQL,根據主鍵進行更新; UPDATE TableX SET Age = 21 WHERE Code in (SELECT Code FROM TableX WHERE Name = '李五') 7、請寫SQL,刪除TableX中沒有考試成績的學生記錄,請使用not in條件; DELETE FROM TableX WHERE Code Not in (SELECT Code FROM TableY WHERE NVL(Score,0) = 0) 在此表中建唯一索引 firstname + lastname CREATE UNIQUE INDEX NAME_UNINDEX ON individual(firstname,lastname) 1、寫一個簡單的SQL語句實現:刪除表individual中一條出生日期(brithdate)為 1990年10月2日 出生的人的記錄 DELETE FROM individual WHERE TO_CHAR(birthdate,'YYYY-MM-DD') = '1990-10-02'; COMMIT; 2、寫一修改語句實現: 將表child_detail 中的type 為 “kkd” 的記錄的Cname 值為“declear”,coment的值為“02” UPDATE chile_detail SET Cname = 'declear', coment = '02' WHERE type = 'kkd'; COMMIT; http://www.51testing.com/?uid-165528-action-viewspace-itemid-99563 http://www.cnblogs.com/zemliu/archive/2012/10/09/2717629.html http://bbs.csdn.NET/topics/270058476 [sql] view plain copy 一 單詞解釋(2分/個) 34 Data 數據Database 數據庫RDBMS 關系數據庫管理系統GRANT 授權 REVOKE取消權限DENY 拒絕權限DECLARE 定義變量PROCEDURE存儲過程 Transaction事務TRIGGER觸發器繼續 continue唯一 unqiue 主鍵 primary key標識列 identity外鍵 foreign kdy 檢查 check 約束 constraint 二 編寫SQL語句(5分/題)50 1) 創建一張學生表,包含以下信息,學號,姓名,年齡,性別,家庭住址,聯系電話 Create table stu (學號 int , 姓名 varchar(8), 年齡 int, 性別 varchar(4), 家庭地址 varchar(50), 聯系電話 int ); 2) 修改學生表的結構,添加一列信息,學歷 Alter table stu add 學歷 varchar(6); 3) 修改學生表的結構,刪除一列信息,家庭住址 Alter table stu drop column 家庭地址 4) 向學生表添加如下信息: 學號 姓名年齡性別聯系電話學歷 1A22男123456小學 2B21男119中學 3C23男110高中 4D18女114大學 Insert into stu values(1,’A’,22,’男’,123456,’小學’) Insert into stu values(2,’B’,21,’男’,119,’中學’) Insert into stu values(3,’C’,23,’男’,110,’高中’) Insert into stu values(4,’D’,18,’女’,114,’大學’) 修改學生表的數據,將電話號碼以11開頭的學員的學歷改為“大專” Update stu set 學歷=’大專’ where 聯系電話 like ‘11%’ 6) 刪除學生表的數據,姓名以C開頭,性別為‘男’的記錄刪除 Delect from stu where 性別=’男’ and 姓名 like ‘c%’ 7) 查詢學生表的數據,將所有年齡小於22歲的,學歷為“大專”的,學生的姓名和學號示出來 Select 姓名,學號 from stu where 年齡<22 and 學歷=’大專’ 8) 查詢學生表的數據,查詢所有信息,列出前25%的記錄 Select top 25 percent * from stu 9) 查詢出所有學生的姓名,性別,年齡降序排列 Select 姓名,性別 from stu order by 年齡 desc 10) 按照性別分組查詢所有的平均年齡 Select avg(年齡) from stu group by 性別 三 填空(3分/題) 36 1) 索引分為__聚集索引___和__非聚集索引__在一張表上最多可以創建1個 聚集索引_索引。但是可以創建_249個非 聚集索引 索引。 2) 系統存儲過程_sp-helptext__是用來顯示規則,默認值,未加密的存儲過程,用戶定義函數,觸發或視圖的文本 3) 事務開始:begin Transction 提交事務:commit Transction 回滾事務:rollback Transction 四 問答題(5分/題)60 1) 數據庫包含哪些那幾種后綴名的文件必須,這些文件分別存放在什么的信息? 主要數據文件(.mdf) 包含數據用戶收集的信息,還有數據庫其他相關的信息, 日志數據文件(.ndf) 存放用戶對數據庫的增刪改查的信息,用於備份恢復使用 2) TRUNCATE TABLE 命令是什么含義?和Delete from 表名有什么區? TRUNCATE TABLE: 提供了一種刪除表中所有記錄的快速方法 Delete from 表名:可以刪除表的一個或多條記錄 3) 說出以下聚合數的含義:avg ,sum ,max ,min , count ,count(*) AVG:求平均值 SUM:求和 MAX:求最大值 MIN:求最小值 COUNT(*):返回所有行數 COUNT返回滿足指定條件的記錄值 inner join 是什么意思?作用是什么?寫出基本語法結構 INNER JOIN 內聯接,用於返回兩個表中要查詢的列數據通信 Select * from 表名1 inner join 表名2 on 條件表達式 5) 左向外聯接,右向外聯接,全聯接的關健字如何寫? Left outer join 左向外聯接 Right outer join 右向外聯接 Full outer join 全聯接 6) 子查詢分為幾類,說明相互之間的別 了查詢分三種基本子查詢: 1.使用in 查詢返回一列或更多值 2.比較運算符,返回單個值勤做為外查詢的參數 3.用exists 查詢時相當於進行一次數據測試 7) 實現實體完整性,實現域完整性,實現 完整性(引用完整性),實現自定義完整性分別使用什么手段? 實現實體完整性: 主鍵約束 唯一約束 標識列 實現域完整性: 默認值約束 檢查約束 非空屬性 引和完整性: 外鍵引用 8) 視圖可以更新嗎?會影響到實際表嗎? 視圖是可以更新的,視圖只是基於基本表上的虛擬表,對視圖的更新會直接影響到實際表 9) 談談這樣幾個角色, dbo , Sysadmin public Dbo : 是數據庫的擁有者,對數據庫擁有所有操作的權限 Sysadmin : 可以對SQL SERVER執行任何活動 Public : 自動創建的,能捕獲數據庫中用戶的所有默認權限 10) 何為動態游標?何為靜態游標? 動態游標與靜態游標相對,反映結果集中所做的所有更改, 靜態游標的結果集在游標打開時,建立在tempdb中,總按照游標打開時的原樣顯示 11) 什么是存儲過程?為什么存儲過程要比單純的Sql 語句執行起來要快? 存儲過程:是一組預先編譯好的T-SQL代碼 在創建存儲過程時經過了語法和性能優化,執行不必重復的步驟,使用存儲過程可提高運行效率 12)什么是Inserted 表 ?什么是Deleted 表? Inserted表用於存儲inserted和update語句影響的副本 Deleted 表用於存儲delect 和 update語句影響的行的副本