MySql与Oracle语法上的差异
1、mysql 查询条件不区分大小写 例:
SELECT *FROM EMPLOYEESWHENE LAST NAME 'King';
可以查询出Name='king'、='KING'的数据,Oracle是区分大小写的,只能查出name=‘King’的。
2、分页方式不一样,mysql使用limit分页,oracle 用rownum加子查询进行分页。
笛卡尔积怎么产生的?
集合A、集合B 组合的所有可能,组合的个数是两个集合个数的乘积。以前经常用,但搞不清这个概念是什么。
1、省略多表连接条件(或关联条件)
2、连接条件无效
3、所有表中的所有行互相连接
外连接分类
1、左外连接
左边的表全部数据,右边展示满足条件的数据。
2、右外连接
右边的表数据全部要,左边展示满足条件的数据。
3、满外连接
mysql不支持FULL OUTER JOIN,UNION 和UNIONALL的使用
#UNION:会执行去重操作
# UNION ALL:不会执行去重操作
七种join的实现
两种SQL函数
1、单行函数:只对一行进行变换,每行返回一个结果
进制转换函数比较少用:BIN(10),HEX(10),OCT(10),CONV(10,10,8)、字符串函数
2、多行函数:
count(*)计算指定字段在查询结果的个数、方差、标准差、中位数 用得很少。
官网查询函数帮助文档MySQL :: MySQL 8.0 参考手册 :: 14 个函数和运算符
HAVING的使用
1、 如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
2、HAVING 必须声明在GROUP BY的后面
我单知道 having count(*)>2 的用法,其他没用过。
SELEcT department id,MAX(salary)
FROM employees
GROUP BY department idHAVING MAX(salary)>10000;
多行子查询条件不止IN
除了In 关键字 还有ANY、ALL 可用
#返回其它job id中比job id为'IT PROG'部门任一工资低的员工的员工号、#姓名、job id 以及salary
SELECT employee id,last name,job id,salary from employees
WHERE job id <> 'IT_PROG'
AND salary < ANY( SELECT salary FROM employees WHERE job_id = 'IT_PROG');
#返回其它job id中比job id为'IT PROG'部门所有工资低的员工的员工号、#姓名、job id 以及salary
select department_id from employees GROUP BY department_id having avg(salary))<= all
(SELECT AVG(salary) avg_sal from employees GROUP BY department_id);
关联子查询案例
#题目:查询员工中工资大于本部门平均工资的员工的last name,salary和其department id
SELECT last name,salary,department id from employees el
WHERE salary > (SELECT AVG(salary) from employees e2 WHERE department id=el.`department_id`);