数据库DQL查询

打印 上一主题 下一主题

主题 963|帖子 963|积分 2889

MySQL数据库查询关键字

接下来会通过mysql的关键字来演示在数据库中怎样对数据查询
mysql中的内置方法可以使用 'help function'来查察使用方式


  • 常用的mysql 查询干系关键字
数据库查询(DQL)
  1. -- 语法
  2. select
  3. 字段列表
  4. from
  5. 表名列表
  6. where
  7. 条件列表
  8. group by
  9. 分组字段列表
  10. having
  11. 过滤列表
  12. distinct
  13. 去重列表
  14. order by
  15. 排序字段列表
  16. limit
  17. 分页
  18. regexp
  19. 正则匹配关键字
  20. """
  21. DQL执行顺序
  22. FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT
  23. """
复制代码

  • 多表查询的两种方式

  • 子查询
  • 连表查询


  • 基础查询

  • 查询多个字段
  1. -- 查询多个字段
  2. select field1, field2.... from tablename;
  3. or
  4. select * from tablename;
  5. -- 设置别名
  6. select field1 as a1, field2 as a2,....from tablename;
  7. or
  8. select field1 a1, field2 as a2,... from tablename;
  9. -- 去除重复记录
  10. select distinct fieldlist from tablename;
  11. -- 转义
  12. select * from tablename where name like '/_张三/'escape'/'
复制代码

  • 条件查询
  1. -- grammar
  2. select fieldlist from tablename where condition_list;
复制代码
[table][tr]比较运算符功能[/tr][tr][td]>[/td][td]大于[/td][/tr][tr][td]>=[/td][td]大于便是[/td][/tr][tr][td]</tdtd小于/td/trtrtd=/tdtd小于便是/td/trtrtd=/tdtd便是/td/trtrtd 或 !=/tdtd不便是/td/trtrtdBETWEEN....AND.../tdtd在某个范围内(含最小,最大值)/td/trtrtdIN (...)/tdtd在in之后的列表中的值,多选一/td/trtrtdLIKE 占位符/tdtd含糊匹配(_匹配单个字符,%匹配任意字符)/td/trtrtdIS NULL/tdtd是NULL/td/tr/tbody/tabletabletheadtrth逻辑运算符/thth功能/th/tr/theadtbodytrtdAND 或 &&/tdtd并且(多个条件同时成立)/td/trtrtdOR 或 ||/tdtd或者(多个条件任意成立一个)/td/trtrtdNOT 或 !/tdtd非,不是/td/tr/tbody/tabletabletheadtrth函数/thth功能/th/tr/theadtbodytrtdcount/tdtd统计数量/td/trtrtdmax/tdtd最大值/td/trtrtdmin/tdtd最小值/td/trtrtdsum/tdtd求和/td/trtrtdavg/tdtd平均值/td/tr/tbody/tablep代码现实应用/pblockquoteolli数据准备/lili查询使用/li/ol/blockquote
  1. /*
  2. 准备一张员工数据表,并写入测试数据
  3. */
  4. create table emp(
  5.     id int primary key auto_increment,
  6.     name varchar(36) not null,
  7.     gender enum('male','female') not null, default 'male',
  8.     age int(3) unsigned not null default 28,
  9.     hire_date date not null,
  10.     post varchar(50),
  11.     post_comment varchar(100),
  12.     salary double(15,2),
  13.     office int,
  14.     depart_id int
  15. );
  16. /*
  17. 插入记录
  18. 三个部门:教学,销售,运营
  19. */
  20. insert into emp(name,gender,age,hire_date,post,salary,office,depart_id) values
  21. ('jason','male',18,'20170301','浦东第一帅形象代言',7300.33,401,1), -- 以下是教学部
  22. ('tom','male',78,'20150302','teacher',1000000.31,401,1),
  23. ('kevin','male',81,'20130305','teacher',8300,401,1),
  24. ('tony','male',73,'20140701','teacher',3500,401,1),
  25. ('owen','male',28,'20121101','teacher',2100,401,1),
  26. ('jack','female',18,'20110211','teacher',9000,401,1),
  27. ('jenny','male',18,'19000301','teacher',30000,401,1),
  28. ('sank','male',48,'20101111','teacher',10000,401,1),
  29. ('哈哈','female',48,'20150311','sale',3000.13,402,2), -- 以下是销售部门
  30. ('呵呵','female',38,'20101101','sale',2000.35,402,2),
  31. ('西西','female',18,'20110312','sale',1000.37,402,2),
  32. ('乐乐','female',18,'20160513','sale',3000.29,402,2),
  33. ('拉拉','female',28,'20170127','sale',4000.33,402,2),
  34. ('僧龙','male',28,'20160311','operation',10000.13,403,3), -- 以下是运营部门
  35. ('程咬金','male',18,'19970312','operation',20000,403,3),
  36. ('程咬银','female',18,'20130311','operation',19000,403,3),
  37. ('程咬铜','male',18,'20150411','operation',18000,403,3),
  38. ('程咬铁','female',18,'20140512','operation',17000,403,3);
复制代码
ulli查询关键字-where筛选/li/ul
  1. 1. 查询id大于等于3 小于等于6的数据
  2. /*
  3. 分析: 只需要使用and链接两个条件即可
  4. */
  5. select * from emp where id>=3 and id<=6;
  6. select * from emp where id>=3 && id<=6;
  7. 2. 查询薪资是20000或者18000或者17000的数据
  8. /*
  9. 分析: 可以使用or对多个条件进行匹配
  10.     可以使用in对一个数据集中的数据做匹配
  11. */
  12. select * from emp where salary=20000 or salary=18000 or salary=17000;
  13. select * from emp where salary in (20000,18000,17000);
  14. 3. 查询员工姓名中包含字母o的员工姓名与薪资
  15. /*
  16. 分析: 需要使用like模糊查询
  17. */
  18. select name,salary from emp where name like '%o%';
  19. 4. 查询员工姓名是由四个字符组成的员工姓名与其薪资
  20. /*
  21. 分析: 使用模糊查询单匹配字符_
  22. */
  23. select name,salary from emp where name like '____';
  24. select name.salary from emp where char_length(name) = 4;
  25. 5. 查询岗位描述为空的员工名与岗位名  针对null不能用等号,只能用is
  26. /*
  27. 分析: 针对null 不能使用=号,只能使用is
  28. */
  29. select * from emp where post_comment is null;
复制代码
ulli查询关键字group by分组/li/ulblockquotepgroup by 分组就是将前面处理的数据作为新的数据集处,可以配合聚合函数br分组之后最小单位为组,不再是组内单个的数据/p/blockquote
  1. select * from emp where post;
  2. -- 注意由于mysql中的严格模式要求,需要将分组后字段和select字段只能填写分组依据,这里的select * 不可用,这是由only_full_group_by配置来决定
  3. mysql> select post from emp group by post;
  4. -- 以post字段将数据分为4组
  5. +-----------------------------+
  6. | post                        |
  7. +-----------------------------+
  8. | operation                   |
  9. | sale                        |
  10. | teacher                     |
  11. | 浦东第一帅形象代言 |
  12. +-----------------------------+
  13. 4 rows in set (0.02 sec)
  14. -- 需求:将员工数据按照部门分组,并获得每个部门最高工资
  15. -- 在分组之后由select处理,可以用函数处理其他字段信息
  16. select post,max(salary) from emp group by post;
  17. -- 对打印的结果字段做别名
  18. select post, max(salary) as '最高薪' from emp group by post;
  19. -- 一次获取部门薪资相关统计
  20. select post as '部门',max(salary) as '最高薪资', min(salary) as '最低薪资', avg(salary) as '平均薪资', sum(salary) as '薪水支出总额' from emp group by post;
  21. -- 统计每个部门的人数
  22. select post as '部门', count(id) as '人数' from emp group by post;
  23. -- 统计每个部门的部门名称以及部门下的员工姓名
  24. select post,group_concat(name) from emp group by post;  
  25. select post, group_concat(name,'_优秀员工') from emp group by post;
复制代码
ulli查询关键字-having过滤/li/ulblockquotephaving本质的区别和where是一样的,作为数据的筛选br区别: where是首次筛选,having是二次筛选,即对数据效果集再次处理/p/blockquote
  1. -- 统计各部门年龄在30岁以上的员工平均工资 并且保留大于10000的数据
  2. /*
  3. 1. 先筛选出年纪30岁之上的员工数据
  4. select * from emp where age > 30;
  5. 2. 再对筛选出来的数据按照部门分组并统计拼接薪资
  6. select post,avg(salary) from emp where age > 30 group by post;
  7. 3. 针对分组统计后的数据做二次筛选
  8. select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;
  9. */
  10. select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;
复制代码

  • 查询关键字-distinct去重
注意,数据必须完全同等才能去重,多条数据也须要遵循
  1. select distinct id,age from emp;
  2. -- 这里id和age字段中必须完全一致才能被去重
  3. /*
  4. 例如,符合要求
  5. id 1  age 18
  6. id 1  age 18
  7. 不符合要求
  8. id 1  age 18
  9. id 2  age 18
  10. */
复制代码

  • 查询关键字 - order by 排序
asc :升序, desc :降序
  1. -- 单字段排序
  2. -- 升序
  3. select age from emp order by acs;
  4. -- 降序
  5. select age from emp order by desc;
  6. -- 多字段排序
  7. /*
  8. 分析: 先对age进行升序,再更具salary降序,
  9. */
  10. select * from emp order by age,salary desc;
  11. /*
  12. 统计各部门年龄在10岁以上的员工平均工资,
  13. 并且保留平均工资大于1000的部门,
  14. 然后对平均工资进行排序
  15. */
  16. select post,avg(salary) from emp where age > 10 group by post having avg(salary) > 1000 order by avg(salary) desc;
  17. /*
  18. 使用as 别名降低语句执消耗资源
  19. select post,avg(salary) as avg_s from emp where age > 10 group by post having avg_s > 1000 order by avg_s desc;
  20. */
复制代码

  • 查询关键字- limit分页
对数据做截取处理,例如1000万数据,进行处理后可以使用limit 100 看前100条数据,也可以写100,100 看第100条数据开始的后100条
  1. -- 前5条数据
  2. select * from emp limit 5;
  3. -- 第二条数据开始的后5条数据
  4. select * from emp limit 2,5;
  5. 查询工资最高的人的详细信息
  6. select * from emp order by salary desc limit 1;
  7. +----+------+--------+-----+------------+---------+--------------+------------+--------+-----------+
  8. | id | name | gender | age | hire_date  | post    | post_comment | salary     | office | depart_id |
  9. +----+------+--------+-----+------------+---------+--------------+------------+--------+-----------+
  10. |  2 | tom  | male   |  78 | 2015-03-02 | teacher | NULL         | 1000000.31 |    401 |         1 |
  11. +----+------+--------+-----+------------+---------+--------------+------------+--------+-----------+
  12. 1 row in set (0.02 sec)
复制代码

  • 查询关键字-regexp 正则表达式
含糊查询的第二种方式
  1. select * from emp where name regexp '^j.*(n|y)$';
  2. /*
  3. 如果出现1139错误请将正则中的?+ 去除或替换
  4. 1139 - Got error 'repetition-operator operand invalid' from regexp
  5. POSIX regexes don't support using the question mark ? as a non-greedy (lazy) modifier to the star and plus quantifiers like PCRE (Perl Compatible Regular Expressions). This means you can't use +? and *?
  6. */
复制代码

  • 多表查询思路
  1. create table dep(
  2.     id int primary key auto_increment,
  3.     name varchar(20)
  4. );
  5. create table emp1(
  6.     id int primary key auto_increment,
  7.     name varchar(20),
  8.     sex enum('male','female') not null default 'male',
  9.     age int,
  10.     dep_id int
  11. );
  12. insert into dep values
  13. (200,'技术'),
  14. (201,'人力资源'),
  15. (202,'销售'),
  16. (203,'运营'),
  17. (205,'财务');
  18. insert into emp1(name,sex,age,dep_id) values
  19. ('jason','male',18,200),
  20. ('dragon','female',48,201),
  21. ('kevin','male',18,201),
  22. ('nick','male',28,202),
  23. ('owen','male',18,203),
  24. ('jerry','female',18,204);
  25. select * from emp1, dep;
  26. /*
  27. 在同时对两张表查询数据值称为:’笛卡尔积‘无脑对应没有意义,多表联查应该将
  28. 无关系的两张表通过语句指定逻辑关系
  29. */
  30. select * from emp1, dep where emp1.dep_id=dep.id;
  31. mysql> select * from emp1, dep where emp1.dep_id=dep.id;
  32. +----+--------+--------+-----+--------+-----+--------------+
  33. | id | name   | sex    | age | dep_id | id  | name         |
  34. +----+--------+--------+-----+--------+-----+--------------+
  35. |  1 | jason  | male   |  18 |    200 | 200 | 技术          |
  36. |  2 | dragon | female |  48 |    201 | 201 | 人力资源       |
  37. |  3 | kevin  | male   |  18 |    201 | 201 | 人力资源       |
  38. |  4 | nick   | male   |  28 |    202 | 202 | 销售          |
  39. |  5 | owen   | male   |  18 |    203 | 203 | 运营          |
  40. +----+--------+--------+-----+--------+-----+--------------+
  41. 5 rows in set (0.02 sec)
  42. -- 基于上述的操作就可以将多张表合并到一起然后一次性获取更多的数据
  43. -- 基于emp表格对数据做出筛选
  44. 1. 查询岗位名以及岗位包含的所有员工名字
  45. select post,group_concat(name) from emp group by post;
  46. 2. 查询岗位名以及各岗位内包含的员工个数
  47. select post as '部门',group_concat(name) as '部门成员',count(name) as '部门人数' from emp group by post;
  48. 3. 查询公司内男员工和女员工的个数
  49. select gender as '性别',count(id) as '人数' from emp group by gender;
  50. 4. 查询岗位名以及各岗位的平均薪资
  51. select post,avg(salary) from emp group by post;
  52. 5. 查询岗位名以及各岗位的最高薪资
  53. select post,max(salary) from emp group by post;
  54. 6. 查询岗位名以及各岗位的最低薪资
  55. select post,min(salary) from emp group by post;
  56. 7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
  57. select gender as '性别',avg(salary) as '平均薪资' from emp group by gender;
  58. 8. 统计各部门年龄在30岁以上的员工平均工资
  59. select post as '部门',avg(salary) as '平均薪资' from emp where age > 30 group by post;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表