基础函数
- 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 />- 在实际开发中- 软件的生命周期: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,deptWHERE 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- 语法- ```sql#右连接,后面表的记录全部出现,前面表有数据匹配就匹配,如果前面的表没有相对应的数据就补nullSELECT d.deptno,e.deptno,dname,enameFROM(SELECT deptno,dname FROM dept) dRIGHT JOIN(SELECT deptno,ename FROM emp) eON d.deptno = e.deptno#简写SELECT d.deptno,e.deptno,dname,enameFROMdept dRIGHT JOINemp eON d.deptno = e.deptno
- 当两表的数据都匹配时
- inner join = left join = right join

```sql