基础函数

  • 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
  • between and
    • 包含边界的值
  • limit
    • limit n
      • 获取前n条记录
    • limit m,n
      • 从第m条记录开始,显示n个记录,第一条记录下标为0
    • 分页查询
      • 如果要显示的页数是page,每条显示的记录是size
        • limit (page-1)*size , size
  • 排序:order by 列名
    • asc 默认asc升序
    • desc 降序
  • 聚合函数
    • count()统计记录数
      • count(*)和count(1)
        • 不会过滤null
      • count(字段)
        • 过滤null
    • max()
    • min()
    • avg()
    • avg()
  • 分组函数
    • group by 分组列名
      • select后面跟分组列名 和 函数
      • group by having…
        • having 对分组之后的结果筛选

子查询(嵌套查询)

  • 在查询SQL语句中含有另外查询
    • 子查询返回一个值,单行子查询
    • 子查询返回多个值,多条记录,多行子查询 ```sql

      选出在tony所在部门里的人的全部信息

      1、选出tony所在的部门编号

      2、选出所有的人员信息 在上面部门编号里的

      SELECT * FROM emp WHERE deptno = ( SELECT deptno FROM emp WHERE ename = ‘tony’ ); #单行子查询

选出地址是在二区的人员全部信息

1、选出二区的部门编号

2、选出人员所有信息,在上面部门编号里的

SELECT * FROM emp WHERE deptno IN ( SELECT deptno FROM dept WHERE loc = ‘二区’ ); #多行子查询

  1. <a name="spjqi"></a>
  2. ## 表关联关系 association
  3. - 一对一
  4. - 一对多(多对一)
  5. - 多对多
  6. 在描述表关系时,有一个主表有一个从表,如下图,蓝色箭头表示一对多关系,其中商品分类表是主表(箭头所在),商品表是从表(指向发起者),从表依附于主表,从表的外键必须和主表的主键保持一致。<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)
  7. - 在实际开发中
  8. - 软件的生命周期:
  9. 1. 需求调研
  10. 2. 需求评审(专家)
  11. 3. 概要设计(框架)
  12. 4. 详细设计(伪代码) PDM 表设计
  13. 5. 编码
  14. 6. 测试
  15. 7. 部署客户服务器上
  16. 8. 用户评审
  17. 9. 正式上线运行
  18. 10. 维护期
  19. 11. 项目结束
  20. <a name="HA9Al"></a>
  21. ## 多表查询
  22. **(多表联查中表中字段相同就用表名. 来区别字段)**
  23. <a name="7QBtt"></a>
  24. ### 笛卡尔积
  25. - 相当于是表与表做乘积,笛卡尔积记录数是 每张表记录数的 乘积
  26. - 禁止3张表以上的联查的原因
  27. - 表小还好,表大了多表联查时,底层实现笛卡尔积,构建一个大大结果集,放在内存中,占用内存
  28. - 构建过程非常浪费时间,数据量非常大(mysql单表千万条,oracle单表支持上亿)
  29. - 怎么去解决不让我很多表联查
  30. - 构建中间结果集时,尽量让结果集小点,提前筛选数据
  31. - 不使用多表查询,查出一个表的需要的信息,作为其它表的条件,分而治之,多次查询
  32. <a name="Iwc0l"></a>
  33. ### where硬查
  34. ```sql
  35. #编号为200的员工的姓名和所在部门名称
  36. SELECT ename,dname FROM emp,dept
  37. WHERE empno = 200 AND emp.deptno = dept.deptno;

内连接(inner join)

  • 选出两个表中匹配的数据
  • 语法

    • image.png
      1. #内连接,前后表数据全部通过on后面条件进行匹配,匹配成功就显示出来
      2. SELECT ename,dept.deptno,dname
      3. FROM dept
      4. INNER JOIN
      5. emp
      6. ON dept.deptno = emp.deptno

      左[外]连接(left join)

  • 左边的表的所有记录都出现,没有匹配,其数据null

  • 语法
    • image.png ```sql

      左连接,前面表的记录全部出现,后面表有数据匹配就匹配,如果后面的表没有相对应的数据就补null

      SELECT d.deptno,e.deptno,dname,ename FROM (SELECT deptno,dname FROM dept) d LEFT JOIN (SELECT deptno,ename FROM emp) e ON e.deptno = d.deptno

简写

SELECT d.deptno,e.deptno,dname,ename FROM dept d LEFT JOIN emp e ON e.deptno = d.deptno

  1. <a name="PDVkr"></a>
  2. ### 右[外]连接(right join)
  3. - 右边的表的所有记录都出现,没有匹配,其数据null
  4. - 语法
  5. - ![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)
  6. ```sql
  7. #右连接,后面表的记录全部出现,前面表有数据匹配就匹配,如果前面的表没有相对应的数据就补null
  8. SELECT d.deptno,e.deptno,dname,ename
  9. FROM
  10. (SELECT deptno,dname FROM dept) d
  11. RIGHT JOIN
  12. (SELECT deptno,ename FROM emp) e
  13. ON d.deptno = e.deptno
  14. #简写
  15. SELECT d.deptno,e.deptno,dname,ename
  16. FROM
  17. dept d
  18. RIGHT JOIN
  19. emp e
  20. ON d.deptno = e.deptno
  • 当两表的数据都匹配时
    • inner join = left join = right join