设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1195|回复: 0

MySQL数据表查询操作

[复制链接]

26

主题

207

金钱

343

积分

入门用户

发表于 2019-6-14 13:54:07 | 显示全部楼层 |阅读模式

准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!
  1. /*
  2.                 SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重
  3.                         {* | 表名.* | 表名.字段名[ AS 别名][,...]} 指定查询出的字段的
  4.                 FROM
  5.                         表名[AS 别名][,表1... AS 别名]
  6.                 [INNER | [LEFT | RIGHT] [OUTER] JOIN 另一张表名 [AS 别名] ON 关联条件]
  7.                 [WHERE 条件]
  8.                 [GROUP BY 分组字段[,...]]
  9.                 [HAVING 给分组后的数据进行条件筛选]
  10.                 [ORDER BY 排序字段[,...]]
  11.                 [LIMIT [startIndex,]pageSize]
复制代码

DQL是SQL中最核心的部分!

一、MySQL的标准查询语句结构
SELECT [ ALL | DISTINCT ]
{ * | 表名.* | 表名.字段名…… [ AS 别名] }
FROM 要查询的表名 [ AS 别名 ]
[ LEFT | RIGHT | INNER JOIN 连接表名 [ AS 别名] ]
SELECT 后 FROM 前的这一块内容,它是用来筛选查询字段的
简单理解就是你想查看那些信息

1.查询数据库列表
  1. show databases;
复制代码

2.查询数据表列表
  1. -- 查询当前连接的数据库的数据表列表
  2. show tables;
  3. -- 如果没有连接
  4. show tables from 数据库名;
复制代码

3.查询数据表的字段
  1. desc/describe table 数据库名.表名;
  2. show columns from 数据表名 from 数据库名;
  3. show columns from 数据库名.表名;
  4. -- 查询当前已连接的数据表列表
  5. desc 表名;

  6. 示例:
  7. mysql> desc table person_db.student;
  8. mysql> show columns from student from person_db;
  9. mysql> show columns from person_db.student;
  10. mysql> desc student;

  11. -- 查询指定字段名
  12. desc/describe 数据库名.表名 字段名;
  13. -- 查询当前已连接的数据表
  14. desc 表名 字段名;
  15. 示例:
  16. describe person_db.student0 sex;
  17. desc student0 sex;
复制代码

4.查询当前数据库的数据表内容
  1. select * from 表名;
  2. 示例:
  3. select * from student0;
复制代码

5.查询学生表中的学生姓名和性别
  1. SELECT stuName,gender FROM student;
  2. SELECT stuName AS '姓名',gradeId AS '年级' FROM student;
  3. -- AS 关键字可以省略 ' '也可以省略
  4. SELECT stuName '姓名',gradeId + 1 '年级' FROM student;
  5. -- 如果SQL过长可以进行美化
  6. SELECT stuName AS '姓名',
  7.         gradeId + 1 '年级',
  8. FROM
  9.         student;
复制代码


二、ALL和DISTINCT关键字
ALL所有的、全部; DISTINCT直接的、明显的 (去重)
  1. -- ALL 是默认的
  2. -- SELECT ALL stuName,gradeId FROM student;
  3. -- DISTINCT 用来在指定的查询字段值范围内,去除重复数据
  4. 示例:
  5. SELECT DISTINCT  stuName,gradeId FROM student;
  6. SELECT DISTINCT  stuName,gender,gradeId FROM student;
复制代码

2.1 where 查询条件
在修改和删除时用过 目的是为了防止修改/删除全表
用于检索数据表中符合条件的记录的
简单理解:上方的操作是用来筛选列的 where是用来筛选行的
在Where条件语句中,可以有一个或者多个逻辑表达式组成,结果一般为真或假

2.2<关系/比较运算符和逻辑运算符>
  1. SELECT * FROM student;
  2. -- 查询年级时大于1的学生信息
  3. SELECT * FROM student WHERE gradeId > 1;
  4. -- 复杂条件的处理:逻辑运算符 与AND 或OR 非NOT
  5. -- 查询姓名为张三且性别为女的学生信息
  6. SELECT * FROM student WHERE stuName = '张三' AND gerder = '女';
  7. -- 查询性别是女的,或者年级为3的
  8. SELECT * FROM student WHERE gender = '女' OR gradeId = 3;
  9. -- 查询性别不是女的
  10. SELECT * FROM student WHERE NOT gender = '女';
复制代码


2.3特殊的比较运算符
IS NULL(查询空) IS NOT NULL(查询不为空)
  1. -- 查询地址为空的学生姓名 不能使用=
  2. SELECT stuName FROM student WHERE address IS NULL;
  3. SELECT stuName FROM student WHERE address IS NOT NULL;
  4. -- BETWEEN … AND 在… 之间/范围内 它等价于>= and <=
  5. -- 查询年级在2-3之间的学生姓名
  6. SELECT stuName FROM student WHERE gradeID >= 2 AND gradeID <= 3;
  7. -- 更加简洁
  8. SELECT stuName FROM student WHERE gradeId BETWEEN 2 AND 3;
  9. -- IN查询 在…内/里面
  10. -- 查询年级为1或年级为3的学生信息
  11. SELECT * FROM student WHERE gradeId = 1 OR gradeId = 3;
  12. SELECT * FROM student WHERE gradeId IN (1,3);
复制代码


三、模糊查询
LIKE 像…一样 喜欢
%表示任意单个/多个字符 _表示任意单个字符
  1. -- 查询姓为张的学生信息
  2. SELECT * FROM student WHERE stuName LIKE '张';
  3. -- 查询姓张的两个字的学生信息
  4. SELECT * FROM student WHERE stuName LIKE '张_';
  5. -- 查询名称中带有三的学生信息
  6. SELECT * FROM student WHERE stuName LIKE '%张%';
  7. -- 查询三是姓名第二个字符的学生信息
  8. SELECT * FROM student WHERE stuName LIKE '_三%';
复制代码


四、连接查询(多表连查)
连接查询:内连接查询、外连接查询、【自连接查询】
内连接:显式内连接、隐式内连接
  1. -- 查询学生的姓名和所在年级
  2. SELECT stuName,gradeId FROM student;
  3. -- 采用显式内连接[推荐给多表起别名,区分清楚,防止出现模糊不清错误]
  4. -- 内连接可以理解为交集
  5. SELECT
  6.         stu.stuName,g.gradeName
  7. FROM
  8.         student stu
  9. INNER JOIN
  10.         grade g
  11. ON
  12.         stu.gradeId = g.gradeId;
  13. -- 笛卡尔积
  14. SELECT
  15.         stu.stuName,g.gradeName
  16. FROM
  17.         student stu,grade g;
  18. -- 采用隐式内连接查询
  19. SELECT
  20.         stu.stuName,g.gradeName
  21. FROM
  22.         student stu,grade g
  23. WHERE
  24.         stu.gradeId = g.gradeId;
  25. -- 查询所有学生姓名、课程名称、考试成绩
  26. SELECT
  27.         stu.stuName,sub.subjectName,r.result
  28. FROM
  29.         student stu,'subject' sub, result r
  30. WHERE
  31.         stu.stuId = r.stuId
  32.         AND
  33.         sub.subjectId = r.subjectId;
  34. -- 外连接:左外链接、右外连接
  35. -- 查询学生的姓名和所在年级
  36. -- 采用左外连接 以左表为主 LEFT JOIN前面的就是左表
  37. SELECT
  38.         stu.stuName,g.gradeName
  39. FROM
  40.         student stu
  41. LEFT OUTER JOIN grade g
  42. ON stu.gradeId = g.gradeId;
  43. -- 采用右外连接
  44. SELECT
  45.         stu.stuName,g.gradeName
  46. FROM
  47.         student stu
  48. RIGHT OUTER JOIN grade g
  49. ON stu.gradeId = g.gradeId;
  50. -- 自连接(内连接)
  51. -- 查询游戏名称和所属分类
  52. SELECT
  53.         c1.categoryName ,c2.categoryName
  54. FROM
  55.         category c1,category c2
  56. WHERE
  57.         c1.pid = c2.id;
复制代码


五、排序查询 ORDER BY
排序:学生成绩、游戏排行榜(金额、战力、等级…)、音乐播放热度、淘宝销量
价格、评分、美团外卖距离…

ORDER BY 默认情况下为升序排序即ASC(Ascend) 降序DESC(Descend)
  1.   -- 需求:查询出学生姓名、课程名称、成绩 并且按照成绩进行降序排序
  2. SELECT
  3.         -- 要查询的字段名
  4.         stu.stuName,sub.subjectName,r.result
  5. FROM
  6.         -- 表名
  7.         result r,student stu,`subject` sub
  8. WHERE
  9.         -- 关联条件
  10.         r.stuId = stu.stuId AND r.subjectId = sub.subjectId
  11.         -- 排序字段
  12. ORDER BY r.result DESC;
复制代码

需求:在上方基础进行改动 要求按照成绩进行降序 且如果成绩相同按照时间降序
  1. -- 需求:只想看前两条学生信息
  2. SELECT
  3.         *
  4. FROM
  5.         student
  6. LIMIT 0,2; -- 如果offset是从0开始 那么可以省略 LIMIT 2
复制代码
  1. SELECT
  2.         stu.stuName,sub.subjectName,r.result,r.examDate
  3. FROM
  4.         result r,student stu,`subject` sub
  5. WHERE
  6.         r.stuId = stu.stuId AND r.subjectId = sub.subjectId
  7. ORDER BY
  8.         r.result DESC , r.examDate DESC;   (X) ORDER BY r.result,r.examDate DESC;
复制代码


六、限制查询(分页) LIMIT
LIMIT offset,row;
LIMIT startIndex起始索引<从0开始>,pageSize 分页场景

分页:因为数据量比较大的时候,如果把所有数据都显示在一页上
既不利于阅读也不利于定位查找。所以要对数据进行分页。
假设有20条数据 现在可以将数据拆分成4条每页 则有5页(在Java Web有对其进行业务的实现)
假设有21条数据 现在可以将数据拆分成4条每页 则有6页(多余一条自己占一页)
LIMIT可以在我们的MySQL中实现分页的数据查询/指定页码的数据查询
需求:现在学生信息要求每页显示2条 想查看第一页的数据
  1. SELECT * FROM student LIMIT 0,2;
  2.   要求查看第二页的数据
  3. SELECT * FROM student LIMIT 2,2;
  4.   要求查看第三页的数据
  5. SELECT * FROM student LIMIT 4,2;
  6.   页码和起始索引的计算公式:(页码 - 1) * 显示条数
  7.   startIndex = (currentPage - 1) * pageSize;
复制代码


七、MySQL子查询 ()
子查询:在一个查询中又嵌套了其他的查询,那么嵌套的查询就被称为子查询,而外层的查询被称为父查询。
子查询可以任意嵌套!可以出现在INSERT UPDATE DELETE WHERE等中…
建议在初期写子查询时 先将查询进行步骤化
需求:查询在高等数学考试中,成绩比张三高的学生的姓名信息
如果不考虑连表查询
  1. -- 先写出比张三高的学生ID
  2. SELECT
  3.         stuId
  4. FROM
  5.         result
  6. WHERE
  7.         subjectId = 1
  8.         AND
  9.         result > 86;
复制代码
  1. -- 1.查询高等数学的课程编号
  2. SELECT
  3.         subjectId
  4. FROM
  5.         `subject`
  6. WHERE
  7.         subjectName = '高等数学';
  8. -- 整合       
  9. SELECT
  10.         stuId
  11. FROM
  12.         result
  13. WHERE
  14.         subjectId = (
  15.                 SELECT
  16.                         subjectId
  17.                 FROM
  18.                         `subject`
  19.                 WHERE
  20.                         subjectName = '高等数学'
  21.         )
  22.         AND
  23.         result > 86;

  24. -- 2.查询张三的高数考试成绩
  25. SELECT
  26.         result
  27. FROM
  28.         result
  29. WHERE
  30.         stuId = (SELECT stuId FROM student WHERE stuName = '张三')
  31.         AND subjectId = (SELECT subjectId FROM `subject` WHERE subjectName = '高等数学');

  32. -- 整合
  33. SELECT
  34.         r.stuId,stu.stuName
  35. FROM
  36.         result r,student stu
  37. WHERE
  38.         r.stuId = stu.stuId
  39.         AND
  40.         subjectId = (
  41.                 SELECT subjectId FROM `subject` WHERE subjectName = '高等数学'
  42.         )
  43.         AND
  44.         result > (
  45.                 SELECT result FROM result WHERE stuId = (
  46.                                 SELECT stuId FROM student WHERE stuName = '张三'
  47.                 )
  48.                 AND subjectId = (
  49.                                 SELECT subjectId FROM `subject` WHERE subjectName = '高等数学'
  50.                 )
  51.         );

  52.   -- 使用子查询解决连表查询
  53.   -- 要求查询学生姓名、年级名称
  54.   -- 原来
  55. SELECT stu.stuName,g.gradeName FROM student stu,grade g WHERE stu.gradeId = g.gradeId;
  56.   -- 子查询
  57. SELECT
  58.         stu.stuName,
  59.         (SELECT g.gradeName FROM grade g WHERE g.gradeId = stu.gradeId) AS gradeName
  60. FROM
  61.         student stu;
复制代码


八、MySQL常用函数
  1. --  常用的字符串函数
  2. --  4.1 字符串拼接 CONCAT(str1,str2,...)
  3. SELECT CONCAT('这是','MySQL','数据库');
  4. -- 4.2 字符串内容替换 REPLACE(str,from_str,to_str)
  5. SELECT REPLACE('这是MySQL数据库','MySQL','Oracle');
  6. -- 4.3 去除左侧空格
  7. SELECT LTRIM('   Hello World  ');
  8. -- 去除右侧空格
  9. SELECT RTRIM('   Hello World  ');
  10. -- 4.4 获取字符串长度
  11. SELECT LENGTH('Hello');
  12. -- 4.5 截取字符串SUBSTR(str,pos)  索引从1开始
  13. SELECT SUBSTR('Hello World',5);
  14. -- SUBSTR(str,pos,len)
  15. SELECT SUBSTR('Hello World',5,3);
复制代码
  1. -- 常用的数学函数
  2. -- 4.6 获取随机数 Math.random();
  3. SELECT RAND();
  4. -- 4.7 向上取整
  5. SELECT CEIL(20.4);
  6. -- 向下取整
  7. SELECT FLOOR(20.7);
  8. -- 4.8 四舍五入
  9. SELECT ROUND(20.5);
  10. SELECT ROUND(20.76,1)
复制代码
  1. -- 常用的时间函数
  2. -- 4.9 获取当前时间
  3. SELECT NOW();
  4. SELECT CURRENT_DATE();
  5. SELECT CURRENT_TIME();
复制代码
  1. -- 4.10 获取各种时间信息的函数
  2. SELECT MONTH(NOW());
  3. SELECT YEAR(NOW());
  4. SELECT DAY(NOW());
  5. SELECT HOUR(NOW());
  6. SELECT MINUTE(NOW());
  7. SELECT SECOND(NOW());
复制代码
  1. -- 4.11 日期转换
  2. SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
  3. -- 4.12 计算时间差额
  4. SELECT DATEDIFF(NOW(),'2019-05-25');
复制代码
  1. -- 常用的聚合/统计函数
  2. -- 求年级编号最大的
  3. SELECT MAX(gradeId) FROM grade;
  4. -- 求年级编号最小的
  5. SELECT MIN(gradeId) FROM grade;
  6. -- 求平均分
  7. SELECT AVG(result) FROM result WHERE subjectId = 1;
  8. -- 求和
  9. SELECT SUM(result) FROM result WHERE subjectId = 1;
  10. -- 计算学生总人数
  11. SELECT COUNT(*) FROM student;
  12. SELECT COUNT(stuId) FROM student;
  13. SELECT COUNT(1) FROM student;
复制代码


九、分组查询GROUP BY
注意事项:在分组查询的查询字段中 不要出现与分组查询中无关的字段值
  1. -- 需求:计算各个年级的学生人数
  2. SELECT gradeId,COUNT(1) FROM student GROUP BY gradeId;

  3. -- 如果我希望查看 各个年级的总人数 且要求查看对应的学生姓名列表
  4. SELECT gradeId,COUNT(1),GROUP_CONCAT(stuName) FROM student GROUP BY gradeId;

  5. -- 计算各个年级各个性别的人数
  6. SELECT gradeId,gender,COUNT(1) FROM student GROUP BY gradeId,gender;

  7. -- 需求:查询年级的学生人数大于1人的年级名称
  8. SELECT
  9.         stu.gradeId,count(1),g.gradeName
  10. FROM
  11.         student stu,grade g
  12. WHERE
  13.         stu.gradeId = g.gradeId
  14. GROUP BY
  15.         gradeId
  16. HAVING
  17.         count(1) > 1;
复制代码
  1. /*
  2. HAVING和WHERE的区别?
  3. 相同点:都可以用来进行条件判断 筛选行数
  4. 不同点:
  5. 位置不同:WHERE是在分组之前  HAVING是在分组之后
  6. 条件筛选不同:WHERE是给FROM查询到的数据进行条件筛选 而HAVING是对分组后的数据进行筛选
  7. */
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表