小白学习Mysql之路-day01
小白学习Mysql之路-day01
数据库语句:
dept 表:
/*
Navicat MySQL Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 80022
Source Host : localhost:3306
Source Schema : test
Target Server Type : MySQL
Target Server Version : 80022
File Encoding : 65001
Date: 21/04/2021 17:01:32
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`deptnu` int NOT NULL COMMENT '部门编号',
`dname` varchar(50) DEFAULT NULL COMMENT '部门名称',
`addr` varchar(50) DEFAULT NULL COMMENT '部门地址',
PRIMARY KEY (`deptnu`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of dept
-- ----------------------------
BEGIN;
INSERT INTO `dept` VALUES (10, '研发部', '北京');
INSERT INTO `dept` VALUES (20, '工程部', '上海');
INSERT INTO `dept` VALUES (30, '销售部', '广州');
INSERT INTO `dept` VALUES (40, '财务部', '深圳');
INSERT INTO `dept` VALUES (50, '測試部', '台灣');
INSERT INTO `dept` VALUES (60, 'UI部', 'HongKong');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
INSERT INTO `dept` VALUES (10, '研发部', '北京');
INSERT INTO `dept` VALUES (20, '工程部', '上海');
INSERT INTO `dept` VALUES (30, '销售部', '广州');
INSERT INTO `dept` VALUES (40, '财务部', '深圳');
INSERT INTO `dept` VALUES (50, '測試部', '台灣');
INSERT INTO `dept` VALUES (60, 'UI部', 'HongKong');
emp表:
/*
Navicat MySQL Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 80022
Source Host : localhost:3306
Source Schema : test
Target Server Type : MySQL
Target Server Version : 80022
File Encoding : 65001
Date: 21/04/2021 17:01:43
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`empno` int NOT NULL COMMENT '雇员编号',
`ename` varchar(20) DEFAULT NULL COMMENT '雇员姓名',
`job` varchar(20) DEFAULT NULL COMMENT '雇员职位',
`mgr` int DEFAULT NULL COMMENT '雇员上级编号',
`hiredate` date DEFAULT NULL COMMENT '雇佣日期',
`sal` decimal(7,2) DEFAULT NULL COMMENT '薪资',
`deptnu` int DEFAULT NULL COMMENT '部门编号',
PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of employee
-- ----------------------------
BEGIN;
INSERT INTO `employee` VALUES (1001, '小乔', '文员', 1013, '2018-12-17', 8000.00, 20);
INSERT INTO `employee` VALUES (1002, '牛魔王', '销售员', 1006, '2018-02-20', 16000.00, 30);
INSERT INTO `employee` VALUES (1003, '程咬金', '销售员', 1006, '2017-02-22', 12500.00, 30);
INSERT INTO `employee` VALUES (1004, '猪八戒', '经理', 1009, '2001-04-02', 29750.00, 20);
INSERT INTO `employee` VALUES (1005, '后裔', '销售员', 1006, '2011-09-28', 12500.00, 30);
INSERT INTO `employee` VALUES (1006, '猴子', '经理', 1009, '2011-05-01', 28500.00, 30);
INSERT INTO `employee` VALUES (1007, '张飞', '经理', 1009, '2011-09-01', 24500.00, 10);
INSERT INTO `employee` VALUES (1008, '诸葛亮', '分析师', 1004, '2017-04-19', 30000.00, 20);
INSERT INTO `employee` VALUES (1009, '唐僧', '董事长', NULL, '2010-11-17', 50000.00, 10);
INSERT INTO `employee` VALUES (1010, '韩信', '销售员', 1006, '2018-09-08', 15000.00, 30);
INSERT INTO `employee` VALUES (1011, '妲己', '文员', 1008, '2018-05-23', 11000.00, 20);
INSERT INTO `employee` VALUES (1012, '安琪拉', '文员', 1006, '2011-12-03', 9500.00, 30);
INSERT INTO `employee` VALUES (1013, '林俊杰', '分析师', 1004, '2011-12-03', 30000.00, 20);
INSERT INTO `employee` VALUES (1014, '甄姬', '文员', 1007, '2019-01-23', 7500.00, 10);
INSERT INTO `employee` VALUES (1015, 'Kitty', '測試', 1017, '2021-04-20', 7888.00, 50);
INSERT INTO `employee` VALUES (1016, 'Mimmy', '測試', 1017, '2021-04-20', 7888.00, 50);
INSERT INTO `employee` VALUES (1017, 'Tester', '測試經理', NULL, '2021-04-22', 10000.00, 50);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
INSERT INTO `employee` VALUES (1001, '小乔', '文员', 1013, '2018-12-17', 8000.00, 20);
INSERT INTO `employee` VALUES (1002, '牛魔王', '销售员', 1006, '2018-02-20', 16000.00, 30);
INSERT INTO `employee` VALUES (1003, '程咬金', '销售员', 1006, '2017-02-22', 12500.00, 30);
INSERT INTO `employee` VALUES (1004, '猪八戒', '经理', 1009, '2001-04-02', 29750.00, 20);
INSERT INTO `employee` VALUES (1005, '后裔', '销售员', 1006, '2011-09-28', 12500.00, 30);
INSERT INTO `employee` VALUES (1006, '猴子', '经理', 1009, '2011-05-01', 28500.00, 30);
INSERT INTO `employee` VALUES (1007, '张飞', '经理', 1009, '2011-09-01', 24500.00, 10);
INSERT INTO `employee` VALUES (1008, '诸葛亮', '分析师', 1004, '2017-04-19', 30000.00, 20);
INSERT INTO `employee` VALUES (1009, '唐僧', '董事长', NULL, '2010-11-17', 50000.00, 10);
INSERT INTO `employee` VALUES (1010, '韩信', '销售员', 1006, '2018-09-08', 15000.00, 30);
INSERT INTO `employee` VALUES (1011, '妲己', '文员', 1008, '2018-05-23', 11000.00, 20);
INSERT INTO `employee` VALUES (1012, '安琪拉', '文员', 1006, '2011-12-03', 9500.00, 30);
INSERT INTO `employee` VALUES (1013, '林俊杰', '分析师', 1004, '2011-12-03', 30000.00, 20);
INSERT INTO `employee` VALUES (1014, '甄姬', '文员', 1007, '2019-01-23', 7500.00, 10);
INSERT INTO `employee` VALUES (1015, 'Kitty', '測試', 1017, '2021-04-20', 7888.00, 50);
INSERT INTO `employee` VALUES (1016, 'Mimmy', '測試', 1017, '2021-04-20', 7888.00, 50);
INSERT INTO `employee` VALUES (1017, 'Tester', '測試經理', NULL, '2021-04-22', 10000.00, 50);
**
首先放在最前面:语法顺序 where ---- group by ----- having ------ order by
**
where 查询
– 子查詢:mysql查询子句之一where条件查询
SELECT * FROM employee;
SELECT
emp.empno,
emp.ename,
emp.job
FROM employee AS emp;
– 精確查詢
SELECT * FROM employee WHERE ename = '小乔'
– 模糊查询
SHOW VARIABLES LIKE '%aracter%'
SELECT * from employee WHERE ename like '林%'
– 范围查找
SELECT * from employee as emp
where emp.sal BETWEEN 10000 and 30000
ORDER BY emp.sal DESC;
SELECT * FROM employee AS emp
WHERE emp.hiredate
BETWEEN '2011-01-01' AND '2020-12-12';
– 离散查询
SELECT * from employee AS emp
WHERE emp.ename in ('猴子','林俊杰','小红','小胡');
– 清除重复值
SELECT DISTINCT(emp.job) FROM employee AS emp;
– 聚合函数
SELECT COUNT(*) from employee
SELECT COUNT(emp.`ename`) from employee AS emp;
SELECT SUM(emp.sal) from employee AS emp;
SELECT MAX(emp.sal) from employee AS emp;
SELECT * from employee AS emp
where emp.sal = (SELECT MAX(emp.sal) from employee AS emp);
select AVG(emp.sal) from employee AS emp;
SELECT MIN(emp.sal) from employee AS emp;
SELECT * from employee AS emp
WHERE emp.sal = (SELECT MIN(emp.sal) from employee AS emp);
– concat函数 起到连接作用
SELECT CONCAT(emp.ename,'is',emp.job) as `job Table`
from employee AS emp;
SELECT CONCAT(emp.ename,'-',emp.sal,'-',emp.job) AS `name-salary`
from employee AS emp;
group by—分組
这里用到了另外一张表 msg表:
/*
Navicat MySQL Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 80022
Source Host : localhost:3306
Source Schema : helloworld
Target Server Type : MySQL
Target Server Version : 80022
File Encoding : 65001
Date: 21/04/2021 17:07:21
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for msg
-- ----------------------------
DROP TABLE IF EXISTS `msg`;
CREATE TABLE `msg` (
`id` int NOT NULL AUTO_INCREMENT,
`bsf` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`sex` varchar(255) DEFAULT NULL,
`color` varchar(255) DEFAULT NULL,
`ch` varchar(255) DEFAULT NULL,
`en` varchar(255) DEFAULT NULL,
`math` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of msg
-- ----------------------------
BEGIN;
INSERT INTO `msg` VALUES (1, 'HelloKitty', 'Kitty', 'girl', 'pink', '99', '90', '88');
INSERT INTO `msg` VALUES (2, 'HelloKitty', 'Mimmy', 'girl', 'pink', '99', '78', '99');
INSERT INTO `msg` VALUES (3, 'Animal', 'Ox', 'boy', 'blue', '78', '87', '65');
INSERT INTO `msg` VALUES (4, 'Animal', 'Bear', 'boy', 'yellow', '87', '66', '32');
INSERT INTO `msg` VALUES (5, 'Animal', 'Olin', 'girl', 'purple', '89', '60', '33');
INSERT INTO `msg` VALUES (6, 'Word', 'A', 'boy', 'black', '65', '59', '65');
INSERT INTO `msg` VALUES (7, 'Word', 'B', 'girl', 'purple', '65', '59', '45');
INSERT INTO `msg` VALUES (8, 'Word', 'C', 'boy', 'purple', '50', '54', '54');
INSERT INTO `msg` VALUES (9, 'Word', 'D', 'boy', 'green', '34', '33', '54');
INSERT INTO `msg` VALUES (10, 'Word', 'E', 'girl', 'green', '20', '22', '34');
INSERT INTO `msg` VALUES (11, 'Word', 'F', 'boy', 'pink', '59', '56', '44');
INSERT INTO `msg` VALUES (14, 'Word', 'G', 'girl', 'purple', '60', '60', '60');
INSERT INTO `msg` VALUES (15, 'Word', 'H', 'boy', 'pink', '0', '0', '0');
INSERT INTO `msg` VALUES (16, 'Word', 'I', 'girl', 'green', '0', '0', '0');
INSERT INTO `msg` VALUES (17, NULL, 'I', 'girl', 'green', '0', '0', '0');
INSERT INTO `msg` VALUES (18, NULL, 'H', 'boy', 'pink', '0', '0', '0');
INSERT INTO `msg` VALUES (19, 'String', '4 abc', 'boy', 'pink', '11', '11', '11');
INSERT INTO `msg` VALUES (20, 'String', '14 abc', 'girl', 'purple', '22', '22', '22');
INSERT INTO `msg` VALUES (21, 'String', '144 abc', 'boy', 'luck', '33', '33', '33');
INSERT INTO `msg` VALUES (22, 'String', '4abc', 'boy', 'green', '44', '44', '44');
INSERT INTO `msg` VALUES (24, 'String', '14abc', NULL, NULL, NULL, NULL, NULL);
INSERT INTO `msg` VALUES (25, 'String', '144abc', NULL, NULL, NULL, NULL, NULL);
INSERT INTO `msg` VALUES (26, 'Name_Ball', 'James Harden', 'boy', 'pink', '88', '88', '88');
INSERT INTO `msg` VALUES (27, 'Name_Ball', 'James Garden', 'boy', 'pink', '88', '88', '88');
INSERT INTO `msg` VALUES (28, 'Name_Ball', 'James Tarden', 'boy', 'tt', '45', '89', '90');
INSERT INTO `msg` VALUES (29, 'HelloKitty', 'Kitty', 'girl', 'pink', '99', '90', '88');
INSERT INTO `msg` VALUES (30, 'HelloKitty', 'Mimmy', 'girl', 'pink', '99', '78', '99');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
SELECT * FROM msg;
SELECT
sex
FROM msg
GROUP BY msg.sex;
SELECT
sex,
COUNT(*)
FROM msg
GROUP BY msg.sex;
-- round(AVG(grade),2)
SELECT
msg.sex,
SUM(msg.en) AS sum_en,
SUM(msg.ch) AS sum_ch,
SUM(msg.math) AS sum_ma,
ROUND(AVG(msg.en),2) AS avg_en,
ROUND(AVG(msg.ch),2) AS avg_ch,
ROUND(AVG(msg.math),2) AS avg_ma,
MAX(msg.en) AS max_en,
MAX(msg.ch) AS max_ch,
MAX(msg.math) AS max_ma
FROM msg
GROUP BY msg.sex;
– mysql查询子句之二group by分组查询(分组)
SELECT emp.deptnu,COUNT(*) from employee AS emp
GROUP BY emp.deptnu;
– 查询出每个部门对应的总人数
SELECT
emp.job,
count(*)
from employee AS emp
GROUP BY emp.deptnu,emp.job;
SELECT
emp.job,
COUNT(*)
from employee as emp
GROUP BY emp.job;
— 统计每个部门的平均sal
SELECT
emp.job,
AVG(emp.sal)
from employee AS emp
GROUP BY emp.job;
having—後面跟聚合函數
– mysql查询子句之三having条件查询(筛选)
SELECT
emp.job,
COUNT(*)
from employee AS emp
GROUP BY emp.job
HAVING emp.job='文员';
– 统计 >= 2的部门
SELECT
emp.deptnu,
emp.job,
count(*)
from employee AS emp
GROUP BY emp.deptnu,emp.job
HAVING count(*) >= 2;
SELECT
emp.deptnu,
emp.job,
count(*) AS totle
from employee AS emp
GROUP BY emp.deptnu,emp.job
HAVING totle >= 2;
order by(排序)
– mysql查询子句之四order by排序查询(排序)
– default 默認情況下是升序 ASC
SELECT * from employee ORDER BY sal ASC;
SELECT * from employee ORDER BY sal DESC;
– 統計部門人數
SELECT
emp.job,
COUNT(*) as totle
from employee AS emp
GROUP BY emp.job
HAVING totle
ORDER BY totle DESC;
– 統計每個部門的平均sal
SELECT
emp.job,
AVG(emp.sal) AS avg_sal
from employee AS emp
GROUP BY emp.job
ORDER BY avg_sal DESC;
select
deptnu,job,count(*) as 总数
from employee
group by deptnu,job
having 总数>=2
order by deptnu asc;
select
deptnu,
job,
count(*) as 总数
from employee
group by deptnu,job
having 总数>=2
order by deptnu;
limit n,m
– limit 分頁查詢
– limit n,m 中的 n=0,可以省略不寫
SELECT *
from employee
LIMIT 0,100;
EXISTS
– EXISTS
– exists型子查询后面是一个受限的select查询语句
– exists子查询,如果exists后的内层查询能查出数据,
– 则返回 TRUE 表示存在;为空则返回 FLASE则不存在。
– 分为俩种:exists跟 not exists
select 1 from employee where 1=1;
select * from 表名 a where exists (select 1 from 表名2 where 条件);
– 查询出公司有员工的部门的详细信息
SELECT * from dept;
SELECT * from employee;
SELECT
emp.ename AS 'emp-name',
dept.dname AS 'emp-dept',
dept.addr AS 'dept-add',
emp.sal AS 'emp-sal'
from dept,employee AS emp
WHERE dept.deptnu = emp.deptnu
ORDER BY emp.sal DESC;
SELECT *
from dept a
where EXISTS(
SELECT 1 from employee b where a.deptnu = b.deptnu
);
SELECT *
from dept dept
where NOT EXISTS(
SELECT 1
from employee AS emp
WHERE dept.deptnu = emp.deptnu
);
left join 和 right join
– 左連接查詢:
– left join 表名 on 条件
– 將左表中的數據全部查詢出來,
右表中的符合顯示,否則為null
– 列出部门名称和这些部门的员工信息,
同时列出那些没有的员工的部门
SELECT
emp.ename,
dp.dname,
emp.sal
from employee AS emp
LEFT JOIN dept AS dp
ON emp.deptnu = dp.deptnu
ORDER BY emp.sal DESC;
SELECT
emp.ename,
dp.dname,
emp.sal
FROM dept AS dp
LEFT JOIN employee AS emp
ON emp.deptnu = dp.deptnu
ORDER BY emp.sal DESC;
– 右外連接
– RIGHT JOIN on
SELECT
emp.ename,
dp.dname,
emp.sal
FROM dept AS dp
RIGHT JOIN employee AS emp
ON dp.deptnu = emp.deptnu;
SELECT
emp.ename,
dp.dname,
emp.sal
FROM employee AS emp
RIGHT JOIN dept AS dp
ON emp.deptnu = dp.deptnu;
內連接查詢和聯合查詢
联合查询
– 聯合查詢:多個查詢語句結合在一起
– (1)兩個select語句的查詢結果的“字段數”必須一致;
– (2)通常,也應該讓兩個查詢語句的字段類型具有一致性;
– (3)也可以聯合更多的查詢結果;
– (4)用到order by排序時,需要加上limit(加上最大條數就行),需要對子句用括號括起來
– :对销售员的工资从低到高排序,而文员的工资从高到低排序
SELECT
emp.ename,
emp.sal,
dp.dname
from employee AS emp,dept AS dp
WHERE (emp.job LIKE '%销售员%') AND (emp.deptnu = dp.deptnu)
ORDER BY emp.sal DESC;
SELECT
emp.ename,
emp.sal,
dp.dname
from employee AS emp,dept AS dp
WHERE (emp.job like '%文员%') AND (emp.deptnu = dp.deptnu)
ORDER BY emp.sal DESC;
(SELECT
emp.ename,
emp.sal,
emp.job,
dp.dname
from employee AS emp,dept AS dp
WHERE (emp.job LIKE '%销售员%') AND (emp.deptnu = dp.deptnu)
ORDER BY emp.sal
LIMIT 0,9999)
UNION(
SELECT
emp.ename,
emp.sal,
emp.job,
dp.dname
from employee AS emp,dept AS dp
WHERE (emp.job like '%文员%') AND (emp.deptnu = dp.deptnu)
ORDER BY emp.sal DESC
LIMIT 0,9999
)
内连接查询
– 內連接查詢和聯合查詢
– 内连接:获取两个表中字段匹配关系的记录
– 主要语法:INNER JOIN 表名 ON 条件;
– 想查出员工张飞的所在部门的地址
SELECT
emp.ename,
dp.dname,
dp.addr
FROM dept AS dp,employee AS emp
where (dp.deptnu = emp.deptnu) AND (emp.ename LIKE '%张飞%');
-- 主要语法:INNER JOIN 表名 ON 条件;
SELECT
emp.ename,
dp.dname,
dp.addr
FROM dept AS dp
INNER JOIN employee AS emp
ON (dp.deptnu = emp.deptnu) AND (emp.ename LIKE '%张飞%');
SELECT
emp.ename,
dp.dname,
dp.addr
FROM employee AS emp
INNER JOIN dept AS dp
ON (dp.deptnu = emp.deptnu) AND (emp.ename LIKE '%张飞%');