小白学习Mysql之路-day01

小白学习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 '%张飞%');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值