MySQL學習之路_SELECT語句

前面幾篇博客已經講過數據庫、表的創建、簡單的增刪改查(CRUD)語句,如果沒看到的,可以點擊傳送。
現在來重點講下查詢語句SELECTSELECT 是MySQL中最複雜也是功能強大的語句,這篇博文也幾乎囊概了前幾篇的內容,所以,借這個機會,順便也複習下前幾篇博文所講內容,當然,也會涵蓋一些新的內容。

爲了更好的說明,我們先創建幾張表,便於接下來的內容直接使用。

-- 創建一個數據庫
CREATE DATABASE school;
-- 使用創建的數據庫school
USE school;
-- 創建表
CREATE TABLE score
    (id SMALLINT NOT NULL AUTO_INCREMENT,
    name VARCHAR(10) NOT NULL,
    math INT NOT NULL,
    english VARCHAR(10) NOT NULL,
    chinese VARCHAR(10) NOT NULL,
    phone VARCHAR(10),
    PRIMARY KEY(id));
-- 往表裏插入數據
INSERT INTO score(name, math, english, chinese, phone) VALUES ('張三', 89, 34, 25'123456789');
INSERT INTO score(name, math, english, chinese, phone) VALUES ('李四', 69, 78, 90, '111111111');
INSERT INTO score(name, math, english, chinese, phone) VALUES ('王五', 99, 70, 88, '22222222');
INSERT INTO score(name, math, english, chinese, phone) VALUES ('趙六', 59, 66, 77, '33333');
INSERT INTO score(name, math, english, chinese, phone) VALUES ('趙六', 90, 58, 88, '44444444444');
-- 查看所有數據
SELECT * FROM score;

下圖表示的是我們插入的所有數據的顯示。
顯示的所有數據
代碼中都寫了註釋,就不多解釋了,下面開始進入正題。

過濾表中重複的數據

在使用SELECT 查詢數據時,可能會遇到查詢的數據重複的情況,這時候就要用到關鍵字DISTINCT 了。這個關鍵字可以讓查詢的數據中重複的數據只顯示一次。
沒有對比,就沒有差異,先看看所有的數據。

SELECT name FROM score;

結果如下:
顯示name
可以看出,顯示的數據有一個重複的’趙六’。
使用DINSTINCT 語句避免顯示數據的重複。

SELECT DISTINCT name FROM score;

顯示如下:
對比圖
可以看出,重複的數據’趙六’只顯示了一次,而不是兩次。

這裏就在說一下SELECT 的另一個用法,這個用法我也不知道怎麼說明好,所以就放這兒一起說了。

如果要查詢每位同學的數學加了10分之後的結果,並且,不改變表中數據的值。可能大家想到的是,先用UPDATE 語句更改每行數學分數的值。這麼做太麻煩,而且,最重要的是,這已經改變原來的數據了。可以用下面的方法來做。

SELECT math+10 FROM score;

爲了便於觀察,下圖依次是查詢原來數據的,原來數據上加10的:
math

math+10
我們可以再看看錶中math 是否被更改:
math
可以看出,原先數據並沒有被改變。爲了美觀,我們還可以爲math+10 加上別名,這樣在顯示的時候,就不是math+10,而是你指定的名稱了。

SELECT math+10 AS mathAdd10 FROM score;

顯示的結果:
別名
可以看出,這時列名已經更改爲我自己設置的mathAdd10 了。這個也很簡單,只要在要添加別名的列後寫AS 加上要取的別名即可。這些就不過多測試了。
再說一個查詢總分的SELECT語句。

SELECT name, (math+english+chinese) AS Total FROM score;

TOTAL

WHERE 過濾結果

查詢時,只想查詢某個學生的成績,或者想查詢總分大於100的學生可以使用`WHERE 字句來過濾結果。

SELECT name, math, english, chinese FROM score WHERE name='張三';

WHERE

SELECT name FROM score WHERE (math+english+chinese)>100;

 dayu100
上面分別是查詢名字是‘張三’的各科成績和查詢總分超過100的學生名字。

查詢math在 80-90分的同學。

SELECT name FROM score WHERE math>80 AND math<90;
-- 也可以這麼寫
-- SELECT name FROM score WHERE math BETWEEN 80 AND 90;
-- BETWEEN AND表示一個範圍,在什麼和什麼範圍。固定的語法
-- 區別是後者包括90,前者不包括90。

AND
上面的語句使用到了運算符AND,除了這個還有OROR 的意思就是或者,不是OR之前的就是OR之前的。譬如上面語句使用OR代替AND,結果就是查詢math分數大於80或者小於90的同學。

SELECT name FROM score WHERE math>80 OR math>90;

OR

查詢math分數爲99, 59, 69的學生名字。

SELECT name FROM score WHERE math IN (99,59,69);

SET
上面查詢使用到了集合,上述查詢語句意思就是查詢math分數在集合(99, 59, 69)中的同學的名字。

LIKE模糊查詢

查詢所有姓‘李’的同學。

SELECT name FROM score WHERE name LIKE "李%";

like
這裏就要科普下通配符。

通配符 說明
% 表示匹配一串任意的字符串
_ 只匹配一個任意的字符

上面語句的”李%”表示所有以李開頭的字符串都可以和它匹配,而”李_”只表示以李開頭的,後面只跟一個字符的字符串。

排序輸出

對數學成績從高到低排序輸出。

SELECT name, math FROM score order by math;

order
MySQL提供了兩種排序方式,升序(ASC)和降序(DESC)。默認是升序。
上述的例子,我們再按降序查詢。

SELECT name, math FROM score order by math DESC;

DESC

函數

MySQL提供了幾個合計函數供我們使用。

COUNT()函數

count函數統計記錄的行數,也就是統計有多少個記錄,但是不會統計行爲`NULL 的記錄。

SELECT phone FROM score;

count
可以看出表scorephone 有一個值爲NULL

SELECT COUNT(phone) FROM score;

count
可以看出,包括NULL在內應該是有6條記錄的,但是由於COUNT函數不統計NULL,所以就只顯示了5條記錄。
COUNT括號內包含的就是要統計的列有多少有效記錄(非NULL)。
count()函數和WHERE字句一起使用,表示統計過濾後的結果有多少個。
統計english分數大於70的有多少個。

SELECT COUNT(*) FROM score WHERE english>70;

count_where

SUM() 函數

sum()函數只對列類型爲數字的有效。 作用是統計列數字的和,sum()括號內可以放入要統計的列,也可以放多列。

SELECT SUM(math) AS math_total, SUM(english) AS english_total, SUM(chinese) AS chinese_total, SUM(math+english+chinese) AS TOTAL FROM score;

result
例子都很容易看懂,就不多解釋了。

ANG()函數

函數AVG 是用來求平均值的,用法也跟上面差不多。

SELECT AVG(math), AVG(english), AVG(chinese) FROM score;

AVG
例子都很簡單,跟上面的函數差不多用法,就不多解釋。

MAX()和MIN()

這兩個函數求指定列的最大值和最小值,用法也跟上面一樣,就不做示例了。

GROUP BY分組

GROUP BY 語句對所查詢的列進行分組,這個也和關鍵字DISTINCT 一樣可以達到避免重複數據的功能。

SELECT name FROM score ORDERS GROUP BY math;

group
上述語句意思是用math 進行分組並升序排序查詢 學生名字。

表約束

約束類型 說明
PRIMARY KEY 主鍵約束,帶有這個約束的列,不能爲`NULL,不能重複
AUTO_INCREMENT 用於主鍵自動增長,有自增長的列,就不需要程序員自己管理,而是交給MySQL管理。不能重複
外鍵約束 表示列的值是另一個表的列值

表約束前兩個已經講過了,就說說外鍵約束。

CREATE TABLE person
(
    id INT PRIMARY KEY
    name VARCHAR(20)
);

CREATE TABLE idcard
(
    id INT PRIMARY KEY,
    address VARCHAR(40),
    CONSTRAINT id_FK FOREIGN KEY(id) REFERENCES person(id)
);

上述創建的兩個表中,表idcard 的列id 是一個外鍵約束的列,CONSTRAINT id_FK FOREIGN KEY(id) REFERENCES person(id) 意思是定義id 爲外鍵約束,並且它的值引用表peopleid 列的值,也就是表idcardid 列的值只能是表peopleid 列的值,不能使用id列不存在的值。

這裏也就簡單介紹了下。有興趣的,可以去查查相關資料。

這篇博客比較長,也寫了很久,也不太會寫文章,就按照流水賬來寫的,如有發現錯誤,敬請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章