資料是從教材弄下來的,加上了我的理解。主要內容是練習實例,在寫博文中學習命令行,當然也希望這篇博文能幫助其他人學習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連接