mysql 數據庫查詢與實例。


資料是從教材弄下來的,加上了我的理解。主要內容是練習實例,在寫博文中學習命令行,當然也希望這篇博文能幫助其他人學習mysq數據庫命令

 

SELECT 語句可以從一個或多個表中選取特定的行和列

   SELECT                            指定要查詢的列名稱,列與列之間用逗號隔開。

    [ALL|DISTINCT]             ALL(默認)顯示所有行,包括重復行   |   DISTINCT   消除重復行

    [FROM表名[,表名]……]      指定要查詢的表,可以指定兩個以上的表,表與表之間用逗號隔開。

    [WHERE子句]                   指定要查詢的條件。where子句必須緊跟FROM子句之后。

                                             列出了過濾條件類型和用於過濾數據的條件。

                                           

 

 [GROUP BY子句]               子句用於對查詢結構進行分組。

    [HAVING子句]                  指定分組的條件,通常在GROUP BY子句之后。

    [ORDER  BY子句]             用於對查詢結果進行排序。【asc(升序) | desc(降序)】

    [LIMIT子句]                     限制查詢的輸出結果行。

 

下面是實例 

1.在學生表(students)查詢學生的學號(s_no),姓名(s_name),聯系電話(phone)

select s_no,s_name,phone from students;

運行結果:

 

 

2.查詢(students)表中學生所在系部(d_no),去掉重復值。SQL語句 如下

select  d_no distinct from  students;

這是加了distinct(去掉重復行)語句的圖

 

這是沒有加distinct語句的(形成了鮮明的對比)

 

 

3.從students表統計男生(sex)的學生人數,SQL語句如下。

select count(*) as 男生人數 from students where sex="";

運行結果:

count()為計算數量的函數,*號是通配符 , as ** 是注釋

 

 

4.查詢學生的姓名(students表,s_name)、系部名稱(department表,d_name)和聯系地址(students表,address),SQL語句如下

select S_NAME as ‘姓名’,D_NAME as ‘系部’,address as‘地址’ from students,departments where students.d_no = departments.d_no;

多表查詢,FROM后面的各個表用逗號隔開  WHERE后面指明表與表之間的全連接,因為這是2張表,而他們有相同的列名,必須進行表與表的鏈接。不然會得到錯誤數據

(多表連接會在第23例開始介紹)

 

 

5.在成績表(score)中查詢選修了A001課程(c_no)且成績(report)在80分以上的學生,SQL語句如下。

select * from score where c_no="A001" and report > 80;

有2個或以上的條件時,條件與條件直接用 and鏈接

 

 

6.在students表中查詢出生日期(birthday)在1992年5月出生的學生。

select * from students where birthday between "1992-5-1" and '1992-5-31';

between是區間,范圍的意思

運行效果如圖

 

 

7.在students表中查詢院系編號(d_no)為D001或D002的學生。

select * from students where d_no in('d001','d002');

用in去查找 d_no 表中的數據,有幾個再加逗號就行了

 

 

8.在students表中查詢電話(phone)不為空的學生信息。

select * from students where phone is not null;

查詢結果

真正的空值是會顯示NULL的,有一個空格都不算null

 

 

9.在students表中查詢姓(s_name)李的學生信息。

select * from students where s_name like'李%';

 

其中like里面的符號的可能值(有點像正則表達式0.0)

 

 

10.在students表中查詢住址(address)在北京路的學生信息。

select * from students where address like'%北京%';

 

 

11.在students表中查詢姓名(s_name)是兩位字符的學生信息

select * from students where s_name like '__';

一個'_'代表一個字符、

運行結果

這樣就能查找到名字是2位的數據了

 

  GROUP BY子句主要根據字段對行分組。例如,根據學生所學的專業對STUDENTS表中的所有行分組,結果是每個專業的學生成為一組。

下面的例子難度稍稍加大了。

 

12.在students表中按系(d_no)統計各系的學生人數,SQL語句如下

select d_no as '系別' count(*) as '各系人數' from students group by d_no;

 

 

13.在students表中統計各系(d_no)男女生(sex)人數。SQL語句如下。

select d_no as '系別', sex as '性別' ,count(*) as '人數' from students group by d_no,sex;

可以指定多列分組。若指定多列分組,則先按指定的第一列分組再對指定的第二列分組,以此類推。

 

 

14.在score表中求選修的各門課程(c_no)的平均成績(report)和選修該課程的人數

select c_no, count(c_no) as '選修人數', avg(report) as '各系平均成績' from score group by c_no;

運行結果

因為求的是各部門(c_no)的平均成績,所以以c_no為分組依據group by c_no

 

 

15.在teachers表中統計各系(d_no)教師人數,包括匯總行。SQL語句如下。

 

select d_no as '系別', count(*) as '人數' from teachers group by d_no with rollup;

 

null 20為人數匯總 教師人數20個

使用帶ROLLUP操作符的GROUP BY子句: 在結果集內不僅包含由GROUP BY提供的正常行,還包含匯總行。

 

 

16.在score表中按成績(report)降序排序列出選修AOO1課程(c_no)的學生學號(s_no)和成績,SQL語句如下。

select s_no as '學號', c_no as '課程' ,report as'成績' from score where c_no='A001' order by report desc;

運行結果

默認是升序,當需求是升序時 可以不寫order by 列名 asc ,當需求是降序時。加上 order by 列名 desc         

 

17.在students表中按系部(d_id)和出生日期(birthday)排序,SQL語句如下。

select * from students order by 5,4 desc;

運行結果

ORDER BY 5,4中的5表示第5列(d_NO),4表示第4列(birthday)。(偷懶的寫法,如果你對表的結構非常熟悉的話);desc 為降序 

 

 認識HAVING子句

  使用HAVING子句的目的與WHERE子句類似,不同的是WHERE子句是用來在FROM子句之后選擇行,而HAVING子句用來在GROUP BY子句后選擇行。語法格式如同WHERE。

 

18.列出在score表中選修了2門以上課的學生學號(s_no)。

SELECT s_no
FROM score
GROUP BY s_no
HAVING COUNT( * ) >2

having說白了和where 是一個作用,having 用在group by ** 后面 。而where更在 from ** 后面。但具體用法還是有區別的,比如多表連接,只能用where。而用having會報錯。我用實例4和其他多表連接實例都試過了,得出了這個結論。(或許可以研究下圍繞這個where 和having的區別 再寫一篇博文^_^!)

 

認識LIMIT子句

  Limit子句主要用於限制被SELECT語句返回的行數。

 語法格式:LIMIT {【偏移量,】 行數 | 行數OFFSET偏移量}

 

19.在score表中查詢課程號(c_no)為‘A101’成績(report)前五名的學生(s_no)

SELECT S_NO AS '學號', REPORT AS '分數'
FROM SCORE
WHERE C_NO =  'A001'
ORDER BY REPORT DESC ;

 

20.在 score表中查詢成績(report)第5名至第10名的學生(s_no)。

SELECT S_NO AS'學號'
FROM SCORE
ORDER BY REPORT
LIMIT 4 , 10

 

 

COUNT(*)計算所有記錄的數量,也包括空值所在的行。使用count(*) 會最快返回結果。而CONUT(列名)則只計算列的數量,不計該列中的空值。

  同樣,AVG、MAX、MIN和SUM函數也不計空的列值。即不把空值所在行計算在內,只對列中的非空值進行計算。

 
 

21.在score表中求課程(c_no)為A001的最高分、最低分(report)。

select max(report) as '最高分', min(report) as '最低分' from score group by c_no having c_no ='a001';

運行結果

 

 

22.在score表中求各課程(c_no)選修的學生人數

select c_no as '課程',count(*) as '人數' from score group by c_no

 

 

多表連接查詢

數據庫的設計原則是精簡,通常是每個表盡可能單一,存放不同的數據,最大限度減少數據冗余。而在實際工作,需要從多個表查詢出用戶需要的數據並生成一個臨時結果,這就是連接查詢。

當查詢的數據來源於2個及以上表時,可用全連接、JOIN連接或子查詢來實現

多表查詢實際上通過各個表之間的共同列的關聯性來查詢數據。連接的方式是將各個表用逗號分隔,用WHERE子句設定條件進行等值連接,這樣就指定了全連接。

格式如下。

   SELECT表名.列名【,...n】

     FROM表1【,...n】

     WHERE {連接條件AND |OR查詢條件}

 

可能會從這開始懵逼 因為你沒有我的數據庫,而且關聯的表太多 看暈 懵逼不要緊 記住一點 要觀察表與表之間有什么相同的鍵 然后把他們關聯起來就可以了 。不要糾結我的實例

23.查找course表和score表中所有學生選過的課程名(c_name)和課程號(c_no)

SELECT DISTINCT COURSE.c_no,COURSE.c_name 
FROM COURSE,SCORE 
WHERE COURSE.c_no=SCORE.c_no;

 

24.查詢信息學院學生所選修的課程(c_no)和成績(report)。涉及 students,score,course,departments  這4個表

SELECT course.c_no, score.report
FROM STUDENTS, score, course, departments
WHERE STUDENTS.s_no = score.s_no
AND course.c_no = score.c_no
AND STUDENTS.d_no = departments.d_no
AND departments.d_name =  '信息學院'

 

25.查詢選修了“陳靜”老師課程的學生

SELECT score.s_no, course.c_no, t_name
FROM teachers, teach, course, score
WHERE course.c_no = score.c_no
AND teach.c_no = course.c_no
AND teachers.t_no = teach.t_no
AND teachers.t_name =  '陳靜'

 

JOIN連接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM