浅谈mysql多表练习题经验总结
一、聚合函数不可以与其他字段一起使用比如:name,因为name不排序,默认选择第一个。分开使用单独求出 max的值,可用 in =
错误场景一:Select name , sex ,max(age) from emp ;
错误原因:name和sex 默认去第一行
错误场景二:Select name , sex ,max(age) from emp group sex;
错误原因:name 默认去第一行,sex ,max(age)字段匹配
正确场景三:
Select sex ,max(age) from emp group sex;
或
Select max(age) from emp group sex;
二、取最大值或最小值时 使用max或min命令。也可以order by 排序asc,或desc ,得到第一行为最大或最小的, 然后使用limit命令,取第一行
三、注意区别 内连接 左连接 右连接 的内容不一样
根据实际情况:
场景一:左链接
显示部门表的所有最高工资
Select dept_name,max(incoming) from dept left join emp on dept1=dept2 gtoup by dept_name;
如果使用内连接,我们的104,行政部门就不显示
四、Group by 条件 后面可以接 order by 表示 分组后排序 也可以接 having
五、having 后面可以直接使用聚合函数
场景一:
SELECT
dept_name from dept LEFT JOIN emp on dept.dept1=emp.dept2 GROUP BY dept_name HAVING COUNT(dept2)>1
六、括号括起来的语句必须可执行,当做临时表运用
1. SELECT dept_name from
(SELECT count(name) b,dept_name,name from emp right JOIN dept on dept.dept1=emp.dept2 GROUP BY dept_name) as a where b>1;
七、聚合函数count(name)再次使用时要取别名
SELECT SUM(incoming) as a,dept_name FROM emp INNER JOIN dept ON emp.dept2 = dept.dept1 GROUP BY dept_name;
八、每一个表都可以取别名 ,在form后面用()括起来,
()括号中可以是单表,多表,已经筛选出来的表;
场景一:
固定格式:
SELECT 需要展示的字段 FROM (SELECT * FROM )a包含全部字段的联合表,并进行分组以及排序将联合表
WHERE
条件字段
九、数据库中字符一定要加引号,末尾一定要加分号
十、找出最低收入的数据根据销售部,但是得到数以后再去两个表的合表中找对应的数据,还要加上销售部,让数据准确无误;
场景:找出销售部收入最低的员工的入职时间;
select woektime_start from emp,dept where dept.dept1=emp.dept2 and
incoming in (select min(incoming) from emp where dept2=(select dept1 from dept where dept_name="销售")) and dept_name ="销售" ;
注意:一般同学就根据筛选的数去匹配出来,有误差,如果有好几个相同工资的数据就不准确
建表语句:
#建表
CREATE table dept1(dept1 VARCHAR(6),dept_name VARCHAR(20));
INSERT into dept VALUES ('101','财务');
-- INSERT into dept VALUES ('102','销售');
-- INSERT into dept VALUES ('103','IT技术');
-- INSERT into dept VALUES ('104','行政');
-- INSERT into dept VALUES ('104','销售');
CREATE table emp (sid VARCHAR(20),name VARCHAR(20),age TINYINT(2),woektime_start VARCHAR(10),incoming SMALLINT(10),dept2 VARCHAR(6));
insert into emp VALUES ('1789','张三',35,'1980/1/1',4000,'101');
insert into emp VALUES ('1674','李四',32,'1983/4/1',3500,'101');
insert into emp VALUES ('1776','王五',24,'1990/7/1',2000,'101');
insert into emp VALUES ('1568','赵六',57,'1970/10/11',7500,'102');
insert into emp VALUES ('1564','荣七',64,'1963/10/11',8500,'102');
insert into emp VALUES ('1879','牛八',55,'1971/10/20',7300,'103');