1、 select語句應(yīng)用
1.1 select(單表)的執(zhí)行邏輯
select 列1 , 列2
from 表
where 條件
group by 條件
having 條件
order by 條件
limit 條件
1.2 select單表查詢
1> select單獨(dú)使用的情況(MySQL獨(dú)家)
(1)select @@參數(shù)名;
SELECT @@datadir; #查看數(shù)據(jù)存放的目錄
wenjuan[(none)]>SELECT @@datadir;
+------------------+
| @@datadir |
+------------------+
| /data/3306/data/ |
+------------------+
1 row in set (0.00 sec)
wenjuan[(none)]>
SELECT @@port; #查看mysql的端口號(hào)
wenjuan[(none)]>SELECT @@port;
+--------+
| @@port |
+--------+
| 3306 |
+--------+
1 row in set (0.00 sec)
wenjuan[(none)]>
SELECT @@socket; #查看socket存放的目錄
wenjuan[(none)]>SELECT @@socket;
+-----------------+
| @@socket |
+-----------------+
| /tmp/mysql.sock |
+-----------------+
1 row in set (0.00 sec)
wenjuan[(none)]>
SELECT @@innodb_flush_log_at_trx_commit;
wenjuan[(none)]>SELECT @@innodb_flush_log_at_trx_commit;
+----------------------------------+
| @@innodb_flush_log_at_trx_commit |
+----------------------------------+
| 1 |
+----------------------------------+
1 row in set (0.00 sec)
wenjuan[(none)]>
SHOW VARIABLES LIKE '%trx%';
wenjuan[(none)]>SHOW VARIABLES LIKE '%trx%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| innodb_api_trx_level | 0 |
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
2 rows in set (0.00 sec)
wenjuan[(none)]>
SHOW VARIABLES; #513
(2)select 函數(shù)();
SELECT NOW(); 顯示當(dāng)前時(shí)間
wenjuan[(none)]>select now();
+---------------------+
| now() |
+---------------------+
| 2019-08-08 09:44:17 |
+---------------------+
1 row in set (0.00 sec)
wenjuan[(none)]>
SELECT DATABASE(); 當(dāng)前在那個(gè)庫中
wenjuan[(none)]>use world;
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
wenjuan[world]>select database();
+------------+
| database() |
+------------+
| world |
+------------+
1 row in set (0.00 sec)
wenjuan[world]>
SELECT USER(); 當(dāng)前登錄的用戶
wenjuan[world]>SELECT USER();
+----------------+
| USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
wenjuan[world]>
SELECT MONTH(NOW()); 顯示當(dāng)前月份
wenjuan[world]>SELECT MONTH(NOW());
+--------------+
| MONTH(NOW()) |
+--------------+
| 8 |
+--------------+
1 row in set (0.00 sec)
wenjuan[world]>
SELECT CONCAT(USER,"@",HOST) FROM mysql.user;
SELECT CONCAT("hello") 單獨(dú)使用沒什么意思,要結(jié)合多列才能顯示出效果
wenjuan[world]>SELECT CONCAT(USER,"@",HOST) FROM mysql.user;
+-------------------------+
| CONCAT(USER,"@",HOST) |
+-------------------------+
| root@10.0.0.% |
| wwj@10.0.0.% |
| wordpress@172.16.1.% |
| mysql.session@localhost |
| mysql.sys@localhost |
| root@localhost |
+-------------------------+
6 rows in set (0.00 sec)
wenjuan[world]>
SELECT GROUP_CONCAT(USER,"@",HOST) FROM mysql.user; 列轉(zhuǎn)行
wenjuan[world]>SELECT GROUP_CONCAT(USER,"@",HOST) FROM mysql.user;
+------------------------------------------------------------------------------------------------------------+
| GROUP_CONCAT(USER,"@",HOST) |
+------------------------------------------------------------------------------------------------------------+
| root@10.0.0.%,wwj@10.0.0.%,wordpress@172.16.1.%,mysql.session@localhost,mysql.sys@localhost,root@localhost |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
wenjuan[world]>
2> from子句使用
(1)SELECT * FROM city;
相當(dāng)于Linux中的 cat /etc/passwd 等
(2)SELECT NAME,countrycode FROM city;
相當(dāng)于Linux中的awk取列
3> where子句應(yīng)用
(1)等值查詢
##查詢中國的城市信息抒寂?
wenjuan[world]>SELECT * FROM city WHERE CountryCode='CHN';
+------+---------------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population |
+------+---------------------+-------------+----------------+------------+
| 1890 | Shanghai | CHN | Shanghai | 9696300 |
| 1891 | Peking | CHN | Peking | 7472000 |
| 1892 | Chongqing | CHN | Chongqing | 6351600 |
省略……
(2)不等值查詢
一般用于數(shù)字列查詢
##查詢?nèi)丝跀?shù)量小于100人的城市履澳?
wenjuan[world]>SELECT * FROM city WHERE population<100;
+------+-----------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+------+-----------+-------------+----------+------------+
| 2912 | Adamstown | PCN | – | 42 |
+------+-----------+-------------+----------+------------+
1 row in set (0.00 sec)
wenjuan[world]>
##查詢id小于10的城市信息?
wenjuan[world]>SELECT * FROM city WHERE id<10;
+----+----------------+-------------+---------------+------------+
| ID | Name | CountryCode | District | Population |
+----+----------------+-------------+---------------+------------+
| 1 | Kabul | AFG | Kabol | 1780000 |
| 2 | Qandahar | AFG | Qandahar | 237500 |
| 3 | Herat | AFG | Herat | 186800 |
| 4 | Mazar-e-Sharif | AFG | Balkh | 127800 |
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 7 | Haag | NLD | Zuid-Holland | 440900 |
| 8 | Utrecht | NLD | Utrecht | 234323 |
| 9 | Eindhoven | NLD | Noord-Brabant | 201843 |
+----+----------------+-------------+---------------+------------+
9 rows in set (0.00 sec)
wenjuan[world]>
##查詢世界上不是中國的城市信息慌洪?
wenjuan[world]>SELECT * FROM city WHERE countryCode!='CHN';
+------+------------------------------------+-------------+------------------------+------------+
| ID | Name | CountryCode | District | Population |
+------+------------------------------------+-------------+------------------------+------------+
| 1 | Kabul | AFG | Kabol | 1780000 |
| 2 | Qandahar | AFG | Qandahar | 237500 |
| 3 | Herat | AFG | Herat | 186800 |
……
注意:盡量不使用不等于策严,可能不走索引穗慕,影響效率
(3)模糊查詢
##查詢國家代號(hào)為CH打頭的城市信息?
wenjuan[world]>SELECT * FROM city WHERE countryCode LIKE 'CH%';
+------+---------------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population |
+------+---------------------+-------------+----------------+------------+
| 3245 | Zürich | CHE | Zürich | 336800 |
| 3246 | Geneve | CHE | Geneve | 173500 |
| 3247 | Basel | CHE | Basel-Stadt | 166700 |
| 3248 | Bern | CHE | Bern | 122700 |
| 3249 | Lausanne | CHE | Vaud | 114500 |
| 554 | Santiago de Chile | CHL | Santiago | 4703954 |
| 555 | Puente Alto | CHL | Santiago | 386236 |
……
注意:避免使用like中前面帶%的模糊查詢
(4)邏輯連接符(and妻导,or)
##查詢中國城市人口超過500萬的城市信息逛绵?
wenjuan[world]>SELECT * FROM city WHERE countryCode='CHN' AND population>5000000;
+------+-----------+-------------+-----------+------------+
| ID | Name | CountryCode | District | Population |
+------+-----------+-------------+-----------+------------+
| 1890 | Shanghai | CHN | Shanghai | 9696300 |
| 1891 | Peking | CHN | Peking | 7472000 |
| 1892 | Chongqing | CHN | Chongqing | 6351600 |
| 1893 | Tianjin | CHN | Tianjin | 5286800 |
+------+-----------+-------------+-----------+------------+
4 rows in set (0.00 sec)
wenjuan[world]>
##查看山東省或河北省的城市信息?
wenjuan[world]>SELECT * FROM city WHERE District='shandong' OR District='hebei';
+------+--------------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+------+--------------+-------------+----------+------------+
| 1903 | Qingdao | CHN | Shandong | 2596000 |
| 1904 | Jinan | CHN | Shandong | 2278100 |
| 1907 | Shijiazhuang | CHN | Hebei | 2041500 |
| 1921 | Zibo | CHN | Shandong | 1140000 |
| 1924 | Tangshan | CHN | Hebei | 1040000 |
| 1928 | Handan | CHN | Hebei | 840000 |
| 1948 | Zhangjiakou | CHN | Hebei | 530000 |
| 1955 | Baoding | CHN | Hebei | 483155 |
| 1960 | Yantai | CHN | Shandong | 452127 |
…………
##查詢?nèi)丝跀?shù)量在500萬到600萬的城市倔韭?
wenjuan[world]>SELECT * FROM city WHERE population>5000000 AND population<6000000;
+------+----------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population |
+------+----------------+-------------+----------------+------------+
| 207 | Rio de Janeiro | BRA | Rio de Janeiro | 5598953 |
| 1893 | Tianjin | CHN | Tianjin | 5286800 |
| 2298 | Kinshasa | COD | Kinshasa | 5064000 |
| 2823 | Lahore | PAK | Punjab | 5063499 |
+------+----------------+-------------+----------------+------------+
4 rows in set (0.00 sec)
wenjuan[world]>
(5)where配合between……and……使用
##查詢?nèi)丝跀?shù)量在500萬到600萬的城市信息(包含500萬到600萬)术浪?
wenjuan[world]>SELECT * FROM city WHERE population BETWEEN 5000000 AND 6000000;
+------+----------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population |
+------+----------------+-------------+----------------+------------+
| 207 | Rio de Janeiro | BRA | Rio de Janeiro | 5598953 |
| 1893 | Tianjin | CHN | Tianjin | 5286800 |
| 2298 | Kinshasa | COD | Kinshasa | 5064000 |
| 2823 | Lahore | PAK | Punjab | 5063499 |
+------+----------------+-------------+----------------+------------+
4 rows in set (0.00 sec)
wenjuan[world]>
(6)where配合in使用
##查看山東省或河北省的城市信息?
SELECT * FROM city WHERE District IN ('shandong','hebei');
注意:in 對(duì)應(yīng)相反的是 not in寿酌,但盡量不要使用胰苏,不走索引
4>group by分組子句+聚合函數(shù)應(yīng)用
(1)什么是分組?
按照某個(gè)列進(jìn)行分組
(2)常用的聚合函數(shù)
COUNT():計(jì)數(shù)
MAX():最大值
MIN():最小值
AVG():平均值
SUM():求和
GROUP_CONCAT():列轉(zhuǎn)行
(3)實(shí)例:
##統(tǒng)計(jì)每個(gè)國家的城市個(gè)數(shù)醇疼?
wenjuan[world]>SELECT CountryCode,COUNT(id) FROM city GROUP BY CountryCode;
+-------------+-----------+
| CountryCode | COUNT(id) |
+-------------+-----------+
| ABW | 1 |
| AFG | 4 |
| AGO | 5 |
| AIA | 2 |
| ALB | 1 |
…………
##統(tǒng)計(jì)每個(gè)國家的總?cè)丝跀?shù)硕并?
wenjuan[world]>SELECT CountryCode,SUM(population) FROM city GROUP BY CountryCode;
+-------------+-----------------+
| CountryCode | SUM(population) |
+-------------+-----------------+
| ABW | 29034 |
| AFG | 2332100 |
| AGO | 2561600 |
| AIA | 1556 |
| ALB | 270000 |
| AND | 21189 |
…………
##統(tǒng)計(jì)中國每個(gè)省的城市個(gè)數(shù)及省總?cè)丝跀?shù)?
wenjuan[world]>SELECT District,COUNT(NAME),SUM(population) FROM city WHERE countryCode='CHN' GROUP BY District;
+----------------+-------------+-----------------+
| District | COUNT(NAME) | SUM(population) |
+----------------+-------------+-----------------+
| Anhui | 16 | 5141136 |
| Chongqing | 1 | 6351600 |
| Fujian | 12 | 3575650 |
| Gansu | 7 | 2462631 |
| Guangdong | 20 | 9510263 |
| Guangxi | 9 | 2925142 |
| Guizhou | 6 | 2512087 |
| Hainan | 2 | 557120 |
…………
##統(tǒng)計(jì)各個(gè)國家的城市名列表秧荆?
wenjuan[world]>SELECT CountryCode,GROUP_CONCAT(NAME) FROM city GROUP BY CountryCode;
| CountryCode | GROUP_CONCAT(NAME) |
| ABW | Oranjestad | | AFG | Kabul,Qandahar,Herat,Mazar-e-Sharif |
| ARE | Dubai,Abu Dhabi,Sharja,al-Ayn,Ajman |
…………
5> having語句
##統(tǒng)計(jì)中國每個(gè)省的城市個(gè)數(shù)及省總?cè)丝跀?shù)倔毙,只顯示人口總數(shù)大于800萬的省乙濒?
wenjuan[world]>SELECT District,COUNT(NAME),SUM(population) FROM city WHERE countryCode='CHN' GROUP BY District HAVING SUM(population)>8000000;
+--------------+-------------+-----------------+
| District | COUNT(NAME) | SUM(population) |
+--------------+-------------+-----------------+
| Guangdong | 20 | 9510263 |
| Heilongjiang | 21 | 11628057 |
| Hubei | 22 | 8547585 |
| Jiangsu | 25 | 9719860 |
| Liaoning | 21 | 15079174 |
| Shandong | 32 | 12114416 |
| Shanghai | 1 | 9696300 |
+--------------+-------------+-----------------+
7 rows in set (0.00 sec)
wenjuan[world]>
6> order b子句
##統(tǒng)計(jì)中國每個(gè)省的城市個(gè)數(shù)及省總?cè)丝跀?shù)陕赃,只顯示人口總數(shù)大于800萬的省,并進(jìn)行從大到小排序?
wenjuan[world]>SELECT District,COUNT(NAME),SUM(population) FROM city WHERE countryCode='CHN' GROUP BY District HAVING SUM(population)>8000000 ORDER BY SUM(population) DESC;
+--------------+-------------+-----------------+
| District | COUNT(NAME) | SUM(population) |
+--------------+-------------+-----------------+
| Liaoning | 21 | 15079174 |
| Shandong | 32 | 12114416 |
| Heilongjiang | 21 | 11628057 |
| Jiangsu | 25 | 9719860 |
| Shanghai | 1 | 9696300 |
| Guangdong | 20 | 9510263 |
| Hubei | 22 | 8547585 |
+--------------+-------------+-----------------+
7 rows in set (0.00 sec)
wenjuan[world]>
##查詢中國所有城市信息凯正,并以人口數(shù)降序輸出?
wenjuan[world]>SELECT * FROM city WHERE District='shandong' UNION ALL SELECT * FROM city WHERE District='hebei';
+------+--------------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+------+--------------+-------------+----------+------------+
| 1903 | Qingdao | CHN | Shandong | 2596000 |
| 1904 | Jinan | CHN | Shandong | 2278100 |
| 1921 | Zibo | CHN | Shandong | 1140000 |
| 1960 | Yantai | CHN | Shandong | 452127 |
| 1963 | Weifang | CHN | Shandong | 428522 |
| 1977 | Zaozhuang | CHN | Shandong | 380846 |
| 1991 | Tai′an | CHN | Shandong | 350696 |
…………
7> limit應(yīng)用
1> 語法:
LIMIT M offet N
LIMIT N,M
-- 跳過前N行,顯示M行(N和M代表的是數(shù)字)
2> 實(shí)例:
##查詢中國所有城市信息豌蟋,并以人口數(shù)降序輸出廊散,并只取前五名?
wenjuan[world]>SELECT * FROM city WHERE countryCode='CHN' ORDER BY population DESC LIMIT 5;
+------+-----------+-------------+-----------+------------+
| ID | Name | CountryCode | District | Population |
+------+-----------+-------------+-----------+------------+
| 1890 | Shanghai | CHN | Shanghai | 9696300 |
| 1891 | Peking | CHN | Peking | 7472000 |
| 1892 | Chongqing | CHN | Chongqing | 6351600 |
| 1893 | Tianjin | CHN | Tianjin | 5286800 |
| 1894 | Wuhan | CHN | Hubei | 4344600 |
+------+-----------+-------------+-----------+------------+
5 rows in set (0.00 sec)
wenjuan[world]>
##查詢中國所有城市信息梧疲,并以人口數(shù)降序輸出允睹,并只第6到10名?
SELECT * FROM city WHERE countryCode='CHN' ORDER BY population DESC LIMIT 5,5;
SELECT * FROM city WHERE countryCode='CHN' ORDER BY population DESC LIMIT 5 OFFSET 5;
8> distinct應(yīng)用
##查詢所有的國家代碼信息
wenjuan[world]>SELECT DISTINCT countryCode FROM city;
+-------------+
| countryCode |
+-------------+
| ABW |
| AFG |
| AGO |
| AIA |
| ALB |
…………
9> union和union all的應(yīng)用
查看山東省或河北省的城市信息幌氮?
wenjuan[world]>SELECT * FROM city WHERE District='shandong' UNION ALL SELECT * FROM city WHERE District='hebei';
+------+--------------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+------+--------------+-------------+----------+------------+
| 1903 | Qingdao | CHN | Shandong | 2596000 |
| 1904 | Jinan | CHN | Shandong | 2278100 |
| 1921 | Zibo | CHN | Shandong | 1140000 |
| 1960 | Yantai | CHN | Shandong | 452127 |
| 1963 | Weifang | CHN | Shandong | 428522 |
…………
| 1907 | Shijiazhuang | CHN | Hebei | 2041500 |
| 1924 | Tangshan | CHN | Hebei | 1040000 |
| 1928 | Handan | CHN | Hebei | 840000 |
| 1948 | Zhangjiakou | CHN | Hebei | 530000 |
…………
注意:他們的性能高于or 或 in 的性能
union和union all的區(qū)別缭受?(面試題)
union帶有去重復(fù)的功能,union all沒有去重復(fù)的功能
1.3 select多表查詢
1> 作用
業(yè)務(wù)需要的數(shù)據(jù)來自多張表時(shí)该互,會(huì)使用到多表查詢
2> 多表連接類型
- 內(nèi)連接 *****
- 外鏈接 ***
- 全連接 *
- 笛卡爾
3>多表連接的基本語法(內(nèi)連接)
傳統(tǒng)連接 where
自連接
join uing **
join on *****
4> join on 的語法
查詢張三的家庭住址
SELECT A.name,B.address FROM
A JOIN B
ON A.id=B.id
WHERE A.name='zhangsan'
多表連接的套路:
- 根據(jù)需求找到關(guān)聯(lián)表
- 找到表與標(biāo)的關(guān)聯(lián)列
- 列名調(diào)用時(shí),需要添加表前綴
5> 別名的使用
(1)表別名
- 一般是在 FROM的表的別名,或者join后的表的別名
- 在 where, group by ,select后的列,having,order by
(2)列別名
- 一般是在select后的列米者,定義的別名
- 作用:
??- 結(jié)果集顯示會(huì)以別名形式展示
??- 在hanving和order by 中可以調(diào)用列別名
6> 多表連接案例
(1)查詢?nèi)丝跀?shù)量少于100人的城市所在:國家名,國土面積,城市名,人口數(shù)
USE world;
DESC city;
DESC country;
SELECT
country.name ,country.SurfaceArea,city.name,city.Population
FROM city
JOIN country
ON city.CountryCode=country.code
WHERE city.Population<100;
(2)統(tǒng)計(jì)zhang3學(xué)習(xí)了幾門課程
SELECT student.sname ,COUNT(sc.sno) 課程數(shù)
FROM student
JOIN sc
ON student.sno=sc.sno
WHERE student.sname='li4';
(3)統(tǒng)計(jì)zhang3學(xué)習(xí)課程名稱
SELECT student.sname ,GROUP_CONCAT(course.cname) 課程名稱
FROM student
JOIN sc
ON student.sno=sc.sno
JOIN course
ON sc.cno=course.cno
WHERE student.sname='zhang3';
(4)oldguo老師教了學(xué)生的個(gè)數(shù)
SELECT th.tname,COUNT(st.sno) 個(gè)數(shù) FROM teacher AS th
JOIN course AS cr ON th.tno=cr.tno
JOIN sc ON cr.cno=sc.cno
JOIN student AS st ON sc.sno=st.sno
WHERE tname='oldguo';
(5)每位老師所教課程的平均分,并按平均分排序
SELECT th.`tname` tname,cr.`cname` cname,cr.`cno` cno,AVG(sc.`score`) avg_score FROM teacher AS th
JOIN course AS cr ON th.tno=cr.tno
JOIN sc ON cr.cno=sc.cno
GROUP BY th.`tname`,cr.`cname`
ORDER BY avg_score DESC
(6)查詢oldguo所教的不及格的學(xué)生姓名
SELECT th.`tname`,st.`sname`,sc.`score` FROM teacher AS th
JOIN course AS cr ON th.tno=cr.tno
JOIN sc ON cr.cno=sc.cno
JOIN student AS st ON sc.sno=st.sno
WHERE score<60 AND tname='oldguo';
(7)查詢所有老師所教學(xué)生不及格的信息
SELECT th.tname 教師名稱,GROUP_CONCAT(st.sname) 不及格的學(xué)生 FROM teacher AS th
INNER JOIN course AS cr ON th.tno=cr.tno
INNER JOIN sc ON cr.cno=sc.cno
INNER JOIN student AS st ON sc.sno=st.sno
WHERE score<60
GROUP BY th.tname