MySQL入门(四)

distinct:去重

  1. mysql>:
  2. create table t1(
  3. id int,
  4. x int,
  5. y int
  6. );
  7. mysql>: insert into t1 values(1, 1, 1), (2, 1, 2), (3, 2, 2), (4, 2, 2);
  8. mysql>: select distinct * from t1; # 全部数据
  9. mysql>: select distinct x, y from t1; # 结果 1,1 1,2 2,2
  10. mysql>: select distinct y from t1; # 结果 1 2
  11. # 总结:distinct对参与查询的所有字段,整体去重(所查的全部字段的值都相同,才认为是重复数据)

准备数据


  1. CREATE TABLE `emp` (
  2. `id` int(0) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(10) NOT NULL,
  4. `gender` enum('男','女','未知') NULL DEFAULT '未知',
  5. `age` int(0) NULL DEFAULT 0,
  6. `salary` float NULL DEFAULT 0,
  7. `area` varchar(20) NULL DEFAULT '中国',
  8. `port` varchar(20) DEFAULT '未知',
  9. `dep` varchar(20),
  10. PRIMARY KEY (`id`)
  11. );
  12. INSERT INTO `emp` VALUES
  13. (1, 'yangsir', '男', 42, 10.5, '上海', '浦东', '教职部'),
  14. (2, 'engo', '男', 38, 9.4, '山东', '济南', '教学部'),
  15. (3, 'jerry', '女', 30, 3.0, '江苏', '张家港', '教学部'),
  16. (4, 'tank', '女', 28, 2.4, '广州', '广东', '教学部'),
  17. (5, 'jiboy', '男', 28, 2.4, '江苏', '苏州', '教学部'),
  18. (6, 'zero', '男', 18, 8.8, '中国', '黄浦', '咨询部'),
  19. (7, 'owen', '男', 18, 8.8, '安徽', '宣城', '教学部'),
  20. (8, 'jason', '男', 28, 9.8, '安徽', '巢湖', '教学部'),
  21. (9, 'ying', '女', 36, 1.2, '安徽', '芜湖', '咨询部'),
  22. (10, 'kevin', '男', 36, 5.8, '山东', '济南', '教学部'),
  23. (11, 'monkey', '女', 28, 1.2, '山东', '青岛', '教职部'),
  24. (12, 'san', '男', 30, 9.0, '上海', '浦东', '咨询部'),
  25. (13, 'san1', '男', 30, 6.0, '上海', '浦东', '咨询部'),
  26. (14, 'san2', '男', 30, 6.0, '上海', '浦西', '教学部'),
  27. (15, 'ruakei', '女', 67, 2.501, '上海', '陆家嘴', '教学部');

常用函数

  1. """
  2. 拼接:concat() | concat_ws()
  3. 大小写:upper() | lower()
  4. 浮点型操作:ceil() | floor() | round()
  5. 整型:可以直接运算
  6. """
  7. mysql>: select name,area,port from emp;
  8. mysql>: select name as 姓名, concat(area,'-',port) 地址 from emp; # 上海-浦东
  9. mysql>: select name as 姓名, concat_ws('-',area,port,dep) 信息 from emp; # 上海-浦东-教职部
  10. mysql>: select upper(name) 姓名大写,lower(name) 姓名小写 from emp;
  11. mysql>: select id,salary,ceil(salary)上薪资,floor(salary)下薪资,round(salary)入薪资 from emp;
  12. mysql>: select name 姓名, age 旧年龄, age+1 新年龄 from emp;

条件:where

  1. # 多条件协调操作导入:where 奇数 [group by 部门 having 平均薪资] order by [平均]薪资 limit 1
  2. mysql>: select * from emp where id<5 limit 1; # 正常
  3. mysql>: select * from emp limit 1 where id<5; # 异常,条件乱序
  4. # 判断规则
  5. """
  6. 比较符合:> | < | >= | <= | = | !=
  7. 区间符合:between 开始 and 结束 | in(自定义容器)
  8. 逻辑符合:and | or | not
  9. 相似符合:like _|%
  10. 正则符合:regexp 正则语法
  11. """
  12. mysql>: select * from emp where salary>5;
  13. mysql>: select * from emp where id%2=0;
  14. mysql>: select * from emp where salary between 6 and 9;
  15. mysql>: select * from emp where id in(1, 3, 7, 20);
  16. # _o 某o | __o 某某o | _o% 某o* (*是0~n个任意字符) | %o% *o*
  17. mysql>: select * from emp where name like '%o%';
  18. mysql>: select * from emp where name like '_o%';
  19. mysql>: select * from emp where name like '___o%';
  20. # sql只支持部分正则语法
  21. mysql>: select * from emp where name regexp '.*\d'; # 不支持\d代表数字,认为\d就是普通字符串
  22. mysql>: select * from emp where name regexp '.*[0-9]'; # 支持[]语法

分组与筛选:group by | having

where与having

  1. # 表象:在没有分组的情况下,where与having结果相同
  2. # 重点:having可以对 聚合结果 进行筛选
  3. mysql>: select * from emp where salary > 5;
  4. mysql>: select * from emp having salary > 5;
  5. mysql>: select * from emp where id in (5, 10, 15, 20);
  6. mysql>: select * from emp having id in (5, 10, 15, 20);

聚合函数

  1. """
  2. max():最大值
  3. min():最小值
  4. avg():平均值
  5. sum():和
  6. count():记数
  7. group_concat():组内字段拼接,用来查看组内其他字段
  8. """

分组查询 group by

  1. # 修改my.ini配置重启mysql服务
  2. sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  3. # 在sql_mode没有 ONLY_FULL_GROUP_BY 限制下,可以执行,但结果没有意义
  4. # 有 ONLY_FULL_GROUP_BY 限制,报错
  5. mysql>: select * from emp group by dep;
  6. # 分组后,表中数据考虑范围就不是 单条记录,因为每个分组都包含了多条记录,参照分组字段,对每个分组中的 多条记录 统一处理
  7. # eg: 按部门分组,每个部门都有哪些人、最高的薪资、最低的薪资、平均薪资、组里一共有多少人
  8. # 将多条数据统一处理,这种方式就叫 聚合
  9. # 每个部门都有哪些人、最高的薪资、最低的薪资、平均薪资 都称之为 聚合结果 - 聚合函数操作的结果
  10. # 注:参与分组的字段,也归于 聚合结果
  11. mysql>:
  12. select
  13. dep 部门,
  14. group_concat(name) 成员,
  15. max(salary) 最高薪资,
  16. min(salary) 最低薪资,
  17. avg(salary) 平均薪资,
  18. sum(salary) 总薪资,
  19. count(gender) 人数
  20. from emp group by dep;
  21. mysql>: select
  22. dep 部门,
  23. max(age) 最高年龄
  24. from emp group by dep;
  25. # 总结:分组后,查询条件只能为 分组字段 和 聚合函数操作的聚合结果

分组后的having

  1. mysql>:
  2. select
  3. dep 部门,
  4. group_concat(name) 成员,
  5. max(salary) 最高薪资,
  6. min(salary) 最低薪资,
  7. avg(salary) 平均薪资,
  8. sum(salary) 总薪资,
  9. count(gender) 人数
  10. from emp group by dep;
  11. # 最低薪资小于2
  12. mysql>:
  13. select
  14. dep 部门,
  15. group_concat(name) 成员,
  16. max(salary) 最高薪资,
  17. min(salary) 最低薪资,
  18. avg(salary) 平均薪资,
  19. sum(salary) 总薪资,
  20. count(gender) 人数
  21. from emp group by dep having min(salary)<2;
  22. # having可以对 聚合结果 再进行筛选,where不可以

排序

  1. # order by 主排序字段 [asc|desc], 次排序字段1 [asc|desc], ...次排序字段n [asc|desc]

限制 limit

  1. # 语法:limit 条数 | limit 偏移量,条数
  2. mysql>: select name, salary from emp where salary<8 order by salary desc limit 1;
  3. mysql>: select * from emp limit 5,3; # 先偏移5条满足条件的记录,再查询3条

连表查询

笛卡尔积

  1. # 笛卡尔积: 集合 X{a, b} * Y{o, p, q} => Z{{a, o}, {a, p}, {a, q}, {b, o}, {b, p}, {b, q}}
  2. mysql>: select * from emp, dep;
  3. # 总结:是两张表 记录的所有排列组合,数据没有利用价值

内连接:inner join on

  1. # 关键字:inner join on
  2. # 语法:from A表 inner join B表 on A表.关联字段=B表.关联字段
  3. mysql>:
  4. select
  5. emp.id,emp.name,salary,dep.name,work
  6. from emp inner join dep on emp.dep_id = dep.id
  7. order by emp.id;
  8. # 总结:只保留两个表有关联的数据

左连接:left join on

  1. # 关键字:left join on
  2. # 语法:from 左表 left join 右表 on 左表.关联字段=右表.关联字段
  3. mysql>:
  4. select
  5. emp.id,emp.name,salary,dep.name,work
  6. from emp left join dep on emp.dep_id = dep.id
  7. order by emp.id;
  8. # 总结:保留左表的全部数据,右表有对应数据直接连表显示,没有对应关系空填充

右连接:right join on

  1. # 关键字:right join on
  2. # 语法:from A表 right join B表 on A表.关联字段=B表关联字段
  3. mysql>:
  4. select
  5. emp.id,emp.name,salary,dep.name,work
  6. from emp right join dep on emp.dep_id = dep.id
  7. order by emp.id;
  8. # 总结:保留右表的全部数据,左表有对应数据直接连表显示,没有对应关系空填充

左右可以相互转化

  1. mysql>:
  2. select
  3. emp.id,emp.name,salary,dep.name,work
  4. from emp right join dep on emp.dep_id = dep.id
  5. order by emp.id;
  6. mysql>:
  7. select
  8. emp.id,emp.name,salary,dep.name,work
  9. from dep left join emp on emp.dep_id = dep.id
  10. order by emp.id;
  11. # 总结:更换一下左右表的位置,相对应更换左右连接关键字,结果相同

全连接:union(并集)

  1. mysql>:
  2. select
  3. emp.id,emp.name,salary,dep.name,work
  4. from emp left join dep on emp.dep_id = dep.id
  5. union
  6. select
  7. emp.id,emp.name,salary,dep.name,work
  8. from emp right join dep on emp.dep_id = dep.id
  9. order by id;
  10. # 总结:左表右表数据都被保留,彼此有对应关系正常显示,彼此没有对应关系均空填充对方

MySQL入门(函数、条件、连接)的更多相关文章

  1. Mysql(二)函数与连接

    一.函数 1.if函数 if(exp1, exp2, exp3)     判断exp1是否为true(不为0,并且不为nlll),如果为true,返回 exp2的值,否则返回exp3的值. selec ...

  2. MySQL concat函数的使用

    MySQL concat函数是MySQL数据库中众多的函数之一,下文将对MySQL concat函数的语法和使用进行说明,供您参考和学习. MySQL concat函数使用方法:CONCAT(str1 ...

  3. [转载]MySQL concat函数的使用

    MySQL concat函数是MySQL数据库中众多的函数之一,下文将对MySQL concat函数的语法和使用进行说明,供您参考和学习. MySQL concat函数使用方法:CONCAT(str1 ...

  4. MySQL中concat函数(连接字符串)

    MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...

  5. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  6. 21分钟 MySQL 入门教程(转载!!!)

    21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...

  7. MYSQL入门全套(第三部)

    MYSQL入门全套(第一部) MYSQL入门全套(第二部) 索引简介 索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构.如果想按特定职员的姓来查找 ...

  8. MySQL入门(三)

    写了两篇<MySQL入门>以后我发现,写书的人还是都挺有本事的,起码人家知道怎么编排自己想讲的知识点,我实在是不知道该先说那里后说哪里,那我就想到什么讲什么吧. 一 写SQL 其实我是不想 ...

  9. MySQL入门转载

    21分钟 MySQL 入门教程 http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html 目录 一.MySQL的相关概念介绍 二.Wi ...

随机推荐

  1. Flask 的 session

    Flask 的 session @app.route("/", ) def index(): # 如何设置sessoion # 1 导入session # 2 给sessoion设 ...

  2. 构造函数,拷贝构造和赋值运算符调用时机,explicit,

    #include<iostream> #include <stdio.h> using namespace std; class test{ int mvalue; publi ...

  3. 环境篇:呕心沥血@CDH线上调优

    环境篇:呕心沥血@线上调优 为什么出这篇文章? 近期有很多公司开始引入大数据,由于各方资源有限,并不能合理分配服务器资源,和服务器选型,小叶这里将工作中的总结出来,给新入行的小伙伴带个方向,不敢说一定 ...

  4. CentOS7——配置阿里云镜像源

    CentOS7--配置阿里云镜像源 #下载CentOS 7的repo文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun ...

  5. DedeCms 标签中channelartlist设置属性标签样式的方法

    实现的效果如下: {dede:channelartlist typeid='6' row='3' currentstyle='current'} <li class='{dede:field.c ...

  6. Spring:工厂模式哪里解耦了?

    菜瓜:我一定是太菜了,为什么别人说Spring屏蔽了new关键字创建对象就很丝滑?我完全get不到这个操作的好处啊,我自己写new它也很香啊 水稻:emmmm,换个角度想啊,如果把现在用的注解@Aut ...

  7. 利用VS自带发布功能实现web项目快速部署

    你还在使用最原始的方法部署服务器吗?还在把项目文件全部复制然后黏贴到服务器上?这种方法太low而且又慢又不安全(存在源码泄露等安全性问题),如果你是这样,那你自己肯定也为此烦恼不已. 下面我所要讲到的 ...

  8. Mybatis框架-CRUD

    1  2  3  传统dao开发实现CRUD 3.1    传统dao开发实现crud 使用 Mybatis 开发 Dao,通常有两个方法,即原始 Dao开发方式和 Mapper 接口代理开发方式.而 ...

  9. vue父路由高亮不显示

    vue父路由高亮不显示 首页和考试中心作为父路由,点击时发现不高亮,是因为路由配置有问题 因为首页和考试中心已经重定向到homepage和tpersonal-data这两个路由,当点击首页和考试中心的 ...

  10. Thunk函数的使用

    Thunk函数的使用 编译器的求值策略通常分为传值调用以及传名调用,Thunk函数是应用于编译器的传名调用实现,往往是将参数放到一个临时函数之中,再将这个临时函数传入函数体,这个临时函数就叫做Thun ...