MySql语法简单总结

一、背景:

最近经历了一次跳槽,在找工作的过程中,我发现笔试题中除了考java相关的知识点,还会考数据库相关的知识点,如果基本的知识点不过关,那么整个面试过程会很被鄙视,sql如果长久不用,或者不总结又容易遗忘,所以我写下这篇文章,希望对数据库相关的知识点做一个梳理总结,以备不时之需

MySql中语句的执行顺序

  1. from  
  2. on  
  3. join  
  4. where  
  5. group by  
  6. having  
  7. select  
  8. distinct  
  9. union  
  10. order by  

注意: 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 的理解

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基础知识点的复习,肯定还有很多知识点没有提到的,后续我会继续学习和总结这方面的知识点,学习就是一个不断积累的过程.

你可能感兴趣的:(学习笔记,数据库,mysql)