1. 程式人生 > 其它 >MySQL-06-DQL語句

MySQL-06-DQL語句




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;