创建A表和B表
CREATE TABLE `a` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
CREATE TABLE `b` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`A_id` int(11) DEFAULT NULL,
`job` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `a` VALUES ('1', '小王');
INSERT INTO `a` VALUES ('2', '小张');
INSERT INTO `a` VALUES ('3', '小赵');
INSERT INTO `b` VALUES ('1', '2', '员工');
INSERT INTO `b` VALUES ('2', '4', '经理');
1.连接
1.1左连接
定义:是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全称为左外连接,是外连接的一种。
(左边的表不加限制)
SELECT a.name,B.job from A LEFT JOIN B ON A.id=B.A_id;
1.2右连接
右连接的定义,是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表所有的查询信息列出,而左表只列出ON后条件与右表满足的部分。右连接全称为右外连接,是外连接的一种。
(右边的表不加限制)
SELECT a.name,b.job from A RIGHT JOIN B ON A.id=B.A_id;
1.3内连接
内链接:使用比较运算符根据每个表共有的列的值匹配两个表中的行。
(只有2张表匹配的行才能显示)
SELECT a.name,b.job from A inner JOIN B ON A.id=B.A_id;
1.4全连接
返回左右表中所有的记录和左右表中连接字段相等的记录。
mysql不支持全连接,可以用“UNION”将左连接和右连接联合在一块就是全连接。
(左右2张表都不加限制)
##不可用
SELECT a.name,b.job from A full JOIN B ON A.id=B.A_id;
SELECT a.name,B.job from A LEFT JOIN B ON A.id=B.A_id
UNION
SELECT a.name,b.job from A RIGHT JOIN B ON A.id=B.A_id;
2.聚合函数
准备数据
CREATE TABLE `emp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`dept` varchar(50) DEFAULT NULL,
`job` varchar(50) DEFAULT NULL,
`sal` double DEFAULT NULL,
`bonus` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('1', '王振华', '男', '1995-03-25', '市场部', '业务员', '1800', '400');
INSERT INTO `emp` VALUES ('2', '齐鸿哲', '男', '1994-04-06', '市场部', '业务员', '2500', '700');
INSERT INTO `emp` VALUES ('3', '刘小蕊', '女', '1996-06-14', '市场部', '业务员', '1400', '400');
INSERT INTO `emp` VALUES ('4', '陈晓山', '男', '1991-05-18', '市场部', '总经理', '4500', '600');
INSERT INTO `emp` VALUES ('5', '刘昱江', '男', '1993-11-18', '市场部', '业务员', '2600', '600');
INSERT INTO `emp` VALUES ('6', '王雪卉', '女', '1998-07-18', '行政部', '业务员', '3700', '700');
INSERT INTO `emp` VALUES ('7', '王学智', '男', '1995-08-18', '行政部', '总经理', '4850', '500');
INSERT INTO `emp` VALUES ('8', '范君昊', '男', '1999-09-18', '行政部', '业务员', '3200', '700');
INSERT INTO `emp` VALUES ('9', '刘辰阳', '男', '1990-10-18', '行政部', '业务员', '2700', '500');
INSERT INTO `emp` VALUES ('10', '韩运鹏', '男', '1980-12-18', null, 'CEO', '5000', null);
INSERT INTO `emp` VALUES ('11', '董运良', '男', '1988-02-05', '市场部', '业务员', '3200', '300');
INSERT INTO `emp` VALUES ('12', '张永昌', '男', '1989-01-11', '市场部', '业务员', '4200', '500');
2.1AVG
求平均工资+奖金
SELECT avg(sal+bonus) as 平均工资 from emp;
2.2COUNT
统计工资有多少人
SELECT count(*) from emp;
2.3MAX
求出最高工资
SELECT MAX(sal) from emp;
2.4MIN
求出最低奖金
SELECT min(bonus) from emp;
2.5SUM
求所有人员的工资加奖金
SELECT SUM(sal+bonus) from emp;
3.分组
根据部门进行分组
select dept from emp GROUP BY dept;
统记一下公司的男性和女性的收入总和
select gender,sum(sal) from emp GROUP BY gender;
统计一下公司男性和女性的数量
SELECT gender,count(*) from emp GROUP BY gender;