記:vue tab切換(定時切換)
阿新 • • 發佈:2020-12-23
DQL:查詢語句
準備sql
CREATE TABLE student3 (
id int, -- 編號
name varchar(20), -- 姓名
age int, -- 年齡
sex varchar(5), -- 性別
address varchar(100), -- 地址
math int, -- 數學
english int -- 英語
);
INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES (1,'馬雲',55,'男','
杭州',66,78),(2 ,'馬化騰',45,'女','深圳',98,87),(3,'馬景濤',55,'男','香港',56,77),(4,'柳巖
',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'劉德華',57,'男','香港
',99,99),(7,'馬德',22,'女','香港',99,99),(8,'德瑪西亞',18,'男','南京',56,65);
1 排序查詢
*語法 * order by 子句
* order by 排序欄位1 排序方式1 , 排序欄位2 ,排序方式2
-- 查詢數學成績升序排序(預設查詢順序就是ASC這裡可以不寫)
SELECT * FROM student3 ORDER BY math ASC;
-- 查詢數學成績降序排序
SELECT * FROM student3 ORDER BY math DESC;
-- 查詢數學成績按照升序排序,如果數學成績一樣就按英語成績排序
SELECT * FROM student3 ORDER BY math ASC , english ASC ;
2.聚合函式
- 將一列資料作為一個整體,進行縱向的計算
- 1.count: 計算個數
- 2.max:計算最大值
- 3.min:計算最小值
- 4.sum:計算和
- 5.avg: 計算平均
注意:所有的聚合函式都是排除的非空的欄位
-- 計算總人數
SELECT COUNT(NAME) FROM student3;
-- 計算數學的平均值
select avg(math) from student3;
-- 計算數學的最大值
SELECT max(math) FROM student3;
-- 計算數學的最小值
SELECT MIN(math) FROM student3;
-- 計算數學的總成績
SELECT SUM(math) FROM student3;
-- 如果以英語成績查詢總的人數但是英語成績有一列是空的所以需要判斷
SELECT COUNT(IFNULL(english,0)) FROM student3;
分組查詢
-- 按照性別分組,分別查詢男女的數學平均分
SELECT sex, AVG(math) FROM student3 GROUP BY sex ;
-- 按照性別分組,分別查詢男女的數學平均分,以及男女的人數
SELECT sex, AVG(math) ,count(id) FROM student3 GROUP BY sex ;
-- 按照性別分組,分別查詢男女的數學平均分,以及男女的人數,如果數學成績大於70才引數分組
SELECT sex, AVG(math) ,count(id) FROM student3 WHERE math>70 GROUP BY sex ;
-- 按照性別分組,分別查詢男女的數學平均分,以及男女的人數,如果數學成績大於70才引數分組,分組之後組員小於2個不參與分組
SELECT sex, AVG(math) ,count(id) as c FROM student3 WHERE math>70 GROUP BY sex HAVING c>2;
注意:分組之後,在select後 要麼加分組的欄位,要麼加聚合函式
經典面試題
where 和having 的區別?
- where在分組之前進行判定,如果不滿足條件,就不參與分組
- having在分組之後進行判定,如果不滿足條件,就不會被查詢出來
注意:where之後不能跟聚合函式的判定,having之後可以跟聚合函式的判定
外來鍵約束
準備sql
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30),
age INT,
dep_name VARCHAR(30),
dep_location VARCHAR(30)
);
-- 新增資料
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('張三', 20, '研發部', '廣州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研發部', '廣州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研發部', '廣州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '銷售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '銷售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '銷售部', '深圳');
資料有冗餘,需要建立外來鍵關聯
決解方案,建立多張表與主表關聯
-- 建立部門表(id,dep_name,dep_location)
-- 一方,主表
create table department(
id int primary key auto_increment,
dep_name varchar(20),
dep_location varchar(20)
);
-- 建立員工表(id,name,age,dep_id)
-- 多方,從表
create table employee(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int -- 外來鍵對應主表的主鍵
)
-- 新增 2 個部門
insert into department values(null, '研發部','廣州'),(null, '銷售部', '深圳');
select * from department;
-- 新增員工,dep_id 表示員工所在的部門
INSERT INTO employee (NAME, age, dep_id) VALUES ('張三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);
select * from employee;