數據查詢是數據庫的核心操做。在mysql中咱們使用 select
語句進行數據查詢。本篇文章將學習在單表中進行數據查詢的一些操做。mysql
進入數據庫,導入咱們學習查詢所須要的數據。 sql
進入mysql,建立一個school
數據庫,而後經過
source d:\school.sql
把數據導入
school
數據庫中。
source
後面跟的是SQL文件的路徑(根據你的SQL文件所在的實際位置進行填寫)。能夠關注公衆號:
HarLearn,回覆:
MySQL數據,得到
school.sql
文件。
一共三張表,裏面總共幾十條數據,用於輔助咱們對單表查詢的理解。下面開始對查詢的學習。
MySQL中的數據查詢主要是以select
子句爲主,裏面還附帶了一些關鍵字來豐富咱們的查詢。下面是單表查詢的通常格式:數據庫
select 屬性列表達式,屬性列表達式,...,屬性列表達式
from 表名或者視圖
where 條件表達式
group by 列名1,列名2,..,列名n
having 條件表達式
order by 列名
limit 起始位置,顯示條數
複製代碼
上面這些 關鍵字不必定都要用到,根據本身的需求進行選擇,可是select
和from
是必須的。這些關鍵字的相對順序也是固定的,不能亂寫位置。下面開始每一個關鍵字的具體用法進行學習:函數
咱們能夠對錶中的須要的部分屬性列,進行查詢。只須要把屬性列(多個屬性列時,它們之間須要,
隔開)添加到select
後面。如查詢tab_student
表中全體學生的學號和姓名,代碼以下:學習
select s_id, s_name
from tab_student;
複製代碼
查詢所有列,能夠把表中的全部列都添加到select
後面。雖然這樣操做比較繁瑣,可是能夠調整顯示列的順序。若是不在意顯示的順序,也能夠使用*
代替select
後面全部的屬性列。如咱們查詢全體學生的信息,代碼以下:spa
select * from tab_student;
複製代碼
有時咱們在查詢數據記錄時會產生相同的數據,這時能夠使用mysql爲咱們提供的distinct
關鍵字,下面經過查詢 選修了課程的 學生學號 進行演示,代碼以下:3d
# 使用了 distinct 關鍵字
select distinct s_id
from tab_sc;
#沒使用 distinct 關鍵字
select s_id from tab_sc;
複製代碼
在select
後面的屬性列中,能夠進行簡單的數學運算,下面經過查詢全體學生的出生年份,瞭解如何使用運算符,代碼以下:code
select s_name, 2019-s_age
from tab_student;
複製代碼
上圖中在
2019-s_age
後面添加了一個
birth_year
,它是爲
2019-s_age
起的一個別名,咱們也能夠經過關鍵字
as
來實現,如
select s_name, 2019-s_age as birth_year from tab_student;
。
MySQL中經過 where
子句爲查詢設置條件,放在from
的後面。where
後面能夠添加關係運算符、邏輯運算符、肯定集合、肯定範圍、檢測空值等等。cdn
MySQL中的關係運算符有六個分別是:>, <, >=, <=, =, !=
。下面經過幾個例子瞭解它的應用,代碼以下:blog
# 查詢計算機科學系全體學生的名單
select s_name
from tab_student
where s_dept = 'CS';
# 查詢全部年齡在20歲如下的學生姓名和年齡
select s_name, s_age
from tab_student
where s_age < 20;
複製代碼
在MySQL中經過between and
來表示在一個範圍間的判斷,判斷不在這個範圍內能夠使用not between and
。 注: 這些關鍵字操做符只針對數字類型。經過下面樣例進行理解,代碼以下:
# 查詢年齡在 20 ~ 23 歲之間的學生。 利用 between and
select s_name, s_age
from tab_student
where s_age between 20 and 23;
# 查詢年齡不在 20~23之間的學生。利用 not between and
select s_name, s_age
from tab_student
where s_age not between 20 and 23;
複製代碼
經過上面咱們知道,
between and
是一個閉區間,[20,23]。
經過關鍵字 in
能夠用來判斷查找的屬性值是否屬於指定的集合,與之相反的是not in
,用來判斷查找的屬性值是否不屬於指定的集合。看下面樣例:
# 查詢計算機系和數學系學生的信息。 利用 in
select *
from tab_student
where s_dept in ('CS','MA');
# 查詢不是 計算機系和數學系學生的信息 利用 not in
select *
from tab_student
where s_dept not in ('CS','ma');
複製代碼
注: 使用關鍵字
not in
,查詢的集合中若是存在
null
,則不會有任何的查詢結果。如:
select * from tab_course where c_pno not in ( 6,1,null);
不會查詢到結果。爲何是這樣,應該和
null
的特殊性有關,具體也不清楚,
等待解決。
模糊查詢解決的是 咱們在查詢時 只知道字段值部分的狀況。好比咱們知道有一個同窗姓劉,可是具體叫什麼不知道。這時,能夠使用模糊查詢進行查詢。模糊查詢是經過關鍵字like
和通配符(_, %)
組合來完成的,通配符也能夠省略。_
通配符只能匹配單個字符。%
通配符能夠匹配任意長度的字符串,若是匹配%%
則表示查詢全部數據記錄。下面經過幾個樣例進行理解:
# 查詢2018年入學的學生。 利用 like 模糊查詢
select *
from tab_student
where s_id like '2018%';
# 查詢名字中第二個字是 白 的學生。利用佔位符 _
select *
from tab_student
where s_name like '_白%';
# 查詢全部不姓 劉 的學生。 利用 not like
select *
from tab_student
where s_name not like '劉%';
複製代碼
注: 若是查詢的字符串自己就包含通配符
_
和
%
,能夠是使用轉義字符(默認是
\
)對其轉義。或者使用
escape
指定一個轉義字符。下面經過幾個樣例進行理解。
# 查詢course 表中 database_design 課程的信息。 利用 \ 轉義字符
select *
from tab_course
where c_name like '%\_design';
# 查詢course 表中 database_design 課程的信息。
# 經過 escape 關鍵字指定 字符 C 爲轉義字符
select *
from tab_course
where c_name like '%C_design' escape 'C';
複製代碼
對用空值的查詢能夠使用關鍵字is null
或者 is not null
,一個檢測是空值,一個檢測不是空值。下面經過樣例學習它們的使用。
# 查詢沒有參加考試的學生的學號和課程號。利用 is null
select s_id, c_id
from tab_sc
where sc_grade is null;
# 查詢參加考試學生的學號和課程號。利用 is not null
select s_id, c_id
from tab_sc
where sc_grade is not null;
複製代碼
邏輯運算符包括:AND(&&) , OR (||), XOR , NOT(!)
。經過邏輯運算符能夠鏈接多個查詢條件,下面經過樣例進行了解:
# 查詢計算機科學系年齡在20歲如下的學生信息
select *
from tab_student
where s_dept = 'CS' and s_age < 20;
複製代碼
MySQL提供了order by
來設置查詢結果的順序,默認是升序。能夠經過關鍵字DESC
設置爲降序,關鍵字ASC
設置爲升序。
# 查詢2號課程的學生的學號和成績, 默認是 升序 也能夠使用asc。
select s_id, sc_grade
from tab_sc
where c_id = 2
order by sc_grade;
# 以降序排列。降序使用關鍵字desc設置
select s_id, sc_grade
from tab_sc
where c_id = 2
order by sc_grade desc;
複製代碼
注: 空值在排序時是最小的。 按照多字段進行排序,在具體運行過程當中,首先按照第一個字段進行排序,若是遇到相同的字段,按照第二個字段進行排序。
# 對學生表進行排序,先按照年齡排序,年齡相同時 按照學號排序
select *
from tab_student
order by s_age,s_id;
複製代碼
MySQL提供了一些函數,爲了方便咱們作一些統計任務,統計函數在遇到空值時進行忽略(count(*)除外)下面列舉幾個經常使用的函數:
函數名 | 描述 |
---|---|
count(*或列名) | 統計數據記錄的個數 |
sum(列名) | 計算計算一列值的總和(數值類型) |
avg(列名) | 計算一列值的平均值(數值類型) |
max(列名) | 求一列值中的最大值 |
min(列名) | 求一列值中的最小值 |
# 查詢學生總人數。利用count()
select count(*)
from tab_student;
# 查詢選修了課程的學生人數,利用 distinct 關鍵字去除重複
select count(distinct s_id)
from tab_sc;
# 查詢全體學生的平均年齡。利用 avg() 函數
select avg(s_age)
from tab_student;
# 查詢選擇3號課程學生的最高分和最低成績。利用 max() 和 min()
select max(sc_grade) maxGrade, min(sc_grade) minGrade
from tab_sc
where c_id = 3;
# 查詢 201915121 選修課程的總學分。 利用 sum() 函數
select sum(c_credit)
from tab_sc, tab_course
where s_id = '201915121' and tab_sc.c_id = tab_course.c_id;
複製代碼
MySQL提供group by
子句將查詢結果按某一列或多列的值進行分組,值相同的在一組。在進行多列分組時,首先按照第一個列名進行分組,而後對每一組再按照第二個列名進行分組。 分組後統計函數將做用於每個組。
# 查詢各個課程號及相應的選課人數。利用 group by 分組
select c_id, count(s_id)
from tab_sc
group by c_id;
複製代碼
MySQL中的
where
子句主要是做用於基本表或視圖,若是實現對分組進行條件限制,能夠使用MySQL提供的
having
關鍵字。經過樣例來了解:
# 查詢平均成績大於等於 90 分的學生學號和平均成績。利用 having 進行條件限制
select s_id,avg(sc_grade)
from tab_sc
group by s_id
having avg(sc_grade) >= 90;
複製代碼
經過關鍵字limit
來限制數據查詢結果數量,格式爲limit start, row_count
,參數start
設置數據記錄的起始位置(省略默認爲0),參數row_count
設置顯示的行數。常常用在分頁系統中,和 order by
一塊兒使用。
# 查詢前學生表中前五名學生
select *
from tab_student
limit 5;
# 查詢學生表中第五名到第八名的學生
select *
from tab_student
limit 5,3;
複製代碼
本章學習了關於單表數據的查詢操做,內容比較多,知識點比較基礎。今天的學習到此結束,有什麼不對或不許確的地方,歡迎在評論區指定出來。