基础函数
- lower(列名)
- upper(列名)
- length(列名)
- substr(列名,开始位置,截取个数)
- 下标从1开始
- concat(m,n)
- n拼接到m后面
- replace(x,y,z)
- 把x里面的y字符替换为z的内容
- ROUND(聚合函数,精确到小数点后几位)
- 对数据四舍五入
- ceil(列名)
- 向上取整
- floor(列名)
- 向下取整
- uuid()
- 返回一个字符串,返回uuid:a08528ca-741c-11ea-a9a1-005056c00001
- now()
- 显示当前系统时间 年月日时分秒
- year()
- select year(now());
- month()
- select month(now());
- day()
- select day(now());
- hour()
- select hour(now());
- minute()
- select minute(now());
- second()
- select second(now());
- curdate()
- 当前系统时间,年月日
- curtime()
- 当前系统时间,时分秒
转义 \
基础查询
- 数字型结果相加 +
- distinct
- 放在列名以前,去除重复
- where
- select 字段… from 表名 where 条件
- where后面多个条件用 and or
- like
- % 表示0个或者多个字符
- _ 表示一个字符
- null
- 判断null用is ,not is
- is null
- not is null
- null+任何值都为 null
- 处理
- ifnull(m,n)用来处理m为null,为null就用n替换m
- 处理
- 判断null用is ,not is
- between and
- 包含边界的值
- limit
- limit n
- 获取前n条记录
- limit m,n
- 从第m条记录开始,显示n个记录,第一条记录下标为0
- 分页查询
- 如果要显示的页数是page,每条显示的记录是size
- limit (page-1)*size , size
- 如果要显示的页数是page,每条显示的记录是size
- limit n
- 排序:order by 列名
- asc 默认asc升序
- desc 降序
- 聚合函数
- count()统计记录数
- count(*)和count(1)
- 不会过滤null
- count(字段)
- 过滤null
- count(*)和count(1)
- max()
- min()
- avg()
- avg()
- count()统计记录数
- 分组函数
- group by 分组列名
- select后面跟分组列名 和 函数
- group by having…
- having 对分组之后的结果筛选
- group by 分组列名
子查询(嵌套查询)
- 在查询SQL语句中含有另外查询
选出地址是在二区的人员全部信息
1、选出二区的部门编号
2、选出人员所有信息,在上面部门编号里的
SELECT * FROM emp WHERE deptno IN ( SELECT deptno FROM dept WHERE loc = ‘二区’ ); #多行子查询
<a name="spjqi"></a>
## 表关联关系 association
- 一对一
- 一对多(多对一)
- 多对多
在描述表关系时,有一个主表有一个从表,如下图,蓝色箭头表示一对多关系,其中商品分类表是主表(箭头所在),商品表是从表(指向发起者),从表依附于主表,从表的外键必须和主表的主键保持一致。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/358364/1609331327337-e370c790-e1ee-4338-9573-5fdadfb28dd4.png#align=left&display=inline&height=217&margin=%5Bobject%20Object%5D&name=image.png&originHeight=217&originWidth=461&size=38775&status=done&style=none&width=461)
- 在实际开发中
- 软件的生命周期:
1. 需求调研
2. 需求评审(专家)
3. 概要设计(框架)
4. 详细设计(伪代码) PDM 表设计
5. 编码
6. 测试
7. 部署客户服务器上
8. 用户评审
9. 正式上线运行
10. 维护期
11. 项目结束
<a name="HA9Al"></a>
## 多表查询
**(多表联查中表中字段相同就用表名. 来区别字段)**
<a name="7QBtt"></a>
### 笛卡尔积
- 相当于是表与表做乘积,笛卡尔积记录数是 每张表记录数的 乘积
- 禁止3张表以上的联查的原因
- 表小还好,表大了多表联查时,底层实现笛卡尔积,构建一个大大结果集,放在内存中,占用内存
- 构建过程非常浪费时间,数据量非常大(mysql单表千万条,oracle单表支持上亿)
- 怎么去解决不让我很多表联查
- 构建中间结果集时,尽量让结果集小点,提前筛选数据
- 不使用多表查询,查出一个表的需要的信息,作为其它表的条件,分而治之,多次查询
<a name="Iwc0l"></a>
### where硬查
```sql
#编号为200的员工的姓名和所在部门名称
SELECT ename,dname FROM emp,dept
WHERE empno = 200 AND emp.deptno = dept.deptno;
内连接(inner join)
- 选出两个表中匹配的数据
语法
左边的表的所有记录都出现,没有匹配,其数据null
- 语法
简写
SELECT d.deptno,e.deptno,dname,ename FROM dept d LEFT JOIN emp e ON e.deptno = d.deptno
<a name="PDVkr"></a>
### 右[外]连接(right join)
- 右边的表的所有记录都出现,没有匹配,其数据null
- 语法
- ![image.png](https://cdn.nlark.com/yuque/0/2020/png/358364/1609333242115-9cc88412-b408-4be5-9bd4-a4c532eea447.png#align=left&display=inline&height=207&margin=%5Bobject%20Object%5D&name=image.png&originHeight=207&originWidth=212&size=39996&status=done&style=none&width=212)
```sql
#右连接,后面表的记录全部出现,前面表有数据匹配就匹配,如果前面的表没有相对应的数据就补null
SELECT d.deptno,e.deptno,dname,ename
FROM
(SELECT deptno,dname FROM dept) d
RIGHT JOIN
(SELECT deptno,ename FROM emp) e
ON d.deptno = e.deptno
#简写
SELECT d.deptno,e.deptno,dname,ename
FROM
dept d
RIGHT JOIN
emp e
ON d.deptno = e.deptno
- 当两表的数据都匹配时
- inner join = left join = right join