2017年07月03號課堂筆記

2017年07月03號 星期一 ?多云 空氣質量:輕度污染~中度污染

內容:MySQL第四節課

in和not in;兩個表的內連接;exists和not exsits的使用;all,any和some;

使用子查詢的注意事項;sql優化(使用exists 代替 in);group by;兩道mysql面試題

一、in和not in

1、in
-- 使用in替換 等于(=)的子查詢語句!
-- in后面的子查詢可以返回多條記錄!

1)例題1
-- 查詢年級編號是1或者2 的 所有學生列表

SELECT * FROM student WHERE gradeId IN(1,2)
2)例題2
-- 查詢 年級名稱是 大一或者大二的所有學生信息

-- 分析:學生表中沒有 年級名稱 但是有年級編號

-- 01.根據 年級名稱 查詢出 年級編號
SELECT gradeID FROM grade WHERE gradeName IN('大一','大二');

-- 02.再根據 年級編號 查詢學生信息
SELECT * FROM student WHERE
gradeID
IN (SELECT gradeID FROM grade WHERE gradeName IN('大一','大二'))

3)例題3(使用where ... =)
-- 查詢參加最近一次 高等數學-1 考試的學生 成績的最高分和最低分

-- 01. 發現成績表中 沒有 編號 只有科目名稱!根據名稱取編號

SELECT SubjectNo FROM `subject` WHERE
subjectName='高等數學-1'

-- 02.查詢最近一次 高等數學-1 考試的時間

SELECT MAX(ExamDate) FROM result
WHERE
SubjectNo=(SELECT SubjectNo FROM `subject` WHERE
subjectName='高等數學-1')

-- 02(2).所有最近考試的成績(老師上課演示用,可以不寫)
SELECT * FROM result
WHERE ExamDate='2013-11-11 16:00:00'

-- 03.開始獲取最高分和 最低分
SELECT MAX(studentResult) AS 最高分,
MIN(studentResult) AS 最低分
FROM result
WHERE SubjectNo=(SELECT SubjectNo FROM `subject` WHERE
subjectName='高等數學-1')
AND ExamDate=
(SELECT MAX(ExamDate) FROM result
WHERE
SubjectNo=(SELECT SubjectNo FROM `subject` WHERE
subjectName='高等數學-1'))

4)例題4(使用where ... in)
-- 查詢 高等數學-1 考試成績是 60 分的 學生信息

-- 01.根據 科目名稱 獲取 科目編號
SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等數學-1'

-- 02.根據科目編號 和 考試成績條件 查詢所有的學生編號
SELECT studentNo FROM result
WHERE SubjectNo=(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等數學-1')
AND StudentResult=60; -- 成績=60

-- 03.根據符合條件學生編號 查詢對應的學生信息
SELECT * FROM student
WHERE studentNo IN
(SELECT studentNo FROM result
WHERE SubjectNo=(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等數學-1')
AND StudentResult=60)


2、not in
-- not in :不在某個范圍之內

1)例題1
-- 查詢未參加 “高等數學-1” 課程最近一次考試的在讀學生名單

-- 01.根據 科目名稱 獲取 科目編號
SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等數學-1'

-- 02根據科目編號 獲取該科目最近一次考試時間
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=
(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等數學-1')

-- 03.查詢沒參加該科目 最近一次考試的 學生編號,學生姓名
SELECT studentNo,StudentName FROM student
WHERE studentNo NOT IN
(
SELECT StudentNo FROM result
WHERE SubjectNo=
(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等數學-1')
AND ExamDate=
(SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=
(SELECT SubjectNo FROM `subject`
WHERE SubjectName='高等數學-1'))
)

?

二、高級查詢

1、笛卡爾乘積

1)概念:笛卡爾乘積是指在數學中,兩個集合XY的笛卡尓積(Cartesian product),又稱直積,表示為X?×?Y
第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員。
假設集合A={a, b},集合B={0, 1, 2},
則兩個集合的笛卡爾積為{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
類似的例子有,如果A表示某學校學生的集合,B表示該學校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。
A表示所有聲母的集合,B表示所有韻母的集合,那么A和B的笛卡爾積就為所有可能的漢字全拼。

2)老師mysql舉例: SELECT * FROM `grade`INNER JOIN `student`
笛卡爾積 :兩個表數據的乘積!

?

2、兩個表的內連接
SELECT * FROM `grade`INNER JOIN `student`
ON grade.`GradeID`=student.`GradeId`

on 兩個表通過那一列建立關聯關系

?

3、exists的使用

1)語法和作用

-- 01. 用于檢測表,數據庫等等 是否存在

-- 02.檢查子查詢中是否會返回一行數據!其實子查詢并不返回任何數據!
只返回 true或者false!

SELECT * FROM Student WHERE EXISTS(SELECT NULL)
SELECT * FROM Student WHERE EXISTS(SELECT 9*9)
SELECT * FROM Student WHERE EXISTS(SELECT StudentName FROM student)

圖示如下:

?

2)exists例題1  exists和in的轉換寫法

-- 01.exists的寫法

SELECT * FROM Student

WHERE EXISTS(SELECT studentName FROM Student WHERE studentName='張三')

-- 02.in的寫法

SELECT * FROM Student WHERE studentName IN(SELECT studentName FROM Student)

-- 03.in 效果等同于 =any
SELECT * FROM Student WHERE
studentName =ANY(SELECT studentName FROM Student)

?

3)all,any和some
-- 01.all 大于子查詢語句中的 最大值 ? >(1,2,3) >3
SELECT * FROM student
WHERE studentNo>ALL
(SELECT studentNo FROM student WHERE studentNo IN(1003,1004,1005))

-- 02.any 大于子查詢語句中的 最小值 ? >(1,2,3) >1
SELECT * FROM student
WHERE studentNo>ANY
(SELECT studentNo FROM student WHERE studentNo IN(1003,1004,1005))

-- 03.some 和any功能一樣
SELECT * FROM student
WHERE studentNo>SOME
(SELECT studentNo FROM student WHERE studentNo IN(1003,1004,1005))

?

4)exists例題2
-- 檢查“高等數學-1” 課程最近一次考試成績
-- 如果有 80分以上的成績,顯示分數排在前5名的學員學號和分數


-- ① 不使用exists

-- 01.查詢“高等數學-1” 課程 對應的編號
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'

-- 02.查詢最近的考試成績
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1')

-- 03. 在02的基礎上 加條件 成績大于80
SELECT * FROM result
WHERE ExamDate=
(SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'))
AND StudentResult>80

-- 04.顯示分數排在前5名的學員學號和分數
SELECT studentNo,StudentResult FROM result
WHERE ExamDate=
(SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'))
AND StudentResult>80
ORDER BY StudentResult DESC
LIMIT 0,5

?

同樣題目:

-- 檢查“高等數學-1” 課程最近一次考試成績
-- 如果有 80分以上的成績,顯示分數排在前5名的學員學號和分數

-- ② 使用exists

-- 01.查詢“高等數學-1” 課程 對應的編號
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'

-- 02.查詢最近的考試時間
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1')


-- 03.查詢學號和成績
SELECT StudentNo,StudentResult FROM result
WHERE EXISTS
(
SELECT * FROM result
WHERE subjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1')
)
AND StudentResult>80
)
AND subjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1')
)
ORDER BY StudentResult DESC
LIMIT 0,5

?

5)exists例題3
-- 如果有 年級名稱是大二 的學生,就 查詢出 年級名稱是大一的 所有學生信息

-- 01.先查詢出 對應的年級編號
SELECT GradeId FROM grade WHERE GradeName='大一'
SELECT GradeId FROM grade WHERE GradeName='大二'

-- 02.在學生表中是否存在 年級名稱是大二 的學生
SELECT * FROM student WHERE gradeID=(
SELECT GradeId FROM grade WHERE GradeName='大二'
)

-- 03.如果有查詢出 年級名稱是大一的 所有學生信息
SELECT * FROM student
WHERE EXISTS
(
SELECT * FROM student WHERE gradeID=(
SELECT GradeId FROM grade WHERE GradeName='大二'
)
)
AND GradeId=(
SELECT GradeId FROM grade WHERE GradeName='大一'
)

?

6)not exists
例題如下:
-- 檢查“高等數學-1”課程最近一次考試成績
-- 如果全部未通過考試(60分及格),認為本次考試偏難,計算的該次考試平均分加5分

-- 01.查詢“高等數學-1” 課程 對應的編號
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'

-- 02.查詢最近的考試成績
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1')

-- 03.查詢成績大于60的 (逆向思維)
SELECT StudentResult FROM result
WHERE StudentResult>60
AND SubjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1')
)

-- 04. 如果全部未通過考試,考試平均分加5分
SELECT AVG(StudentResult)+5 FROM result
WHERE NOT EXISTS
(
SELECT StudentResult FROM result
WHERE StudentResult>60
AND SubjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1')
)
)
AND SubjectNo=(
SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1'
)
AND ExamDate=(
SELECT MAX(ExamDate) FROM result
WHERE SubjectNo=(SELECT subjectNo FROM `subject`
WHERE SubjectName='高等數學-1')
)

?

7) 使用子查詢的注意事項
-- 01.任何允許使用表達式的地方都可以使用子查詢
-- 02.只出現在子查詢中但是沒有在父查詢中出現的列,結果集中的列不能包含

?

4、sql優化(使用exists 代替 in)

1)使用exists 代替 in
使用not exists 代替not in

exists 只返回true或者false.不返回結果集
in 返回結果集

-->exists性能更高!

2)例題1
-- 查詢姓李的學生信息 % 代表0或者多個字符 _代表一個字符

-- 01.使用like
SELECT * FROM student WHERE StudentName LIKE '李%'
SELECT * FROM student WHERE StudentName LIKE '李_'

-- 02.使用in完成上述代碼
SELECT * FROM student WHERE StudentName IN(
SELECT studentName FROM student WHERE StudentName LIKE '李%')
-- in(多條數據--》返回結果集)

-- 03.使用exists替換
SELECT * FROM student WHERE EXISTS(
SELECT studentName FROM student)
AND StudentName LIKE '李%'
-- exists(有沒有數據)

?

5. GROUP BY 列名 分組   having 分組之后的條件
1)例題1
-- 統計每門課程平均分各是多少
SELECT subjectno,AVG(studentresult) FROM result
GROUP BY subjectno

2)例題2
-- 查詢出課程平均分大于60的課程編號 和 平均分
SELECT subjectno,AVG(studentresult) FROM result
GROUP BY subjectno
HAVING AVG(studentresult)>60 -- 分組之后的條件

3)例題3
-- 01.統計每門課程平均分各是多少 降序排列
SELECT subjectno,AVG(studentresult) FROM result
GROUP BY subjectno
ORDER BY AVG(studentresult) DESC

-- 02.如果成績相同 再按照 課程編號 升序排序
SELECT subjectno,AVG(studentresult) FROM result
GROUP BY subjectno
ORDER BY AVG(studentresult) DESC,subjectno

4)例題4
-- 分組統計每個年級的 男女人數

SELECT gradeid 年級編號,sex 性別,COUNT(sex) 人數
FROM student
GROUP BY gradeid,sex

?

6、面試題
1)面試題1

老師代碼:(數據不完全對應題目,領會解題方法)

-- 創建表
CREATE TABLE IF NOT EXISTS examTest(
id INT(2) NOT NULL,
sex VARCHAR(20)
)

-- 同時新增多條數據
INSERT INTO examTest VALUES(1,'男'),(2,'男'),(3,'女'),(4,NULL);

01.使用where
SELECT sex AS '性別',COUNT(sex) AS '人數' FROM examTest
WHERE sex IS NOT NULL
GROUP BY sex
ORDER BY COUNT(sex) DESC

02.使用having
SELECT sex AS '性別',COUNT(sex) AS '人數' FROM examTest
GROUP BY sex
HAVING sex IS NOT NULL
ORDER BY COUNT(sex) DESC

03.使用where和in(取巧)
SELECT sex AS '性別',COUNT(sex) AS '人數' FROM examTest
WHERE sex IN('男','女')
GROUP BY sex
ORDER BY COUNT(sex) DESC


2)面試題2

作業,待解答

下次課確認答案后補上

老師代碼:

?

?

?

三、作業

1、復習之前所講的mysql課程(老師txt文件里的),預習事務,下節課考試

2、面試題第二題

四、老師辛苦了!

?

?

轉載于:https://www.cnblogs.com/wsnedved2017/p/7111032.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371786.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371786.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371786.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

excel文件被寫保護怎么解除_u盤被寫保護怎么解除,看完你就知道了

在平常我們使用U盤存儲資料過程中,有時會發現U盤出現無法正常讀寫的現象,具備表現為U盤被寫保護,無法正常執行讀寫操作。對于小編給大家提供以下解決方法,希望對大家能有所幫助。對U盤執行重置操作01上網搜索并下載“USBOOT”程序…

新建MAVEN項目--pom.xml報錯

使用集成了maven的Eclipse版本新建maven項目后,配置文件pom.xml會在project以及引用的xsd文件處出現錯誤(第一、二行報錯) 其中一個報錯例子: Multiple annotations found at this line:- Plugin execution not covered by lifecy…

OSGi案例研究:模塊化vert.x

OSGi使Java代碼可以清晰地劃分為多個模塊,這些模塊稱為捆綁軟件 ,可以訪問由每個捆綁軟件的類加載器控制的代碼和資源。 OSGi 服務提供了一種附加的分離機制:接口的用戶不需要依賴于實現類,工廠等。 以下案例研究旨在使OSGi捆綁包…

mysql一些常用操作_表的一些常用操作_MySQL

bitsCN.com-創建表(也就是創建表結構):create table tbl_name(列結構,即有哪些屬性)[表選項]; 如:班級的信息:(班級編號,開班日期)create table java_class(class_num varchar(10),date_start date);注:該表…

網站appache的ab命令壓力測試性能

①:相關不錯的博文鏈接:http://johnnyhg.iteye.com/blog/523818 ②:首先配置好對應的環境上去,有對應的命令 ③:壓力測試的指令如下: 1. 最基本的關心兩個選項 -c -n例: ./ab -c 100 -n 10000 &…

如何調整自定義標簽樣式

用chromeF12,查看網頁代碼在自定義標簽上加class,寫樣式:例如:JSP文件:來自為知筆記(Wiz)轉載于:https://www.cnblogs.com/anobugworld/p/7112116.html

無需部署即可測試JPQL / HQL

您是否曾經想在不完全部署應用程序的情況下測試JPQL / HQL? 我們今天在這里看到的是適用于任何JPA實現的簡單解決方案:Hibernate,OpenJPA,EclipseLink等。 這篇文章中找到的基本源代碼來自于本書:“ Pro JPA 2&#xf…

freemarker頁面中文亂碼

一、前言 簡單的記錄freemarker遇到的錯誤問題&#xff1a;ftl頁面中文亂碼 由于freemarker整合在ssm框架中&#xff0c;所以筆者直接貼配置代碼 <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-ins…

了解ThreadLocal背后的概念

介紹 我知道本地線程&#xff0c;但直到最近才真正使用過它。 因此&#xff0c;我開始深入研究該主題&#xff0c;因為我需要一種傳播某些用戶信息的簡便方法 通過Web應用程序的不同層&#xff0c;而無需更改每個調用方法的簽名。 小前提信息 線程是具有自己的調用棧的單個…

python加密模塊教程_Python加密模塊的hashlib,hmac模塊使用解析

這篇文章主要介紹了Python加密模塊的hashlib,hmac模塊使用解析,文中通過示例代碼介紹的非常詳細&#xff0c;對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下在寫搬磚腳本中&#xff0c;碰到一個加密的信號標簽文件無法運行。import hashlibimport timem ha…

DAO層–救援通用

泛型可以是使用編譯時驗證&#xff08;類型安全性&#xff09;的功能來創建可重用代碼的強大工具。 不幸的是&#xff0c;我感到主流開發人員仍然對此感到恐懼。 但是&#xff0c;比喻海格的蜘蛛&#xff0c;我會說泛型是被嚴重誤解的生物……:-) 我希望以下示例可以證明它們…

ThreadLocal詳解(實現多線程同步訪問變量)

ThreadLocal翻譯成中文比較準確的叫法應該是&#xff1a;線程局部變量。 這個玩意有什么用處&#xff0c;或者說為什么要有這么一個東東&#xff1f;先解釋一下&#xff0c;在并發編程的時候&#xff0c;成員變量如果不做任何處理其實是線程不安全的&#xff0c;各個線程都 在操…

SCREEN屏幕編程時候必須保證SCREN中詞典的字段格式必須和數據表中字段的類型長度一致!...

此時任意操作都會出現如下問題 /h調試 回車調試被激活任意操作 執行到第23行時候報錯“請輸入一個數值”&#xff0c;檢查數據表中字段參考數據元素以及對應的域均是char類型&#xff0c;此時檢查screen屏幕設置字段類型&#xff0c;/n退出程序 重新進入程序 單擊 點擊屏幕9000…

mysql 阿里云 版本_關于阿里云centos版本,mysql5.7的一些注意事項

1.阿里云進去mysql是默認已經安裝好了的&#xff0c;只需要修改root用戶的密碼。關于修改密碼&#xff1a;1)登陸阿里云&#xff0c;進入root目錄&#xff0c;會有mysql的.sh文件&#xff0c;可以通過運行該文件得到初始密碼。此時用初始密碼登陸mysql&#xff0c;use mysql 切…

JAXB –不需要注釋

似乎存在一個誤解&#xff0c;認為在模型上需要使用批注才能使用JAXB&#xff08;JSR-222&#xff09;實現。 事實是&#xff0c;JAXB是例外配置&#xff0c;因此僅當您要覆蓋默認行為時才需要注釋。 在此示例中&#xff0c;我將演示如何在不提供任何元數據的情況下使用JAXB。 …

zabbix 3.0.3 (nginx)安裝過程中的問題排錯記錄

特殊注明&#xff1a;安裝zabbix 2.4.8和2.4.6遇到2個問題&#xff0c;如下&#xff1a;找了很多解決辦法&#xff0c;實在無解&#xff0c;只能換版本&#xff0c;嘗試換&#xff08;2.2.2正常 | 3.0.3正常&#xff09;都正常&#xff0c;最后決定換3.0.31、Error connecting …

安裝mysql5.7.24rpm_centos7安裝mysql-5.7.24(rpm安裝)

關于mysql的4個rpm包node[rootelk-200 ~]# ls mysql/ -lhtotal 192M-rw-r--r-- 1 root root 25M Aug 26 12:38 mysql-community-client-5.7.24-1.el7.x86_64.rpm-rw-r--r-- 1 root root 275K Aug 26 12:38 mysql-community-common-5.7.24-1.el7.x86_64.rpm-rw-r--r-- 1 root ro…

Java鎖實現

我們都使用第三方庫作為開發的正常部分。 通常&#xff0c;我們無法控制其內部。 JDK隨附的庫是一個典型示例。 這些庫中的許多庫都使用鎖來管理競爭。 JDK鎖具有兩種實現。 人們使用原子CAS樣式指令來管理索賠過程。 CAS指令往往是最昂貴的CPU指令類型&#xff0c;并且在x86上…

一鍵生成APP官網

只需要輸入蘋果下載地址&#xff0c;安卓市場下載地址&#xff0c;或者內測下載地址&#xff0c;就能一鍵生成APP的官網&#xff0c;方便在網上推廣。 好推APP官網 www.hotapp.cn/app 轉載于:https://www.cnblogs.com/likwo/p/6223889.html

python 字符ab+字符c 2_“ab”+”c”*2 結果是: (1.3分)_學小易找答案

【判斷題】藥物效應動力學簡稱藥效學,是研究藥物對機體的作用?【單選題】以下關于Python語言中“縮進”說法正確的是:?????????????????????????????????????????????????????????????????????????…