f 向量数据库-数据库 - MySQL数据查询 - Powered by qidao123.com技术社区

数据库 - MySQL数据查询

打印 上一主题 下一主题

主题 2001|帖子 2001|积分 6003

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次

前言
一、简单的数据查询
(一)查询单个字段
(二)查询多个字段
(三)查询全部字段
(四)利用别名查询字段
(五)带条件的字段查询
(六)利用DISTINCT去重查询
(七)利用ORDER BY排序查询结果
(八)利用LIKE进行模糊查询
(九)利用IN进行多值查询
(十)利用BETWEEN进行范围查询
(十一)限制查询结果数目LIMIT
(十二)条件查询与逻辑操作符
二、聚合函数
(一)COUNT
(二)SUM
(三)AVG
(四)MAX
(五)MIN
(六)GROUP_CONCAT
(七)VARIANCE 和 STDDEV
三、分组查询
(一)根本语法
(二)示例
(1)简单分组查询
(2)利用多个列进行分组
(3)利用 HAVING 进行过滤
(4)利用聚合函数和分组
(5)与 WHERE 一起利用
(三)留意事项
四、分页查询
(一)根本语法
(二)示例
(1)获取前 10 条纪录(第一页)
(2)获取第 2 页的 10 条纪录
(3)利用分页和排序
(三)盘算分页参数
(四)分页查询的优化
(1)索引优化
(2)减少offset的开销
(五)留意事项
五、毗连查询
(一)内毗连
(二)左毗连
(三)右毗连
(四)全毗连
(五)交叉毗连
(六)自毗连
(七)多表毗连
(八)留意事项


前言

上篇文章是对MySQL的简单介绍和根本操作,接下来会对MySQL数据查询最更进一步的讲解。

一、简单的数据查询

在 MySQL 中,字段查询是通过 SELECT 语句从表中检索某个或某些字段的数据。你可以通过指定字段名、条件、排序等来机动查询表中的数据。以下是 MySQL 中常见的字段查询方式和操作示例:
(一)查询单个字段

假如只必要查询表中的某一个字段,可以在 SELECT 语句中指定该字段的名称。
语法:
  1. SELECT 字段名 FROM 表名;
复制代码
示例:
  1. SELECT username FROM users;
复制代码
此查询将从 users 表中查询全部用户的用户名。
(二)查询多个字段

可以同时查询多个字段,只需在 SELECT 语句中列出多个字段名,用逗号分隔。
语法:
  1. SELECT 字段1, 字段2, ... FROM 表名;
复制代码
示例:
  1. SELECT username, email, age FROM users;
复制代码
此查询将从 users 表中查询用户名、邮箱和年龄这三个字段的数据。
(三)查询全部字段

假如必要查询表中的全部字段,可以利用 * 来表示全部字段。
语法:
  1. SELECT * FROM 表名;
复制代码
示例:
  1. SELECT * FROM users;
复制代码
此查询将返回 users 表中的全部字段和全部数据。
(四)利用别名查询字段

利用 AS 关键字为字段指定别名,这在必要输出更加直观的结果时非常有用。
语法:
  1. SELECT 字段名 AS 别名 FROM 表名;
复制代码
示例:
  1. SELECT username AS 用户名, email AS 邮箱 FROM users;
复制代码
此查询将为 username 字段定名为 "用户名",为 email 字段定名为 "邮箱"。
(五)带条件的字段查询

通过 WHERE 子句来筛选数据,返回符合条件的字段。
语法:
  1. SELECT 字段1, 字段2 FROM 表名 WHERE 条件;
复制代码
示例:
  1. SELECT username, email FROM users WHERE city = 'Beijing';
复制代码
此查询将返回 users 表中都会为 Beijing 的用户的用户名和邮箱。
(六)利用DISTINCT去重查询

假如一个字段中存在重复值,DISTINCT 可以用来查询唯一值,去除重复纪录。
语法:
  1. SELECT DISTINCT 字段名 FROM 表名;
复制代码
示例:
  1. SELECT DISTINCT city FROM users;
复制代码
此查询将返回 users 表中唯一的都会名称。
(七)利用ORDER BY排序查询结果

通过 ORDER BY 子句对查询结果进行排序,默认是升序排序,利用 DESC 关键字可以实现降序排序。
语法:
  1. SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC|DESC];
复制代码
示例:
  1. SELECT username, age FROM users ORDER BY age DESC;
复制代码
此查询将按照年龄降序排序,并返回用户名和年龄。
(八)利用LIKE进行模糊查询

LIKE 关键字用于进行模糊查询,结合 % 和 _ 通配符利用。


  • % 表示任意数目标字符。
  • _ 表示单个字符。
语法:
  1. SELECT 字段名 FROM 表名 WHERE 字段名 LIKE 模式;
复制代码
示例:
  1. SELECT username FROM users WHERE username LIKE 'john%';
复制代码
此查询将返回用户名以 john 开头的全部用户。
(九)利用IN进行多值查询

IN 关键字用于筛选字段值等于多个给定值中的任意一个。
语法:
  1. SELECT 字段名 FROM 表名 WHERE 字段名 IN (值1, 值2, ...);
复制代码
示例:
  1. SELECT username FROM users WHERE city IN ('Beijing', 'Shanghai');
复制代码
(十)利用BETWEEN进行范围查询

BETWEEN 用于查询字段值在某个范围内的数据,通常用于数值或日期类型字段。
语法:
  1. SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值2;
复制代码
示例:
  1. SELECT username, age FROM users WHERE age BETWEEN 20 AND 30;
复制代码
此查询将返回年龄在 20 到 30 之间的用户。
(十一)限制查询结果数目LIMIT

LIMIT 用于限制查询返回的行数,特别实用于分页。
语法:
  1. SELECT 字段名 FROM 表名 LIMIT 起始行, 行数;
复制代码
示例:
  1. SELECT username FROM users LIMIT 5;
复制代码
(十二)条件查询与逻辑操作符

可以结合逻辑操作符 AND、OR 来进行更加复杂的条件查询。
示例:
  1. SELECT username, email FROM users WHERE city = 'Beijing' AND age > 18;
复制代码

二、聚合函数

MySQL的聚合函数用于对一组值进行盘算,并返回单一的总结性结果。它们通常与 GROUP BY 子句一起利用,常用于统计数据和汇总结果。常见的聚合函数有以下几种:
(一)COUNT



  • 功能: 盘算满足条件的行数。
  • 语法: COUNT(expression)
示例:
  1. SELECT COUNT(*) FROM employees;
复制代码
(二)SUM



  • 功能: 盘算一组值的总和,通常用于数值列。
  • 语法: SUM(expression)
示例:
  1. SELECT SUM(salary) FROM employees;
复制代码
(三)AVG



  • 功能: 盘算一组数值的平均值。
  • 语法: AVG(expression)
示例:
  1. SELECT AVG(salary) FROM employees;
复制代码
(四)MAX



  • 功能: 返回指定列的最大值。
  • 语法: MAX(expression)
示例:
  1. SELECT MAX(salary) FROM employees;
复制代码
(五)MIN



  • 功能: 返回指定列的最小值。
  • 语法: MIN(expression)
示例:
  1. SELECT MIN(salary) FROM employees;
复制代码
(六)GROUP_CONCAT



  • 功能: 未来自多行的数据毗连成一个字符串,通常用于组合多个纪录。
  • 语法: GROUP_CONCAT(expression [ORDER BY ...] [SEPARATOR str])
示例:
  1. SELECT GROUP_CONCAT(name) FROM employees;
复制代码
(七)VARIANCE 和 STDDEV



  • 功能: VARIANCE() 盘算方差,STDDEV() 盘算尺度差,通常用于统计分析。
示例:
  1. SELECT VARIANCE(salary), STDDEV(salary) FROM employees;
复制代码

三、分组查询

MySQL的分组查询(GROUP BY 查询)用于将结果集按一列或多列的值进行分组,并对每组数据应用聚合函数进行盘算。分组查询通常与聚合函数一起利用,用于统计或总结数据。
(一)根本语法

  1. SELECT column1, column2, ..., aggregate_function(column)
  2. FROM table
  3. WHERE condition
  4. GROUP BY column1, column2, ...
  5. HAVING condition
  6. ORDER BY column;
复制代码
关键点:

  • GROUP BY: 指定按哪一列或多列进行分组。
  • 聚合函数: 对每组应用的函数,如 COUNT()、SUM()、AVG()、MAX()、MIN() 等。
  • HAVING: 用于过滤分组后的结果,类似 WHERE,但 WHERE 是在分组之前进行过滤,HAVING 是在分组之后应用条件。
(二)示例

(1)简单分组查询

  1. SELECT department, COUNT(*) AS employee_count
  2. FROM employees
  3. GROUP BY department;
复制代码


  • 功能: 按 department 列进行分组,统计每个部门的员工数目。
(2)利用多个列进行分组

  1. SELECT department, job_title, AVG(salary) AS avg_salary
  2. FROM employees
  3. GROUP BY department, job_title;
复制代码


  • 功能: 按 department 和 job_title 进行多列分组,盘算每个部门每个职位的平均薪资。
(3)利用 HAVING 进行过滤

  1. SELECT department, COUNT(*) AS employee_count
  2. FROM employees
  3. GROUP BY department
  4. HAVING employee_count > 5;
复制代码


  • 功能: 统计每个部门的员工数目,利用 HAVING 过滤出员工数大于 5 的部门。
(4)利用聚合函数和分组

  1. SELECT department, SUM(salary) AS total_salary
  2. FROM employees
  3. GROUP BY department
  4. ORDER BY total_salary DESC;
复制代码


  • 功能: 按 department 分组,盘算每个部门的总薪资,并按总薪资从高到低排序。
(5)与 WHERE 一起利用

  1. SELECT department, COUNT(*) AS employee_count
  2. FROM employees
  3. WHERE hire_date > '2020-01-01'
  4. GROUP BY department;
复制代码


  • 功能: 先利用 WHERE 过滤收支职日期在 2020 年 1 月 1 日之后的员工,再按 department 分组统计每个部门的员工数。
(三)留意事项


  • GROUP BY 子句中的列必须出如今 SELECT 语句中,除非它是聚合函数的参数。
  • WHERE 用于在分组之前过滤行,而 HAVING 用于在分组之后过滤组。
  • 当你利用 GROUP BY 时,不能在 SELECT 中选择未聚合的列,除非它们在 GROUP BY 子句中指定。

四、分页查询

分页查询用于从大数据会合按页获取指定数目标纪录,这对于处置处罚大量数据时非常常见,尤其是在网页或应用步伐中表现多页数据时。分页查询主要通过 LIMIT 子句来实现。
(一)根本语法

  1. SELECT column1, column2, ...
  2. FROM table
  3. LIMIT offset, row_count;
复制代码
参数解释:


  • offset: 要跳过的纪录数(从第几条纪录开始)。
  • row_count: 要返回的纪录数(即每页表现多少条纪录)。
(二)示例

(1)获取前 10 条纪录(第一页)

  1. SELECT *
  2. FROM employees
  3. LIMIT 0, 10;
复制代码


  • 功能: 从 employees 表中返回前 10 条纪录。这里 offset 为 0 表示从第一条纪录开始。
(2)获取第 2 页的 10 条纪录

  1. SELECT *
  2. FROM employees
  3. LIMIT 10, 10;
复制代码


  • 功能: 返回从第 11 条纪录开始的 10 条纪录(即第 2 页的数据)。offset 为 10 表示跳过前 10 条纪录,row_count 为 10 表示获取 10 条纪录。
(3)利用分页和排序

  1. SELECT *
  2. FROM employees
  3. ORDER BY hire_date DESC
  4. LIMIT 20, 10;
复制代码


  • 功能: 先按 hire_date 降序排序,再从第 21 条纪录开始,获取 10 条纪录(即第 3 页的数据)。
(三)盘算分页参数

当必要表现分页数据时,通常必要通过页码来盘算 offset。
例如,假设每页表现 10 条纪录:


  • 第 1 页: LIMIT 0, 10 (offset = (1 - 1) * 10 = 0)
  • 第 2 页: LIMIT 10, 10 (offset = (2 - 1) * 10 = 10)
  • 第 3 页: LIMIT 20, 10 (offset = (3 - 1) * 10 = 20)
(四)分页查询的优化

分页查询的优化主要从两个方面入手,一个是索引优化,另一个是减少offset的开销,详细如下:
(1)索引优化

大数据集分页时,尽量利用索引列进行排序和查询,如通过 ORDER BY 指定索引列,可以加快查询速度。
示例:
  1. SELECT *
  2. FROM employees
  3. WHERE id > 100
  4. ORDER BY id
  5. LIMIT 10;
复制代码
这种方式通过索引查找特定的 id 后直接获取分页数据,避免了重新遍历的性能开销。
(2)减少offset的开销

当 offset 非常大时,如 LIMIT 1000000, 10,查询性能可能会变慢。可以通过子查询或调整逻辑来优化大分页标题。
示例:
  1. SELECT *
  2. FROM employees
  3. WHERE id > (SELECT id FROM employees ORDER BY id LIMIT 999990, 1)
  4. LIMIT 10;
复制代码
这种方法避免了大 offset 带来的性能标题。
(五)留意事项



  • offset 越大,查询越慢: 由于 MySQL 会跳过 offset 数目标行数,这意味着在大的数据集下,分页查询的性能会下降。
  • 优化查询: 利用 WHERE 和符合的索引可以提升分页查询的性能,尤其是在处置处罚大量数据时。

五、毗连查询

MySQL的毗连查询用于从多个表中查询相干数据。在数据库设计中,通常会把相干的数据分布在差别的表中,毗连查询能够把这些表的数据组合起来,实现跨表查询。MySQL 支持几种类型的毗连查询,常见的有内毗连、外毗连(左毗连和右毗连)、交叉毗连等。
(一)内毗连

内毗连返回两个表中匹配的纪录,只有在两个表中都有对应的匹配数据时才会返回结果。
语法:
  1. SELECT column1, column2, ...
  2. FROM table1
  3. INNER JOIN table2
  4. ON table1.column = table2.column;
复制代码
示例:
  1. SELECT employees.name, departments.department_name
  2. FROM employees
  3. INNER JOIN departments
  4. ON employees.department_id = departments.department_id;
复制代码


  • 功能: 查询员工及其所在的部门名称。只有当员工和部门表的 department_id 匹配时,才会返回结果
(二)左毗连

左毗连返回左表的全部纪录,即使右表没有匹配的纪录。对于没有匹配的右表纪录,结果中对应的列会表现为 NULL。
语法:
  1. SELECT column1, column2, ...
  2. FROM table1
  3. LEFT JOIN table2
  4. ON table1.column = table2.column;
复制代码
示例:
  1. SELECT employees.name, departments.department_name
  2. FROM employees
  3. LEFT JOIN departments
  4. ON employees.department_id = departments.department_id;
复制代码
(三)右毗连

右毗连返回右表的全部纪录,即使左表没有匹配的纪录。对于没有匹配的左表纪录,结果中对应的列会表现为 NULL。
语法:
  1. SELECT column1, column2, ...
  2. FROM table1
  3. RIGHT JOIN table2
  4. ON table1.column = table2.column;
复制代码
示例:
  1. SELECT employees.name, departments.department_name
  2. FROM employees
  3. RIGHT JOIN departments
  4. ON employees.department_id = departments.department_id;
复制代码
(四)全毗连

MySQL 本身不直接支持 FULL OUTER JOIN,但可以通过利用 UNION 来模仿全毗连。全毗连返回两个表中全部的纪录,岂论是否有匹配。
语法:
  1. SELECT column1, column2, ...FROM table1LEFT JOIN table2ON table1.column = table2.columnUNIONSELECT column1, column2, ...
  2. FROM table1
  3. RIGHT JOIN table2
  4. ON table1.column = table2.column;
复制代码
示例:
  1. SELECT employees.name, departments.department_nameFROM employeesLEFT JOIN departmentsON employees.department_id = departments.department_idUNIONSELECT employees.name, departments.department_name
  2. FROM employees
  3. RIGHT JOIN departments
  4. ON employees.department_id = departments.department_id;
复制代码


  • 功能: 查询全部员工和全部部门信息。包罗那些没有匹配的员工或部门,未匹配的部分将表现为 NULL。
(五)交叉毗连

交叉毗连会返回两个表的笛卡尔积,即两个表中的每一条纪录都会和另一个表的全部纪录进行组合。除非有特别需求,否则交叉毗连通常会产生大量数据,不常利用。
语法:
  1. SELECT column1, column2, ...
  2. FROM table1
  3. CROSS JOIN table2;
复制代码
示例:
  1. SELECT employees.name, departments.department_name
  2. FROM employees
  3. CROSS JOIN departments;
复制代码


  • 功能: 返回全部员工和全部部门的全部可能组合,不管他们是否有现实关系。
(六)自毗连

自毗连是指在同一个表中进行毗连查询,通常用于比力同一表中差别纪录之间的关系。
语法:
  1. SELECT a.column1, b.column2
  2. FROM table a, table b
  3. WHERE a.some_column = b.some_column;
复制代码
示例:
  1. SELECT e1.name AS employee_name, e2.name AS manager_name
  2. FROM employees e1,employees e2
  3. ON e1.manager_id = e2.employee_id;
复制代码


  • 功能: 查询员工及其经理姓名。这里员工表通过自毗连实现了员工与经理的对应关系。
(七)多表毗连

MySQL 支持在一个查询中毗连多个表,通过多个 JOIN 子句可以实现多表毗连。
语法:
  1. SELECT column1, column2, ...
  2. FROM table1
  3. INNER JOIN table2 ON table1.column = table2.column
  4. LEFT JOIN table3 ON table2.column = table3.column;
复制代码
示例:
  1. SELECT e.name, d.department_name, p.project_name
  2. FROM employees e
  3. INNER JOIN departments d ON e.department_id = d.department_id
  4. LEFT JOIN projects p ON e.project_id = p.project_id;
复制代码


  • 功能: 查询员工的姓名、部门名称及其参与的项目。假如某个员工没有对应的项目,项目名将表现为 NULL。
(八)留意事项



  • 毗连查询性能在大数据量时可能会受到影响,优化时可以通过添加索引来提高查询速度。
  • 确保 ON 条件中的列有得当的匹配,以避免查询返回错误的数据集或产生过多的空值(NULL)。
  • 在编写复杂毗连查询时,应尽量简化表之间的关系,避免产生不必要的笛卡尔积。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

罪恶克星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表