前面幾篇博客已經講過數據庫、表的創建、簡單的增刪改查(CRUD)語句,如果沒看到的,可以點擊傳送。
現在來重點講下查詢語句SELECT
,SELECT
是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;
結果如下:
可以看出,顯示的數據有一個重複的’趙六’。
使用DINSTINCT
語句避免顯示數據的重複。
SELECT DISTINCT name FROM score;
顯示如下:
可以看出,重複的數據’趙六’只顯示了一次,而不是兩次。
這裏就在說一下SELECT
的另一個用法,這個用法我也不知道怎麼說明好,所以就放這兒一起說了。
如果要查詢每位同學的數學加了10分之後的結果,並且,不改變表中數據的值。可能大家想到的是,先用UPDATE
語句更改每行數學分數的值。這麼做太麻煩,而且,最重要的是,這已經改變原來的數據了。可以用下面的方法來做。
SELECT math+10 FROM score;
爲了便於觀察,下圖依次是查詢原來數據的,原來數據上加10的:
我們可以再看看錶中math
是否被更改:
可以看出,原先數據並沒有被改變。爲了美觀,我們還可以爲math+10
加上別名,這樣在顯示的時候,就不是math+10
,而是你指定的名稱了。
SELECT math+10 AS mathAdd10 FROM score;
顯示的結果:
可以看出,這時列名已經更改爲我自己設置的mathAdd10
了。這個也很簡單,只要在要添加別名的列後寫AS
加上要取的別名即可。這些就不過多測試了。
再說一個查詢總分的SELECT
語句。
SELECT name, (math+english+chinese) AS Total FROM score;
WHERE
過濾結果
查詢時,只想查詢某個學生的成績,或者想查詢總分大於100的學生可以使用`WHERE
字句來過濾結果。
SELECT name, math, english, chinese FROM score WHERE name='張三';
SELECT name FROM score WHERE (math+english+chinese)>100;
上面分別是查詢名字是‘張三’的各科成績和查詢總分超過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
,除了這個還有OR
,OR
的意思就是或者,不是OR之前的就是OR之前的。譬如上面語句使用OR
代替AND
,結果就是查詢math分數大於80或者小於90的同學。
SELECT name FROM score WHERE math>80 OR math>90;
查詢math
分數爲99, 59, 69的學生名字。
SELECT name FROM score WHERE math IN (99,59,69);
上面查詢使用到了集合,上述查詢語句意思就是查詢math分數在集合(99, 59, 69)中的同學的名字。
LIKE
模糊查詢
查詢所有姓‘李’的同學。
SELECT name FROM score WHERE name LIKE "李%";
這裏就要科普下通配符。
通配符 | 說明 |
---|---|
% | 表示匹配一串任意的字符串 |
_ | 只匹配一個任意的字符 |
上面語句的”李%”表示所有以李開頭的字符串都可以和它匹配,而”李_”只表示以李開頭的,後面只跟一個字符的字符串。
排序輸出
對數學成績從高到低排序輸出。
SELECT name, math FROM score order by math;
MySQL
提供了兩種排序方式,升序(ASC)和降序(DESC)。默認是升序。
上述的例子,我們再按降序查詢。
SELECT name, math FROM score order by math DESC;
函數
MySQL提供了幾個合計函數供我們使用。
COUNT()函數
count函數統計記錄的行數,也就是統計有多少個記錄,但是不會統計行爲`NULL
的記錄。
SELECT phone FROM score;
可以看出表score
列phone
有一個值爲NULL
。
SELECT COUNT(phone) FROM score;
可以看出,包括NULL
在內應該是有6條記錄的,但是由於COUNT
函數不統計NULL
,所以就只顯示了5條記錄。
COUNT
括號內包含的就是要統計的列有多少有效記錄(非NULL
)。
count()
函數和WHERE
字句一起使用,表示統計過濾後的結果有多少個。
統計english
分數大於70的有多少個。
SELECT COUNT(*) FROM score WHERE english>70;
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;
例子都很容易看懂,就不多解釋了。
ANG()函數
函數AVG
是用來求平均值的,用法也跟上面差不多。
SELECT AVG(math), AVG(english), AVG(chinese) FROM score;
例子都很簡單,跟上面的函數差不多用法,就不多解釋。
MAX()和MIN()
這兩個函數求指定列的最大值和最小值,用法也跟上面一樣,就不做示例了。
GROUP BY分組
GROUP BY
語句對所查詢的列進行分組,這個也和關鍵字DISTINCT
一樣可以達到避免重複數據的功能。
SELECT name FROM score ORDERS GROUP BY math;
上述語句意思是用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
爲外鍵約束,並且它的值引用表people
的id
列的值,也就是表idcard
的id
列的值只能是表people
的id
列的值,不能使用id列不存在的值。
這裏也就簡單介紹了下。有興趣的,可以去查查相關資料。
這篇博客比較長,也寫了很久,也不太會寫文章,就按照流水賬來寫的,如有發現錯誤,敬請指正。