最近经历了一次跳槽,在找工作的过程中,我发现笔试题中除了考java相关的知识点,还会考数据库相关的知识点,如果基本的知识点不过关,那么整个面试过程会很被鄙视,sql如果长久不用,或者不总结又容易遗忘,所以我写下这篇文章,希望对数据库相关的知识点做一个梳理总结,以备不时之需
MySql中语句的执行顺序
注意: from后面的表关联,是自右向左解析的,而where条件的解析顺序是自下而上的,也就是说,在写SQL的时候,尽量把数据量小的表放在最右边来进行关联(用小表去匹配大表),而把能筛选出小数据量的条件 放在where语句的最左边,使用count(列名)当某列出现null值的时候,count(*)仍然会计算,但是count(列名)不会。
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`DEPTNO` int(2) NOT NULL,
`DNAME` varchar(14) DEFAULT NULL,
`LOC` varchar(13) DEFAULT NULL,
PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES ('40', 'OPERATIONS', 'BOSTON');
-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`EMPNO` int(4) NOT NULL,
`ENAME` varchar(10) DEFAULT NULL,
`JOB` varchar(9) DEFAULT NULL,
`MGR` int(4) DEFAULT NULL,
`HIREDATE` date DEFAULT NULL,
`SAL` int(7) DEFAULT NULL,
`COMM` int(7) DEFAULT NULL,
`DEPTNO` int(2) DEFAULT NULL,
PRIMARY KEY (`EMPNO`),
KEY `FK_DEPTNO` (`DEPTNO`),
CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 将多列值作为一列返回
SELECT concat(ename,' works AS A ', job) AS msg FROM emp WHERE DEPTNO = 10;
-- 在select语句中使用条件逻辑
SELECT ename,sal, CASE WHEN sal <= 2000 THEN 'UNDERPAID'
WHEN sal >= 4000 THEN 'OVERPAID' ELSE 'OK' END AS STATUS
FROM emp;
-- 查找空值
SELECT * from emp where COMM is null;
-- 将空值准换为实际值
SELECT COALESCE(comm,0) FROM emp;
SELECT (CASE WHEN comm is null then 0 else comm end) my_comm FROM emp;
-- 按模式搜索
SELECT ename,job from emp where DEPTNO in (10,20)
-- 返回名字中有"I"或职务中带有"ER"的员工
-- 百分号%可以匹配任何字符串序列,下划线_则匹配单个字符,"%I%",表示不管I在什么位置,只要存在就会返回,%在前,
-- 表示返回以I结尾的字符串,反之则是以I开头的字符串
SELECT ename,job FROM emp WHERE DEPTNO in(10,20) and (ename LIKE '%I%' OR JOB LIKE '%ER')
-- 排序,ORDER BY中优先次序是从左到右,一般情况下都可以按照select列表中没有的列来排序,
-- 但是必须显示地给出排序的列名,如果在查询中使用了group BY或distinct,则不能按照select列表中灭有的列来排序
SELECT EMPNO,DEPTNO,SAL,ENAME,JOB FROM emp ORDER BY DEPTNO,SAL DESC
-- 按子串排序,按照职位字段的最后两个字符排序
SELECT ename,job FROM emp ORDER BY substr(job,LENGTH(job)-2)
-- 根据数据项的键排序
SELECT ename,sal,job,comm FROM emp ORDER BY CASE WHEN job = 'salesman' THEN comm else sal END
-- 记录集的叠加,union all 将多个来源组合起来,放到一个结果集中,所有select列表中项目数和对
-- 应的项目的数据类型必须要匹配,UNION ALL将包含重复的项目,而union可去掉重复项,但是为了去重而进行排序操作,在处理大结果集时不要用union
SELECT ename AS ename_and_dname,deptno FROM emp WHERE DEPTNO = 10 UNION ALL
SELECT '----------',NULL FROM sc UNION ALL SELECT dname,deptno
FROM dept
-- 两表中查找共同的行
CREATE view v AS SELECT e.empno,e.ename,e.job,e.sal,e.deptno FROM emp e;
SELECT deptno FROM dept WHERE in (50,10,null)
SELECT job,COUNT(hiredate) FROM emp GROUP BY job ORDER BY hiredate
group by 对数据进行分组; having 对已经分组的数据进行过滤的条件;
select 列a,聚合函数(聚合函数规范) from 表明 where 过滤条件 group by 列a
group by 字句也和where条件语句结合在一起使用。当结合在一起时,where在前,group by 在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组。
使用having字句对分组后的结果进行筛选,语法和where差不多:having 条件表达式
需要注意having和where的用法区别:
1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
2.where肯定在group by 之前,即也在having之前。
3.where后的条件表达式里不允许使用聚合函数,而having可以。
当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:
1.执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by分组,返回第2个结果集。
4.针对第2个结集执行having xx进行筛选,返回第3个结果集。
3.针对第3个结果集中的每1组数据执行select xx,有几组就执行几次,返回第4个结果集。
5.针对第4个结果集排序。
这次只是做了一个简单的MySQL基础知识点的复习,肯定还有很多知识点没有提到的,后续我会继续学习和总结这方面的知识点,学习就是一个不断积累的过程.