数据库三范式和SQL分类
三范式
三范式是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库。
- 第一范式:是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值(一个列中只能存储一个值)
- 第二范式:要求数据库表中的每个实例或行必须可以被惟一地区分(就是有主键)。
- 第三范式:要求一个数据库表中不包含已在其它表中已包含的非主键段信息。
SQL分类
数据查询语言(DQL:Data Query Language 常见)
其语句包括动词 SELECT
数据操作语言(DML:Data Manipulation Language 常见)
其语句包括动词 INSERT,UPDATE 和 DELETE。
数据定义语言(DDL)
数据操作语言(DML)
事务处理语言(TCL)
数据库控制语言(DCL)
指针控制语言(CCL)
单表查询
单表查询语法
SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名]]
FROM 表名称 [别名]
[WHERE 条件(S)]
[ORDER BY 字段 [ASC|DESC] [,字段 [ASC|DESC],…]];
消除重复
DISTINCT 关键字可以用于一列,也可以用于多列。
-- 5 查询有员工的部门和职位
SELECT DISTINCT DEPTNO,JOB FROM emp;
算术运算符
对 NUMBER 型数据可以使用算数操作符创建表达式(+ - * /);
对 DATE 型数据可以使用算数操作符创建表达式(+ -)。
过滤查询
使用 WHERE 做过滤查询注意:
-
字符串和日期要用单引号扩起来
-
数字类型直接书写
-
字符串是大小写不敏感的,日期值是格式大小写敏感的
-
字符串若要大小写敏感,需要添加 binary 关键字。
SELECT * FROM dept WHERE BINARY DNAME = 'sales'
比较运算符
=,!=,<>,>,>=,<,<=
BETWEEN … AND …:在两值之间,包含开头和结尾,是闭区间
IN:匹配列出的值,如:IN(1, 2, 3, 4)
LIKE :模糊查询,匹配字符串模式,必须使用通配符才有意义
匹配单个字符:_ 表示
匹配任意多个字符:% 表示
IS NULL:是否为空
空值判断
用NULL表示空,注意:
- 空值是指不可用、未分配的值,也就是没有值
- 空值不等于零或空格,也不表示空字符串
- 任意类型都可以支持空值
- 包括空值的任何算术表达式都等于空
- 使用函数 IFNULL(expr1, expr2),若 expr1 不是 NULL,IFNULL() 返回expr1,否则它返回expr2
逻辑运算符
AND:如果组合的条件都是 true,返回 true;
OR:如果组合的条件 之一是 true ,返回 true;
NOT:如果下面的条件是 false,返回 true。
优先级规则:比较运算符 > NOT > AND > OR。
结果排序
ORDER BY 子句出现在 SELECT 语句后执行;
ORDER BY 可以使用别名,但不能使用加了引号的别名或列明来排序,没有效果:
ASC:升序,缺省
DESC:降序
-- 28 查询所有员工信息,按照工资排序
SELECT * FROM emp ORDER BY SAL;
多表查询
因为需要查询的数据分散在多张表中,只有联合多张表才能查询出想要的数据。在mysql中多表查询会产生笛卡尔积,造成一些无意义的数据,要通过条件消除这些无意义的数据。
内连接查询
隐式:
SELECT 列名1,列名2,…
FROM 表名1,表名2,…
WHERE 消除笛卡尔积条件 AND …
显示:
SELECT 列名1,列名2,…
FROM 表名1 JOIN 表名2 ON 消除笛卡尔积条件
JOIN …
外连接查询
外连接查询,分为左外链接查询和右外链接查询。
左外连接查询,可以保证左边表里面的数据都查询出来,同理右外连接查询保证右面表的数据都可以被查出来。
SELECT 列名1,列名2,…
FROM 表名1 LEFT JOIN 表名2 ON 消除笛卡尔积条件
LEFT JOIN …
分组函数
函数分为
单行函数:将每条数据进行独立的计算,然后每条数据得到一条结果;
多行函数:多条数据同时计算,最终得到一条结果数据。也成为聚集函数、分组函数,主要用于完成一些统计功等等。
多行函数
COUNT():查询表中的数据记录;
AVG():求出平均值;
SUM():求和;
MAX():求出最大值;
MIN():求出最小值。
**注意:**统计函数忽略空值,可以使用 IFNULL, 因为是NULL不会影响汇总值,但会影响汇总数量;不能在where语句中使用分组函数。
分组查询
解决项目统计需求的问题, 做什么报表功能(柱状图,饼状图)。在MySQL使用GROUP BY来实现分组
SELECT 列名1, 列名2,…,统计函数(列名),…
FROM 表名
GROUP BY 分组列名1, 分组列名2,…
HAVING 分组之后的过滤条件
注意:
select 子句中出现列名要代表整体性,才合理
having 子句是对分组之后进行过滤, WHERE 是在 group by 之前的
单行函数
获取日期时间中某个段
DAY(date):获取日期中的天数,范围是从 1 到 31;
HOUR(time):返回 time 对应的小时数,范围是从 0 到 23;
MINUTE(time):返回 time 对应的分钟数,范围是从 0 到 59;
MONTH(date):返回 date 对应的月份,范围时从 1 到 12;
YEAR(date):返回 date 对应的年份,范围是从 1000 到 9999;
LAST_DAY(date):获取一个日期或日期时间值,返回该月最后一天对应的值。
日期转换为字符串
DATE_FORMAT(date, format):把日期转换为字符串。
format 中常见说明符如下(更多参见 MySQL 5.5 中文参考手册 549 页)
子查询
子查询指的就是在一个查询之中嵌套了其他的若干查询。
在使用select语句查询数据时,有时候会遇到这样的情况,在 where 查询条件中的限制条件不是一个确定的值,而是一个来自于另一个查询的结果(比如查询大于平均工资的员工)。
用得最多是子查询结果是单列单行(= > < >= <= <>),多行单列(IN)
注意子查询要用圆括号括起来, 子查询是在主查询之前执行
SELECT <select_list>
FROM table
WHERE expr operator (SELECt select_list FROM table)