MySQL 查詢語句使用進階mysql
===============================================================================正則表達式
概述:sql
本章爲上一章內容的鞏固和補充,具體內容以下:數據庫
SELECT單表查詢語句的練習鞏固;centos
SELECT多表查詢;bash
·交叉鏈接網絡
·內鏈接ide
·外連接學習
SELECT子查詢:優化
·用於WHERE子句中的子查詢;
·用於FROM子句中的子查詢
SELECT聯合查詢:
·UNION
===============================================================================
練習:
練習1
首先導入hellodb.sql的腳本文件,查詢其數據庫和表以下:
[root@centos7 ~]# mysql -p134296 < hellodb.sql # 導入數據庫腳本文件; [root@centos7 ~]# mysql -p134296 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 6 Server version: 5.5.44-MariaDB MariaDB Server Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | Syslog | | hellodb | # 生成的hellodb數據庫 | mydb | | mysql | | performance_schema | | test | | testdb | | ultrax | | zabbix | +--------------------+ 10 rows in set (0.01 sec) MariaDB [(none)]> use hellodb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [hellodb]> show tables; # 查看hellodb數據庫中的表以下: +-------------------+ | Tables_in_hellodb | +-------------------+ | classes | | coc | | courses | | scores | | students | | teachers | | toc | +-------------------+ 7 rows in set (0.00 sec)
(1) 在students表中,查詢年齡大於25歲,且爲男性的同窗的名字和年齡;
MariaDB [hellodb]> desc students; +-----------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------------------+------+-----+---------+----------------+ | StuID | int(10) unsigned | NO | PRI | NULL | auto_increment | | Name | varchar(50) | NO | | NULL | | | Age | tinyint(3) unsigned | NO | | NULL | | | Gender | enum('F','M') | NO | | NULL | | | ClassID | tinyint(3) unsigned | YES | | NULL | | | TeacherID | int(10) unsigned | YES | | NULL | | +-----------+---------------------+------+-----+---------+----------------+ 6 rows in set (0.01 sec) MariaDB [hellodb]> select * from students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 7 | Xi Ren | 19 | F | 3 | NULL | | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 9 | Ren Yingying | 20 | F | 6 | NULL | | 10 | Yue Lingshan | 19 | F | 3 | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | | 12 | Wen Qingqing | 19 | F | 1 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | | 16 | Xu Zhu | 21 | M | 1 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | | 19 | Xue Baochai | 18 | F | 6 | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+ 25 rows in set (0.00 sec) MariaDB [hellodb]> select Name,Age,Gender from students where Age > 25 and Gender = 'M'; +--------------+-----+--------+ | Name | Age | Gender | +--------------+-----+--------+ | Xie Yanke | 53 | M | | Ding Dian | 32 | M | | Yu Yutong | 26 | M | | Shi Qing | 46 | M | | Tian Boguang | 33 | M | | Xu Xian | 27 | M | | Sun Dasheng | 100 | M | +--------------+-----+--------+
(2) 以ClassID爲分組依據,顯示每組的平均年齡;
MariaDB [hellodb]> select ClassID,avg(age) as avg_age from students group by ClassID; +---------+---------+ | ClassID | avg_age | +---------+---------+ | NULL | 63.5000 | | 1 | 20.5000 | | 2 | 36.0000 | | 3 | 20.2500 | | 4 | 24.7500 | | 5 | 46.0000 | | 6 | 20.7500 | | 7 | 19.6667 | +---------+---------+ 8 rows in set (0.01 sec)
(3) 顯示第2題中平均年齡大於30的分組及平均年齡;
MariaDB [hellodb]> select ClassID,avg(age) as avg_age from students group by ClassID having avg_age > 30; +---------+---------+ | ClassID | avg_age | +---------+---------+ | NULL | 63.5000 | | 2 | 36.0000 | | 5 | 46.0000 | +---------+---------+ 3 rows in set (0.02 sec)
(4) 顯示以L開頭的名字的同窗的信息;
MariaDB [hellodb]> select * from students where name like 'L%'; # LIKE子句匹配 +-------+-------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+-------------+-----+--------+---------+-----------+ | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | +-------+-------------+-----+--------+---------+-----------+ 3 rows in set (0.01 sec) MariaDB [hellodb]> select * from students where name RLIKE '^L.*$'; # 正則表達式匹配 +-------+-------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+-------------+-----+--------+---------+-----------+ | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | +-------+-------------+-----+--------+---------+-----------+ 3 rows in set (0.00 sec)
(5) 顯示TeacherID非空的同窗的相關信息;
MariaDB [hellodb]> select Name,TeacherID from students where TeacherID is not null; +-------------+-----------+ | Name | TeacherID | +-------------+-----------+ | Shi Zhongyu | 3 | | Shi Potian | 7 | | Xie Yanke | 16 | | Ding Dian | 4 | | Yu Yutong | 1 | +-------------+-----------+
(6) 以年齡排序後,顯示年齡最大的前10位同窗的信息;
MariaDB [hellodb]> select * from students order by Age desc; # 降序排列 +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 25 | Sun Dasheng | 100 | M | NULL | NULL | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 4 | Ding Dian | 32 | M | 4 | 4 | | 24 | Xu Xian | 27 | M | NULL | NULL | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 17 | Lin Chong | 25 | M | 4 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 16 | Xu Zhu | 21 | M | 1 | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | | 9 | Ren Yingying | 20 | F | 6 | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | | 7 | Xi Ren | 19 | F | 3 | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | | 10 | Yue Lingshan | 19 | F | 3 | NULL | | 12 | Wen Qingqing | 19 | F | 1 | NULL | | 19 | Xue Baochai | 18 | F | 6 | NULL | | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | +-------+---------------+-----+--------+---------+-----------+ 25 rows in set (0.00 sec) MariaDB [hellodb]> select * from students order by Age desc limit 10; # 增長limit顯示數量 +-------+--------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+--------------+-----+--------+---------+-----------+ | 25 | Sun Dasheng | 100 | M | NULL | NULL | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 4 | Ding Dian | 32 | M | 4 | 4 | | 24 | Xu Xian | 27 | M | NULL | NULL | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 17 | Lin Chong | 25 | M | 4 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | +-------+--------------+-----+--------+---------+-----------+ 10 rows in set (0.00 sec)
(7) 查詢年齡大於等於20歲,小於等於25歲的同窗的信息;用三種方法;
MariaDB [hellodb]> select Name,Age from students where Age >= 20 and Age <= 25; +---------------+-----+ | Name | Age | +---------------+-----+ | Shi Zhongyu | 22 | | Shi Potian | 22 | | Ren Yingying | 20 | | Yuan Chengzhi | 23 | | Xu Zhu | 21 | | Lin Chong | 25 | | Hua Rong | 23 | | Huang Yueying | 22 | | Xiao Qiao | 20 | | Ma Chao | 23 | +---------------+-----+ 10 rows in set (0.00 sec) MariaDB [hellodb]> select Name,Age from students where Age between 20 and 25; +---------------+-----+ | Name | Age | +---------------+-----+ | Shi Zhongyu | 22 | | Shi Potian | 22 | | Ren Yingying | 20 | | Yuan Chengzhi | 23 | | Xu Zhu | 21 | | Lin Chong | 25 | | Hua Rong | 23 | | Huang Yueying | 22 | | Xiao Qiao | 20 | | Ma Chao | 23 | +---------------+-----+ 10 rows in set (0.00 sec) MariaDB [hellodb]> select Name,Age from students where Age in (20,21,22,23,2425); +---------------+-----+ | Name | Age | +---------------+-----+ | Shi Zhongyu | 22 | | Shi Potian | 22 | | Ren Yingying | 20 | | Yuan Chengzhi | 23 | | Xu Zhu | 21 | | Lin Chong | 25 | | Hua Rong | 23 | | Huang Yueying | 22 | | Xiao Qiao | 20 | | Ma Chao | 23 | +---------------+-----+ 10 rows in set (0.00 sec)
練習2
一、以ClassID分組,顯示每班的同窗的人數;
MariaDB [hellodb]> select ClassID,count(StuID) from students group by ClassID; +---------+--------------+ | ClassID | count(StuID) | +---------+--------------+ | NULL | 2 | | 1 | 4 | | 2 | 3 | | 3 | 4 | | 4 | 4 | | 5 | 1 | | 6 | 4 | | 7 | 3 | +---------+--------------+ 8 rows in set (0.01 sec)
二、以Gender分組,顯示其年齡之和;
MariaDB [hellodb]> select Gender,sum(age) as sum_age from students group by Gender; +--------+---------+ | Gender | sum_age | +--------+---------+ | F | 190 | | M | 495 | +--------+---------+ 2 rows in set (0.01 sec)
三、以ClassID分組,顯示其平均年齡大於25的班級;
MariaDB [hellodb]> select ClassID,avg(age) as avg_age from students group by ClassID having avg_age > 25; +---------+---------+ | ClassID | avg_age | +---------+---------+ | NULL | 63.5000 | | 2 | 36.0000 | | 5 | 46.0000 | +---------+---------+ 3 rows in set (0.01 sec)
四、以Gender分組,顯示各組中年齡大於25的學員的年齡之和;
MariaDB [hellodb]> select Gender,sum(age) from students where age > 25 group by Gender; +--------+----------+ | Gender | sum(age) | +--------+----------+ | M | 317 | +--------+----------+ 1 row in set (0.02 sec)
SELECT:多表查詢
★鏈接操做:
☉交叉鏈接:笛卡爾乘積;
☉內鏈接:
等值鏈接:讓表之間的字段以等值的方式創建鏈接;
不等值鏈接:
天然鏈接
自鏈接
☉外鏈接:
左外鏈接: FROM tb1 LEFT JOIN tb2 ON tb1.col = tb2.col
右外鏈接: FROM tb1 RIGHT JOIN tb2 ON tb1.col = tb2.col
演示:
1.等值鏈接,挑選students表中的ClassID和classes表中的ClassID相等的同窗的信息;
MariaDB [hellodb]> select * from classes; +---------+----------------+----------+ | ClassID | Class | NumOfStu | +---------+----------------+----------+ | 1 | Shaolin Pai | 10 | | 2 | Emei Pai | 7 | | 3 | QingCheng Pai | 11 | | 4 | Wudang Pai | 12 | | 5 | Riyue Shenjiao | 31 | | 6 | Lianshan Pai | 27 | | 7 | Ming Jiao | 27 | | 8 | Xiaoyao Pai | 15 | +---------+----------------+----------+ 8 rows in set (0.00 sec) MariaDB [hellodb]> select * from students,classes where students.ClassID = classes.ClassID; +-------+---------------+-----+--------+---------+-----------+---------+----------------+----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | ClassID | Class | NumOfStu | +-------+---------------+-----+--------+---------+-----------+---------+----------------+----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | 2 | Emei Pai | 7 | | 2 | Shi Potian | 22 | M | 1 | 7 | 1 | Shaolin Pai | 10 | | 3 | Xie Yanke | 53 | M | 2 | 16 | 2 | Emei Pai | 7 | | 4 | Ding Dian | 32 | M | 4 | 4 | 4 | Wudang Pai | 12 | | 5 | Yu Yutong | 26 | M | 3 | 1 | 3 | QingCheng Pai | 11 | | 6 | Shi Qing | 46 | M | 5 | NULL | 5 | Riyue Shenjiao | 31 | | 7 | Xi Ren | 19 | F | 3 | NULL | 3 | QingCheng Pai | 11 | | 8 | Lin Daiyu | 17 | F | 7 | NULL | 7 | Ming Jiao | 27 | | 9 | Ren Yingying | 20 | F | 6 | NULL | 6 | Lianshan Pai | 27 | | 10 | Yue Lingshan | 19 | F | 3 | NULL | 3 | QingCheng Pai | 11 | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | 6 | Lianshan Pai | 27 | | 12 | Wen Qingqing | 19 | F | 1 | NULL | 1 | Shaolin Pai | 10 | | 13 | Tian Boguang | 33 | M | 2 | NULL | 2 | Emei Pai | 7 | | 14 | Lu Wushuang | 17 | F | 3 | NULL | 3 | QingCheng Pai | 11 | | 15 | Duan Yu | 19 | M | 4 | NULL | 4 | Wudang Pai | 12 | | 16 | Xu Zhu | 21 | M | 1 | NULL | 1 | Shaolin Pai | 10 | | 17 | Lin Chong | 25 | M | 4 | NULL | 4 | Wudang Pai | 12 | | 18 | Hua Rong | 23 | M | 7 | NULL | 7 | Ming Jiao | 27 | | 19 | Xue Baochai | 18 | F | 6 | NULL | 6 | Lianshan Pai | 27 | | 20 | Diao Chan | 19 | F | 7 | NULL | 7 | Ming Jiao | 27 | | 21 | Huang Yueying | 22 | F | 6 | NULL | 6 | Lianshan Pai | 27 | | 22 | Xiao Qiao | 20 | F | 1 | NULL | 1 | Shaolin Pai | 10 | | 23 | Ma Chao | 23 | M | 4 | NULL | 4 | Wudang Pai | 12 | +-------+---------------+-----+--------+---------+-----------+---------+----------------+----------+ 23 rows in set (0.00 sec) # 注意,若是兩張表作等值鏈接時若是每一個表中的字段惟一,則能夠省略表名稱,這裏select name,Class也正確 MariaDB [hellodb]> select students.name,classes.Class from students,classes where students.ClassID = classes.ClassID; +---------------+----------------+ | name | Class | +---------------+----------------+ | Shi Zhongyu | Emei Pai | | Shi Potian | Shaolin Pai | | Xie Yanke | Emei Pai | | Ding Dian | Wudang Pai | | Yu Yutong | QingCheng Pai | | Shi Qing | Riyue Shenjiao | | Xi Ren | QingCheng Pai | | Lin Daiyu | Ming Jiao | | Ren Yingying | Lianshan Pai | | Yue Lingshan | QingCheng Pai | | Yuan Chengzhi | Lianshan Pai | | Wen Qingqing | Shaolin Pai | | Tian Boguang | Emei Pai | | Lu Wushuang | QingCheng Pai | | Duan Yu | Wudang Pai | | Xu Zhu | Shaolin Pai | | Lin Chong | Wudang Pai | | Hua Rong | Ming Jiao | | Xue Baochai | Lianshan Pai | | Diao Chan | Ming Jiao | | Huang Yueying | Lianshan Pai | | Xiao Qiao | Shaolin Pai | | Ma Chao | Wudang Pai | +---------------+----------------+ 23 rows in set (0.00 sec)
MariaDB [hellodb]> select * from students,teachers where students.TeacherID = teachers.TID; +-------+-------------+-----+--------+---------+-----------+-----+---------------+-----+--------+ | StuID | Name | Age | Gender | ClassID | TeacherID | TID | Name | Age | Gender | +-------+-------------+-----+--------+---------+-----------+-----+---------------+-----+--------+ | 5 | Yu Yutong | 26 | M | 3 | 1 | 1 | Song Jiang | 45 | M | | 1 | Shi Zhongyu | 22 | M | 2 | 3 | 3 | Miejue Shitai | 77 | F | | 4 | Ding Dian | 32 | M | 4 | 4 | 4 | Lin Chaoying | 93 | F | +-------+-------------+-----+--------+---------+-----------+-----+---------------+-----+--------+ 3 rows in set (0.01 sec) MariaDB [hellodb]> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | +-----+---------------+-----+--------+ 4 rows in set (0.00 sec) MariaDB [hellodb]> select * from students where TeacherID is not null; +-------+-------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+-------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | +-------+-------------+-----+--------+---------+-----------+ 5 rows in set (0.00 sec) # 注意,這裏在students表中的外鍵TeacherID中是teachers表中的主鍵,可是students表中的外鍵TID # 中的數據在teachers表中的主鍵TID中並不存在,再innoDB存儲引擎中是不被容許的(即外鍵約束),但在 # MyISAM中不支持
2.自鏈接
MariaDB [hellodb]> select * from students as s,students as t where s.TeacherID = t.StuID; +-------+-------------+-----+--------+---------+-----------+-------+-------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+-------------+-----+--------+---------+-----------+-------+-------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | 3 | Xie Yanke | 53 | M | 2 | 16 | | 2 | Shi Potian | 22 | M | 1 | 7 | 7 | Xi Ren | 19 | F | 3 | NULL | | 3 | Xie Yanke | 53 | M | 2 | 16 | 16 | Xu Zhu | 21 | M | 1 | NULL | | 4 | Ding Dian | 32 | M | 4 | 4 | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | 1 | Shi Zhongyu | 22 | M | 2 | 3 | +-------+-------------+-----+--------+---------+-----------+-------+-------------+-----+--------+---------+-----------+ 5 rows in set (0.00 sec) MariaDB [hellodb]> select s.name,t.name from students as s,students as t where s.TeacherID = t.StuID; +-------------+-------------+ | name | name | +-------------+-------------+ | Shi Zhongyu | Xie Yanke | | Shi Potian | Xi Ren | | Xie Yanke | Xu Zhu | | Ding Dian | Ding Dian | | Yu Yutong | Shi Zhongyu | +-------------+-------------+ 5 rows in set (0.00 sec)
3.如題1,等值鏈接時,只顯示匹配到的的數據,可是沒有匹配到的就不予顯示,若是,要想顯示就須要用到左外鏈接和右外鏈接;
1)左外鏈接:以左表爲準,去鏈接匹配第二張表對應的數據,若是左表對應的數據不存在,就留空,但要保證左表中的數據都存在顯示出來;
MariaDB [hellodb]> select * from students left join teachers on students.TeacherID=teachers.TID; +-------+---------------+-----+--------+---------+-----------+------+---------------+------+--------+ | StuID | Name | Age | Gender | ClassID | TeacherID | TID | Name | Age | Gender | +-------+---------------+-----+--------+---------+-----------+------+---------------+------+--------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | 3 | Miejue Shitai | 77 | F | | 2 | Shi Potian | 22 | M | 1 | 7 | NULL | NULL | NULL | NULL | | 3 | Xie Yanke | 53 | M | 2 | 16 | NULL | NULL | NULL | NULL | | 4 | Ding Dian | 32 | M | 4 | 4 | 4 | Lin Chaoying | 93 | F | | 5 | Yu Yutong | 26 | M | 3 | 1 | 1 | Song Jiang | 45 | M | | 6 | Shi Qing | 46 | M | 5 | NULL | NULL | NULL | NULL | NULL | | 7 | Xi Ren | 19 | F | 3 | NULL | NULL | NULL | NULL | NULL | | 8 | Lin Daiyu | 17 | F | 7 | NULL | NULL | NULL | NULL | NULL | | 9 | Ren Yingying | 20 | F | 6 | NULL | NULL | NULL | NULL | NULL | | 10 | Yue Lingshan | 19 | F | 3 | NULL | NULL | NULL | NULL | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | NULL | NULL | NULL | NULL | | 12 | Wen Qingqing | 19 | F | 1 | NULL | NULL | NULL | NULL | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | NULL | NULL | NULL | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | NULL | NULL | NULL | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | NULL | NULL | NULL | NULL | | 16 | Xu Zhu | 21 | M | 1 | NULL | NULL | NULL | NULL | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | NULL | NULL | NULL | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | NULL | NULL | NULL | NULL | | 19 | Xue Baochai | 18 | F | 6 | NULL | NULL | NULL | NULL | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | NULL | NULL | NULL | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | NULL | NULL | NULL | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | NULL | NULL | NULL | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | NULL | NULL | NULL | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | NULL | NULL | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | NULL | NULL | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+------+---------------+------+--------+ 25 rows in set (0.00 sec) # 添加指定字段 MariaDB [hellodb]> select students.Name,teachers.Name from students left join teachers on students.TeacherID=teachers.TID; +---------------+---------------+ | Name | Name | +---------------+---------------+ | Shi Zhongyu | Miejue Shitai | | Shi Potian | NULL | | Xie Yanke | NULL | | Ding Dian | Lin Chaoying | | Yu Yutong | Song Jiang | | Shi Qing | NULL | | Xi Ren | NULL | | Lin Daiyu | NULL | | Ren Yingying | NULL | | Yue Lingshan | NULL | | Yuan Chengzhi | NULL | | Wen Qingqing | NULL | | Tian Boguang | NULL | | Lu Wushuang | NULL | | Duan Yu | NULL | | Xu Zhu | NULL | | Lin Chong | NULL | | Hua Rong | NULL | | Xue Baochai | NULL | | Diao Chan | NULL | | Huang Yueying | NULL | | Xiao Qiao | NULL | | Ma Chao | NULL | | Xu Xian | NULL | | Sun Dasheng | NULL | +---------------+---------------+ 25 rows in set (0.00 sec)
2)右外鏈接:以右表爲準,右表的每一行都得找一個左表中與之對應的字段,若是左表中沒有與之對應的字段,就留空,但要保證右表中的每一行都必須存在;
MariaDB [hellodb]> select * from students right join teachers on students.TeacherID=teachers.TID; +-------+-------------+------+--------+---------+-----------+-----+---------------+-----+--------+ | StuID | Name | Age | Gender | ClassID | TeacherID | TID | Name | Age | Gender | +-------+-------------+------+--------+---------+-----------+-----+---------------+-----+--------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | 3 | Miejue Shitai | 77 | F | | 4 | Ding Dian | 32 | M | 4 | 4 | 4 | Lin Chaoying | 93 | F | | 5 | Yu Yutong | 26 | M | 3 | 1 | 1 | Song Jiang | 45 | M | | NULL | NULL | NULL | NULL | NULL | NULL | 2 | Zhang Sanfeng | 94 | M | +-------+-------------+------+--------+---------+-----------+-----+---------------+-----+--------+ 4 rows in set (0.01 sec)
--------------------------------------------------------------------------------
select 子查詢:
★在查詢中嵌套查詢
☉用於WHERE子句中的子查詢;
用於比較表達式中的子查詢:子查詢僅能返回單個值;
用於IN中的子查詢:子查詢能夠返回一個列表值;
用於EXISTS中的子查詢:
☉用於FROM子句中的子查詢;
SELECT tb_alias.col1, ... FROM (SELECT clause) AS tb_alias WHERE clause;
注意:
全部的鏈接查詢均可以用子查詢替換,但在mysql中子查詢未經充分優化,因此,能用鏈接查詢,必定不用子查詢。
在生產環境中必定不能使用不帶where子句的select *,由於這是作全表掃描,會對網絡I/O和磁盤I/O形成很大影響;
演示:
1.在students表中顯示其年齡大於平均年齡的同窗
MariaDB [hellodb]> select Name,Age from students where age > (select avg(age) from students); +--------------+-----+ | Name | Age | +--------------+-----+ | Xie Yanke | 53 | | Ding Dian | 32 | | Shi Qing | 46 | | Tian Boguang | 33 | | Sun Dasheng | 100 | +--------------+-----+ 5 rows in set (0.00 sec)
2.顯示同窗的id號在老師id號範圍內的同窗的信息
MariaDB [hellodb]> select StuID,Name from students where StuID in (select TID from teachers); +-------+-------------+ | StuID | Name | +-------+-------------+ | 1 | Shi Zhongyu | | 2 | Shi Potian | | 3 | Xie Yanke | | 4 | Ding Dian | +-------+-------------+ 4 rows in set (0.00 sec)
3.顯示年齡大於25且性別爲男性的同窗
MariaDB [hellodb]> select * from students where age>25 and gender='M'; +-------+--------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+--------------+-----+--------+---------+-----------+ | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | +-------+--------------+-----+--------+---------+-----------+ 7 rows in set (0.00 sec) # 使用from子句表示以下: MariaDB [hellodb]> select * from (select * from students where age>25) as s where s.gender='M'; +-------+--------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+--------------+-----+--------+---------+-----------+ | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | +-------+--------------+-----+--------+---------+-----------+ 7 rows in set (0.00 sec)
--------------------------------------------------------------------------------
select 聯合查詢:
★將多個查詢語句的執行結果相合並;
UNION
SELECT clause UNION SELECT cluase;
演示:
將表students和teachers表中的ID,Name和Age聯合起來一同顯示,以下:
MariaDB [hellodb]> select StuID,Name,Age from students; +-------+---------------+-----+ | StuID | Name | Age | +-------+---------------+-----+ | 1 | Shi Zhongyu | 22 | | 2 | Shi Potian | 22 | | 3 | Xie Yanke | 53 | | 4 | Ding Dian | 32 | | 5 | Yu Yutong | 26 | | 6 | Shi Qing | 46 | | 7 | Xi Ren | 19 | | 8 | Lin Daiyu | 17 | | 9 | Ren Yingying | 20 | | 10 | Yue Lingshan | 19 | | 11 | Yuan Chengzhi | 23 | | 12 | Wen Qingqing | 19 | | 13 | Tian Boguang | 33 | | 14 | Lu Wushuang | 17 | | 15 | Duan Yu | 19 | | 16 | Xu Zhu | 21 | | 17 | Lin Chong | 25 | | 18 | Hua Rong | 23 | | 19 | Xue Baochai | 18 | | 20 | Diao Chan | 19 | | 21 | Huang Yueying | 22 | | 22 | Xiao Qiao | 20 | | 23 | Ma Chao | 23 | | 24 | Xu Xian | 27 | | 25 | Sun Dasheng | 100 | +-------+---------------+-----+ 25 rows in set (0.00 sec) MariaDB [hellodb]> select TID,Name,Age from teachers; +-----+---------------+-----+ | TID | Name | Age | +-----+---------------+-----+ | 1 | Song Jiang | 45 | | 2 | Zhang Sanfeng | 94 | | 3 | Miejue Shitai | 77 | | 4 | Lin Chaoying | 93 | +-----+---------------+-----+ 4 rows in set (0.00 sec) # 聯合顯示以下: MariaDB [hellodb]> select TID as ID,Name,Age from teachers union select StuID,Name,Age from students; +----+---------------+-----+ | ID | Name | Age | +----+---------------+-----+ | 1 | Song Jiang | 45 | | 2 | Zhang Sanfeng | 94 | | 3 | Miejue Shitai | 77 | | 4 | Lin Chaoying | 93 | | 1 | Shi Zhongyu | 22 | | 2 | Shi Potian | 22 | | 3 | Xie Yanke | 53 | | 4 | Ding Dian | 32 | | 5 | Yu Yutong | 26 | | 6 | Shi Qing | 46 | | 7 | Xi Ren | 19 | | 8 | Lin Daiyu | 17 | | 9 | Ren Yingying | 20 | | 10 | Yue Lingshan | 19 | | 11 | Yuan Chengzhi | 23 | | 12 | Wen Qingqing | 19 | | 13 | Tian Boguang | 33 | | 14 | Lu Wushuang | 17 | | 15 | Duan Yu | 19 | | 16 | Xu Zhu | 21 | | 17 | Lin Chong | 25 | | 18 | Hua Rong | 23 | | 19 | Xue Baochai | 18 | | 20 | Diao Chan | 19 | | 21 | Huang Yueying | 22 | | 22 | Xiao Qiao | 20 | | 23 | Ma Chao | 23 | | 24 | Xu Xian | 27 | | 25 | Sun Dasheng | 100 | +----+---------------+-----+ 29 rows in set (0.03 sec)
練習3:
1.顯示前5位同窗的姓名、課程及成績;
# 首先使用多表鏈接查看其信息,以下: MariaDB [hellodb]> select * from students,scores,courses where students.StuID = scores.StuID and scores.CourseID = courses.CourseID; +-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+----------+----------------+ | StuID | Name | Age | Gender | ClassID | TeacherID | ID | StuID | CourseID | Score | CourseID | Course | +-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+----------+----------------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | 1 | 1 | 2 | 77 | 2 | Kuihua Baodian | | 1 | Shi Zhongyu | 22 | M | 2 | 3 | 2 | 1 | 6 | 93 | 6 | Weituo Zhang | | 2 | Shi Potian | 22 | M | 1 | 7 | 3 | 2 | 2 | 47 | 2 | Kuihua Baodian | | 2 | Shi Potian | 22 | M | 1 | 7 | 4 | 2 | 5 | 97 | 5 | Daiyu Zanghua | | 3 | Xie Yanke | 53 | M | 2 | 16 | 5 | 3 | 2 | 88 | 2 | Kuihua Baodian | | 3 | Xie Yanke | 53 | M | 2 | 16 | 6 | 3 | 6 | 75 | 6 | Weituo Zhang | | 4 | Ding Dian | 32 | M | 4 | 4 | 7 | 4 | 5 | 71 | 5 | Daiyu Zanghua | | 4 | Ding Dian | 32 | M | 4 | 4 | 8 | 4 | 2 | 89 | 2 | Kuihua Baodian | | 5 | Yu Yutong | 26 | M | 3 | 1 | 9 | 5 | 1 | 39 | 1 | Hamo Gong | | 5 | Yu Yutong | 26 | M | 3 | 1 | 10 | 5 | 7 | 63 | 7 | Dagou Bangfa | | 6 | Shi Qing | 46 | M | 5 | NULL | 11 | 6 | 1 | 96 | 1 | Hamo Gong | | 7 | Xi Ren | 19 | F | 3 | NULL | 12 | 7 | 1 | 86 | 1 | Hamo Gong | | 7 | Xi Ren | 19 | F | 3 | NULL | 13 | 7 | 7 | 83 | 7 | Dagou Bangfa | | 8 | Lin Daiyu | 17 | F | 7 | NULL | 14 | 8 | 4 | 57 | 4 | Taiji Quan | | 8 | Lin Daiyu | 17 | F | 7 | NULL | 15 | 8 | 3 | 93 | 3 | Jinshe Jianfa | +-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+----------+----------------+ 15 rows in set (0.00 sec) # 過濾出指定的字段 MariaDB [hellodb]> select Name,Course,Score from students,scores,courses where students.StuID = scores.StuID and scores.CourseID = courses.CourseID; +-------------+----------------+-------+ | Name | Course | Score | +-------------+----------------+-------+ | Shi Zhongyu | Kuihua Baodian | 77 | | Shi Zhongyu | Weituo Zhang | 93 | | Shi Potian | Kuihua Baodian | 47 | | Shi Potian | Daiyu Zanghua | 97 | | Xie Yanke | Kuihua Baodian | 88 | | Xie Yanke | Weituo Zhang | 75 | | Ding Dian | Daiyu Zanghua | 71 | | Ding Dian | Kuihua Baodian | 89 | | Yu Yutong | Hamo Gong | 39 | | Yu Yutong | Dagou Bangfa | 63 | | Shi Qing | Hamo Gong | 96 | | Xi Ren | Hamo Gong | 86 | | Xi Ren | Dagou Bangfa | 83 | | Lin Daiyu | Taiji Quan | 57 | | Lin Daiyu | Jinshe Jianfa | 93 | +-------------+----------------+-------+ 15 rows in set (0.00 sec) # 嵌套一個子查詢,顯示前5名同窗 MariaDB [hellodb]> select Name,Course,Score from (select * from students where StuID<=5) as m,scores,courses where m.StuID = scores.StuID and scores.CourseID = courses.CourseID; +-------------+----------------+-------+ | Name | Course | Score | +-------------+----------------+-------+ | Shi Zhongyu | Kuihua Baodian | 77 | | Shi Zhongyu | Weituo Zhang | 93 | | Shi Potian | Kuihua Baodian | 47 | | Shi Potian | Daiyu Zanghua | 97 | | Xie Yanke | Kuihua Baodian | 88 | | Xie Yanke | Weituo Zhang | 75 | | Ding Dian | Daiyu Zanghua | 71 | | Ding Dian | Kuihua Baodian | 89 | | Yu Yutong | Hamo Gong | 39 | | Yu Yutong | Dagou Bangfa | 63 | +-------------+----------------+-------+ 10 rows in set (0.00 sec)
2.顯示其成績高於80的同窗的名稱及課程;
# 只須要在上題的基礎上再加一個過濾條件便可 MariaDB [hellodb]> select Name,Course,Score from students,scores,courses where students.StuID = scores.StuID and scores.CourseID = courses.CourseID and Score>80; +-------------+----------------+-------+ | Name | Course | Score | +-------------+----------------+-------+ | Shi Zhongyu | Weituo Zhang | 93 | | Shi Potian | Daiyu Zanghua | 97 | | Xie Yanke | Kuihua Baodian | 88 | | Ding Dian | Kuihua Baodian | 89 | | Shi Qing | Hamo Gong | 96 | | Xi Ren | Hamo Gong | 86 | | Xi Ren | Dagou Bangfa | 83 | | Lin Daiyu | Jinshe Jianfa | 93 | +-------------+----------------+-------+ 8 rows in set (0.00 sec)
3.求前8位同窗每位同窗本身兩門課的平均成績,並按降序排列;
MariaDB [hellodb]> select Name,avg(Score) from (select Name,Course,Score from students,scores,courses where students.StuID = scores.StuID and scores.CourseID = courses.CourseID) as m group by Name order by avg(Score) desc; +-------------+------------+ | Name | avg(Score) | +-------------+------------+ | Shi Qing | 96.0000 | | Shi Zhongyu | 85.0000 | | Xi Ren | 84.5000 | | Xie Yanke | 81.5000 | | Ding Dian | 80.0000 | | Lin Daiyu | 75.0000 | | Shi Potian | 72.0000 | | Yu Yutong | 51.0000 | +-------------+------------+ 8 rows in set (0.01 sec)
4.顯示每門課程課程名稱及學習了這門課的同窗的個數;
MariaDB [hellodb]> select * from scores; +----+-------+----------+-------+ | ID | StuID | CourseID | Score | +----+-------+----------+-------+ | 1 | 1 | 2 | 77 | | 2 | 1 | 6 | 93 | | 3 | 2 | 2 | 47 | | 4 | 2 | 5 | 97 | | 5 | 3 | 2 | 88 | | 6 | 3 | 6 | 75 | | 7 | 4 | 5 | 71 | | 8 | 4 | 2 | 89 | | 9 | 5 | 1 | 39 | | 10 | 5 | 7 | 63 | | 11 | 6 | 1 | 96 | | 12 | 7 | 1 | 86 | | 13 | 7 | 7 | 83 | | 14 | 8 | 4 | 57 | | 15 | 8 | 3 | 93 | +----+-------+----------+-------+ 15 rows in set (0.00 sec) # 首先查找出學習這門課(課程編號)有多少同窗(同窗編號) MariaDB [hellodb]> select CourseID,count(StuID) from scores group by CourseID; +----------+--------------+ | CourseID | count(StuID) | +----------+--------------+ | 1 | 3 | | 2 | 4 | | 3 | 1 | | 4 | 1 | | 5 | 2 | | 6 | 2 | | 7 | 2 | +----------+--------------+ 7 rows in set (0.00 sec) # 而後去用課程編號的錶鏈接課程表,注意這裏使用了子查詢和別名 MariaDB [hellodb]> select Course,c from (select CourseID,count(StuID) as c from scores group by CourseID) as m,courses where m.CourseID=courses.CourseID; +----------------+---+ | Course | c | +----------------+---+ | Hamo Gong | 3 | | Kuihua Baodian | 4 | | Jinshe Jianfa | 1 | | Taiji Quan | 1 | | Daiyu Zanghua | 2 | | Weituo Zhang | 2 | | Dagou Bangfa | 2 | +----------------+---+ 7 rows in set (0.00 sec)
練習4:
一、如何顯示其年齡大於平均年齡的同窗的名字?
MariaDB [hellodb]> select avg(age) from students; +----------+ | avg(age) | +----------+ | 27.4000 | +----------+ 1 row in set (0.00 sec) MariaDB [hellodb]> select Name,Age from students where age > (select avg(age) from students); +--------------+-----+ | Name | Age | +--------------+-----+ | Xie Yanke | 53 | | Ding Dian | 32 | | Shi Qing | 46 | | Tian Boguang | 33 | | Sun Dasheng | 100 | +--------------+-----+ 5 rows in set (0.00 sec)
二、如何顯示其學習的課程爲第一、2,4或第7門課的同窗的名字?
MariaDB [hellodb]> select * from scores where CourseID in (1,2,4,7); +----+-------+----------+-------+ | ID | StuID | CourseID | Score | +----+-------+----------+-------+ | 1 | 1 | 2 | 77 | | 3 | 2 | 2 | 47 | | 5 | 3 | 2 | 88 | | 8 | 4 | 2 | 89 | | 9 | 5 | 1 | 39 | | 10 | 5 | 7 | 63 | | 11 | 6 | 1 | 96 | | 12 | 7 | 1 | 86 | | 13 | 7 | 7 | 83 | | 14 | 8 | 4 | 57 | +----+-------+----------+-------+ 10 rows in set (0.01 sec) MariaDB [hellodb]> select m.CourseID,students.Name from (select StuID,CourseID from scores where CourseID in (1,2,4,7)) as m,students where m.StuID = students.StuID; +----------+-------------+ | CourseID | Name | +----------+-------------+ | 2 | Shi Zhongyu | | 2 | Shi Potian | | 2 | Xie Yanke | | 2 | Ding Dian | | 1 | Yu Yutong | | 7 | Yu Yutong | | 1 | Shi Qing | | 1 | Xi Ren | | 7 | Xi Ren | | 4 | Lin Daiyu | +----------+-------------+ 10 rows in set (0.00 sec)