MySQL-06-DQL語句
阿新 • • 發佈:2021-06-21
DQL
sql檔案下載連結:
https://alnk-blog-pictures.oss-cn-shenzhen.aliyuncs.com/blog-pictures/world.sql
select
-- select @@xxx 檢視系統引數 SELECT @@port; SELECT @@basedir; SELECT @@datadir; SELECT @@socket; SELECT @@server_id; -- select 函式(); SELECT NOW(); SELECT DATABASE(); SELECT USER(); SELECT CONCAT("hello world"); SELECT CONCAT(USER,"@",HOST) FROM mysql.user; SELECT GROUP_CONCAT(USER,"@",HOST) FROM mysql.user; -- https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html?tdsourcetag=s_pcqq_aiomsg
from
-- SELECT 列1,列2 FROM 表 -- SELECT * FROM 表 -- 例子: -- 查詢stu中所有的資料(不要對大表進行操作) SELECT * FROM stu ; -- 查詢stu表中,學生姓名和入學時間 SELECT sname, intime FROM stu; -- city:城市表 DESC city; /** ID : 城市ID NAME : 城市名 CountryCode: 國家程式碼,比如中國CHN 美國USA District : 區域 Population : 人口 **/ SHOW CREATE TABLE city; SELECT * FROM city WHERE id<10;
where
-- SELECT col1,col2 FROM TABLE WHERE colN 條件; -- 1 where配合等值查詢 -- 查詢中國(CHN)所有城市資訊 SELECT * FROM city WHERE countrycode='CHN'; -- 查詢北京市的資訊 SELECT * FROM city WHERE NAME='peking'; -- 查詢甘肅省所有城市資訊 SELECT * FROM city WHERE district='gansu'; -- 2 where配合比較操作符(> < >= <= <>) -- 查詢世界上少於100人的城市 SELECT * FROM city WHERE population<100; -- 3 where配合邏輯運算子(and or ) -- 中國人口數量大於500w SELECT * FROM city WHERE countrycode='CHN' AND population>5000000; -- 中國或美國城市資訊 SELECT * FROM city WHERE countrycode='CHN' OR countrycode='USA'; -- 4 where配合模糊查詢 -- 查詢省的名字前面帶guang開頭的 SELECT * FROM city WHERE district LIKE 'guang%'; -- 注意:%不能放在前面,因為不走索引. -- 5 where配合in語句 -- 中國或美國城市資訊 SELECT * FROM city WHERE countrycode IN ('CHN' ,'USA'); -- 6 where配合between and -- 查詢世界上人口數量大於100w小於200w的城市資訊 SELECT * FROM city WHERE population >1000000 AND population <2000000; SELECT * FROM city WHERE population BETWEEN 1000000 AND 2000000;
group by
-- 1 作用
-- 根據by後面的條件進行分組,方便統計,by後面跟一個列或多個列
/**
2 常用聚合函式
max() :最大值
min() :最小值
avg() :平均值
sum() :總和
count() :個數
group_concat() : 列轉行
**/
-- 例子1:統計世界上每個國家的總人口數.
USE world
SELECT countrycode, SUM(population) FROM city GROUP BY countrycode;
-- 例子2: 統計中國各個省的總人口數量
SELECT district, SUM(Population) FROM city WHERE countrycode='chn' GROUP BY district;
-- 例子3:統計世界上每個國家的城市數量
SELECT countrycode, COUNT(id) FROM city GROUP BY countrycode;
having
-- where|group|having
-- 統計中國每個省的總人口數,只打印總人口數小於100萬
SELECT district,SUM(Population)
FROM city
WHERE countrycode='chn'
GROUP BY district
HAVING SUM(Population) < 1000000 ;
order by和limit
-- 實現先排序,by後新增條件列
-- 檢視中國所有的城市,並按人口數進行排序(從大到小)
SELECT * FROM city WHERE countrycode='CHN' ORDER BY population DESC;
-- 統計中國各個省的總人口數量,按照總人口從大到小排序
SELECT district AS 省 ,SUM(Population) AS 總人口
FROM city
WHERE countrycode='chn'
GROUP BY district
ORDER BY 總人口 DESC ;
-- 統計中國,每個省的總人口,找出總人口大於500w的,並按總人口從大到小排序,只顯示前三名
SELECT district, SUM(population) FROM city
WHERE countrycode='CHN'
GROUP BY district
HAVING SUM(population)>5000000
ORDER BY SUM(population) DESC
LIMIT 3 ;
-- LIMIT N ,M --->跳過N,顯示一共M行
-- LIMIT 5,5
SELECT district, SUM(population) FROM city
WHERE countrycode='CHN'
GROUP BY district
HAVING SUM(population)>5000000
ORDER BY SUM(population) DESC
LIMIT 5,5;
distinct
-- distinct:去重複
SELECT countrycode FROM city;
SELECT DISTINCT(countrycode) FROM city;
union all
-- union all:聯合查詢
-- 中國或美國城市資訊
SELECT * FROM city
WHERE countrycode IN ('CHN' ,'USA');
SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE countrycode='USA'
/**
說明:一般情況下,我們會將 IN 或者 OR 語句 改寫成 UNION ALL,來提高效能
UNION 去重複
UNION ALL 不去重複
**/
join
-- join:多表連線查詢
-- 查詢一下世界上人口數量小於100人的城市名和國家名
SELECT b.name ,a.name ,a.population
FROM city AS a
JOIN country AS b
ON b.code=a.countrycode
WHERE a.Population<100
-- 查詢城市shenyang,城市人口,所在國家名(name)及國土面積(SurfaceArea)
SELECT a.name,a.population,b.name ,b.SurfaceArea
FROM city AS a JOIN country AS b
ON a.countrycode=b.code
WHERE a.name='shenyang';
-- 列別名,表別名
SELECT
a.Name AS an ,
b.name AS bn ,
b.SurfaceArea AS bs,
a.Population AS bp
FROM city AS a JOIN country AS b
ON a.CountryCode=b.Code
WHERE a.name ='shenyang';
多表SQL練習題
/**
案例準備
按需求建立一下表結構:
use school
student:學生表
sno: 學號
sname:學生姓名
sage: 學生年齡
ssex: 學生性別
teacher:教師表
tno: 教師編號
tname:教師名字
course: 課程表
cno: 課程編號
cname:課程名字
tno: 教師編號
score: 成績表
sno: 學號
cno: 課程編號
score:成績
**/
-- 專案構建
drop database school;
CREATE DATABASE school CHARSET utf8;
USE school
CREATE TABLE student(
sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '學號',
sname VARCHAR(20) NOT NULL COMMENT '姓名',
sage TINYINT UNSIGNED NOT NULL COMMENT '年齡',
ssex ENUM('f','m') NOT NULL DEFAULT 'm' COMMENT '性別'
)ENGINE=INNODB CHARSET=utf8;
CREATE TABLE course(
cno INT NOT NULL PRIMARY KEY COMMENT '課程編號',
cname VARCHAR(20) NOT NULL COMMENT '課程名字',
tno INT NOT NULL COMMENT '教師編號'
)ENGINE=INNODB CHARSET utf8;
CREATE TABLE sc (
sno INT NOT NULL COMMENT '學號',
cno INT NOT NULL COMMENT '課程編號',
score INT NOT NULL DEFAULT 0 COMMENT '成績'
)ENGINE=INNODB CHARSET=utf8;
CREATE TABLE teacher(
tno INT NOT NULL PRIMARY KEY COMMENT '教師編號',
tname VARCHAR(20) NOT NULL COMMENT '教師名字'
)ENGINE=INNODB CHARSET utf8;
INSERT INTO student(sno,sname,sage,ssex)
VALUES (1,'zhang3',18,'m');
INSERT INTO student(sno,sname,sage,ssex)
VALUES
(2,'zhang4',18,'m'),
(3,'li4',18,'m'),
(4,'wang5',19,'f');
INSERT INTO student
VALUES
(5,'zh4',18,'m'),
(6,'zhao4',18,'m'),
(7,'ma6',19,'f');
INSERT INTO student(sname,sage,ssex)
VALUES
('oldboy',20,'m'),
('oldgirl',20,'f'),
('oldp',25,'m');
INSERT INTO teacher(tno,tname) VALUES
(101,'oldboy'),
(102,'hesw'),
(103,'oldguo');
DESC course;
INSERT INTO course(cno,cname,tno)
VALUES
(1001,'linux',101),
(1002,'python',102),
(1003,'mysql',103);
DESC sc;
INSERT INTO sc(sno,cno,score)
VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);
SELECT * FROM student;
SELECT * FROM teacher;
SELECT * FROM course;
SELECT * FROM sc;
-- 查詢張三的家庭住址
SELECT A.name,B.address FROM
A JOIN B
ON A.id=B.id
WHERE A.name='zhangsan'
-- 統計zhang3,學習了幾門課
SELECT st.sname , COUNT(sc.cno)
FROM student AS st
JOIN
sc
ON st.sno=sc.sno
WHERE st.sname='zhang3'
-- 查詢zhang3,學習的課程名稱有哪些
SELECT st.sname , GROUP_CONCAT(co.cname)
FROM student AS st
JOIN sc
ON st.sno=sc.sno
JOIN course AS co
ON sc.cno=co.cno
WHERE st.sname='zhang3'
-- 查詢oldguo老師教的學生名.
SELECT te.tname ,GROUP_CONCAT(st.sname)
FROM student AS st
JOIN sc
ON st.sno=sc.sno
JOIN course AS co
ON sc.cno=co.cno
JOIN teacher AS te
ON co.tno=te.tno
WHERE te.tname='oldguo';
select teacher.tname,GROUP_CONCAT(student.sname) from teacher
JOIN course on teacher.tno=course.tno
JOIN sc on course.cno=sc.cno
JOIN student on sc.sno=student.sno
where teacher.tname='oldguo'
-- 查詢oldguo所教課程的平均分數
SELECT te.tname,AVG(sc.score)
FROM teacher AS te
JOIN course AS co
ON te.tno=co.tno
JOIN sc
ON co.cno=sc.cno
WHERE te.tname='oldguo'
-- 每位老師所教課程的平均分,並按平均分排序
SELECT te.tname,AVG(sc.score)
FROM teacher AS te
JOIN course AS co
ON te.tno=co.tno
JOIN sc
ON co.cno=sc.cno
GROUP BY te.tname
ORDER BY AVG(sc.score) DESC ;
-- 查詢oldguo所教的不及格的學生姓名
SELECT te.tname,st.sname,sc.score
FROM teacher AS te
JOIN course AS co
ON te.tno=co.tno
JOIN sc
ON co.cno=sc.cno
JOIN student AS st
ON sc.sno=st.sno
WHERE te.tname='oldguo' AND sc.score<60;
-- 查詢所有老師所教學生不及格的資訊
SELECT te.tname,st.sname,sc.score
FROM teacher AS te
JOIN course AS co
ON te.tno=co.tno
JOIN sc
ON co.cno=sc.cno
JOIN student AS st
ON sc.sno=st.sno
WHERE sc.score<60;