MySQL學習筆記之對單表數據記錄的查詢操做

數據查詢是數據庫的核心操做。在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 起始位置,顯示條數
複製代碼

上面這些 關鍵字不必定都要用到,根據本身的需求進行選擇,可是selectfrom 是必須的。這些關鍵字的相對順序也是固定的,不能亂寫位置。下面開始每一個關鍵字的具體用法進行學習:函數

簡單的查詢

查詢指定列的數據記錄

咱們能夠對錶中的須要的部分屬性列,進行查詢。只須要把屬性列(多個屬性列時,它們之間須要,隔開)添加到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;
複製代碼

限制查詢數量

小結

本章學習了關於單表數據的查詢操做,內容比較多,知識點比較基礎。今天的學習到此結束,有什麼不對或不許確的地方,歡迎在評論區指定出來。

公衆號:HarLearn

公衆號:HarLearn
相關文章
相關標籤/搜索