mysql - 刷題記錄

  1. 某IT公司人事管理採用專門的人事管理系統來實現。後臺數據庫名爲LF。新來的人事部張經理新官上任,第一件事是要對公司的員工做全面的瞭解。可是他在訪問員工信息表EMPL裏的工資和獎金字段的時被拒絕,只能查看該表其他字段。作爲LF的開發者你將如何解決這一問題:( D )
    A. 廢除張經理的數據庫用戶帳戶對錶EMPL裏的工資列和獎金列的SELECT權限
    B. 添加張經理到db_datareader角色
    C. 添加張經理到db_accessadmin角色
    D. 授予張經理的數據庫用戶帳戶對錶EMPL裏的工資列和獎金列的SELECT權限。

解析:

db_accessadmin 可以添加、刪除用戶的用戶
db_datareader 可以查看所有數據庫中用戶表內數據的用戶

2. 有一張學生成績表sc(sno 學號,class 課程,score 成績),請查詢出每個學生的英語、數學的成績(行轉列,一個學生只有一行記錄)。

select sno,
sum(if(class=‘english’,score,0)) as english,
sum( if(class=‘math’,score,0) ) as math
from sc
where class in(‘english’,‘math’)
group by sno

解析:

mysql執行順序是先找from表,然後再where,然後Group by這些,最後Select後的語句。
這道題先找到這個表,再看where後,只把class爲英語數學的篩選出來,然後通過學號分組,每個學生的成績放到一條記錄裏,英語數學成績這兩個字段便是查找完每個學生的記錄後得到的,需要用到sum

  1. 一張學生成績表score,部分內容如下:
    name course grade
    張三 操作系統 67
    張三 數據結構 86
    李四 軟件工程 89
    用一條SQL 語句查詢出每門課都大於80 分的學生姓名,SQL語句實現正確的是:Select distinct name from score where name not in(Select name from score where grade <= 80);

解析:
選擇分數不在80分及以下的名字,小王數據結構81,小王操作系統99…就會選出多個小王。
在表中,可能會包含重複值。這並不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。

關鍵詞 DISTINCT 用於返回唯一不同的值。

  1. 僱員表EMP 結構如下
    ( 僱員編號 EMPNO , 姓名 ENAME ,
    工作崗位 JOB , 管理員編號 MGR ,
    受僱時間 HIREDATE , 工資 SAL ,
    獎金 COMM , 部門編號 DEPTNO );
    下列操作語句正確的是:( A )

A. 顯示在10和30部門工作並且工資大於5500元的僱員的姓名和工資,列標題顯示爲Employee和Monthly Salary 語句:SELECT ENAME EMPLOYEE ,SAL "MONTHLY SALARY" FROM EMP WHERE DEPTNO IN(10,30)AND SAL>5500;

B. 顯示受僱時間在2010年1月1日和2012年12月31日之間的僱員的姓名、工資、及受僱時間,並以受僱時間升序排列。 語句:SELECT ENAME,SAL,HIREDATE FROM EMP WHERE HIREDATE BETWEEN ‘2010-01-01’ AND ‘2012-12-31’ ORDER BY HIREDATE;

between…and後加日期,短日期默認爲00:00:00,所以查不到12月31日的信息

C. 顯示獎金比工資多10%以上的僱員的姓名、工資及獎金。 語句:SELECT ENAME,SAL ,COMM FROM EMP WHERE COMM>SAL*1.1;

C 難道是因爲沒有考慮獎金爲null 或者 工資爲 null?
C的錯誤是where後面跟的是表達式 where expression operator value;
這樣說的話 C大於等於之後還有表達式,錯誤.

D. 查詢沒有獎金且工資低於6500並工作崗位是經理、普通員工、銷售員的所有員工信息。 語句:SELECT * FROM EMP WHERE SAL<6500 AND COMM IS NULL AND JOB IN (‘經理’,‘普通員工’,‘銷售員’);

忽略了 COMM = 0

解析:
在這裏插入圖片描述

  1. 表結構如下:
CREATE TABLE `score` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `sno` int(11) NOT NULL,
   `cno` tinyint(4) NOT NULL,
   `score` tinyint(4) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ;

A.SELECT sum(score) / count(*) FROM score WHERE cno = 2;

B.SELECT sum(score) / count(id) FROM score WHERE cno = 2;

C.SELECT sum(score) / count(sno) FROM score WHERE cno = 2;

D.SELECT sum(score) / count(score) FROM score WHERE cno = 2;

E.SELECT sum(score) / count(1) FROM score WHERE cno = 2;

F.SELECT avg(score) FROM score WHERE cno = 2;

解析:
所有的統計函數都會忽略空值(null)。
A :統計所有學生的平均分,就算成績爲空的學生,最後計算count()時也作爲分母基數,計算得到所有學生的平均分。
B :與A一樣,因爲id主鍵非空,count(id)所得分母基數是所有學生。
C : 與B一樣,非空屬性sno。
D :由於score字段的值可能是空,空值在統計時忽略,所以count(score)和sum(score)統計的只是score不爲空的學生,計算得到的平均分也只是有成績的學生的平均分,無法計算所有學生的平均分。
E: count(1)與count(
)一樣。
F:avg(score)會忽略空值,故計算結果爲有成績的學生的平均分。

1、count(*)包括了所有的列,相當於行數,在統計結果的時候,不會忽略列值爲NULL。

2、count(1)包括了忽略所有列,用1代表代碼行,在統計結果的時候,不會忽略列值爲NULL。

3、count(列名)只包括列名那一列,在統計結果的時候,會忽略列值爲空。

  1. SQL語言共分爲三大類(亦有說法分爲四大類)
    數據查詢語言(DQL):是由SELECT子句,FROM子句,WHERE子句組成的查詢塊
    數據操縱語言(DML): SELECT(查詢) INSERT(插入) UPDATE(更新) DELETE(刪除)
    數據定義語言(DDL):CREATE(創建數據庫或表或索引)ALTER(修改表或者數據庫)DROP(刪除表或索引)
    數據控制語言(DCL):GRANT(賦予用戶權限) REVOKE(收回權限) DENY(禁止權限)
    事務控制語言(TCL):SAVEPOINT (設置保存點)ROLLBACK (回滾) **COMMIT(**提交)

  2. All:對所有數據都滿足條件,整個條件才成立;
    Any:只要有一條數據滿足條件,整個條件成立;
    Some的作用和Any一樣 .

  3. 在SQL中語法規範中,having子句的使用下面描述正確的是:( A、C )
    A. having子句即可包含聚合函數作用的字段也可包括普通的標量字段
    B. 使用having的同時不能使用where子句
    C. having子句必須於group by 子句同時使用,不能單獨使用
    用having就一定要和group by連用,且是先group by XXX 再having XXX,用group by不一有having(它只是一個篩選條件用的)
    D. 使用having子句的作用是限定分組條件
    Group by纔是用來分組的,group by的作用是限定分組條件,而having則是對group by中分出來的組進行條件篩選。

E. Having子句和where子句是等同的
(where子句 = 指定行所對應的條件
having子句 = 指定組所對應的條件)

where在數據分組之前使用,having在數據分組之後使用,可以同時使用。
F. 如果select語句中沒有聚合函數的使用,就不能使用having子句

  1. 鏈接:https://www.nowcoder.com/questionTerminal/45fa358b24364928bcb6f99c7d19ea0f
    來源:牛客網

有兩張表,如下圖所示
表A(僅列出部分數據作參考)
Order_id User_id Add_time
11701245001 10000 1498882474
11701245002 10001 1498882475
表B:(僅列出部分數據作參考)
id Order_id goods_id price
1 11701245001 1001 10
2 11701245001 1002 20
3 11701245002 1001 10
問:用SQL查詢 購買過goods_id 爲1001的用戶user_id()

select user_id from A where order_id in (select order_id from B where goods_id = ‘1001’)
在子表元素大於1時, 不能用= 要用in in(子表)
Select A.user_id from A left join B on A.order_id=B.order_id where B.goods_id=‘1001’
左連接,返回左邊表中所有記錄和右邊表中鏈接字段相等的記錄 右連接, 等值連接,兩邊連接字段相等的行 A left join B on A. =B.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章