MySQL笔记-基础篇(一):查询

博客主页: 南来_北往

系列专栏:Spring Boot实战


MySQL是一种广泛使用的关系型数据库管理系统,它基于结构化查询语言(SQL)来管理和操作数据。下面将依次探讨MySQL查询的各个方面,确保理解扎实,能够在实际工作中运用。具体分析如下:

  1. 基础查询语句

    • 查询字段:在MySQL中,查询一个或多个字段是最基本的操作。可以通过SELECT语句实现这一点。例如,查询单个字段"last_name"可以使用"SELECT last_name FROM employees;"。若要查询多个字段,比如"last_name"和"first_name",则可以使用"SELECT last_name, first_name FROM employees;"。
    • 查询所有字段:如果需要查询表中的所有字段,可以使用星号(*)通配符。例如,查询employees表的所有字段可以写作"SELECT * FROM employees;"。
    • 查询常量和表达式:除了查询字段外,还可以查询常量值和表达式的结果。比如,"SELECT 10 AS constant;"将返回一个名为constant的列,包含数值10。对于表达式,例如"SELECT 100 / 9 AS result;"将会计算该表达式并返回结果。
    • 查询函数:MySQL支持在查询中使用函数。如使用版本信息函数"SELECT VERSION();"将返回数据库的版本信息。
    • 起别名:在查询时可以为字段或表达式设置别名,以提高结果集的可读性。使用AS关键字为字段设置别名,如"SELECT last_name AS surname, first_name AS forename FROM employees;"。如果不使用AS,可以直接在字段名后跟上别名,例如"SELECT last_name surname, first_name forename FROM employees;"。
  2. 条件查询

    • 按条件表达式筛选:通过在WHERE子句中指定条件来筛选数据。例如,要找出salary大于12000的员工信息,可以使用"SELECT * FROM employees WHERE salary > 12000;"。
    • 按逻辑表达式筛选:可以使用逻辑运算符构建更复杂的筛选条件。比如,查询工资在10000到20000之间的员工信息,可以使用"SELECT last_name, salary, commission_pct FROM employees WHERE salary >= 10000 AND salary <= 20000;"。
    • 模糊查询:LIKE运算符允许进行模糊匹配,通常与通配符一起使用。例如,要查找last_name字段中包含字母"a"的所有员工信息,可以使用"SELECT * FROM employees WHERE last_name LIKE '%a%';"。
    • BETWEEN AND范围查询:BETWEEN AND用于查询在指定范围内的值。例如,要选择employee_id在100到120之间的员工信息,可以使用"SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;"。
    • IN列表查询:IN操作符允许指定一个值列表,查询某个字段是否在这些值中的记录。比如,要找出job_id为'IT_PROG'或'AD_VP'的员工信息,可以写作"SELECT last_name, job_id FROM employees WHERE job_id IN ('IT_PROG', 'AD_VP');"。
    • NULL值处理:IS NULL和IS NOT NULL操作符可以用来判断字段值是否为NULL。例如,要找出没有奖金的员工信息,可以使用"SELECT last_name FROM employees WHERE commission_pct IS NULL;"。
  3. 排序和分页查询

    • 排序查询:使用ORDER BY子句可以根据一个或多个字段对结果集进行排序。例如,要按照salary降序排列员工信息,可以写为"SELECT * FROM employees ORDER BY salary DESC;"。
    • 分页查询:当结果集较大时,为了方便查看,可以使用LIMIT子句进行分页。假设每页显示10条记录,要查询第3页的内容,可以使用"SELECT * FROM employees ORDER BY salary DESC LIMIT 20, 10;"这样会跳过前20条记录,然后取得接下来的10条。
  4. 复杂查询

    • 聚合函数:聚合函数能够对一组值执行计算,返回单个值。常用的聚合函数包括COUNT、SUM、AVG、MAX和MIN。比如,要统计每个部门的员工数量,可以使用"SELECT department_id, COUNT(*) FROM employees GROUP BY department_id;"。
    • 分组查询:使用GROUP BY子句可以根据一个或多个列将结果集划分成组。在进行分组查询时,SELECT子句中的非聚合列通常是GROUP BY子句中的列。例如,查询每个部门平均工资可以使用"SELECT department_id, AVG(salary) AS average_salary FROM employees GROUP BY department_id;"。
    • HAVING子句筛选:HAVING子句用于在GROUP BY查询中添加筛选条件,类似于WHERE子句,但作用于组,而非个别记录。例如,要找出平均工资大于30000的部门,可以使用"SELECT department_id, AVG(salary) AS average_salary FROM employees GROUP BY department_id HAVING AVG(salary) > 30000;"。
  5. 联查查询

    • 内连接:内连接(INNER JOIN)只返回两个表中匹配条件的记录。例如,如果有两个表employees和departments,想查询所有员工及其对应的部门信息,可以使用"SELECT employees.last_name, employees.department_id, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.department_id;"。
    • 外连接:与内连接不同,外连接(OUTER JOIN)不仅返回匹配的记录,还返回其中一个表中不匹配的记录。例如,左外连接(LEFT OUTER JOIN)会返回左表(employees)的所有记录以及右表(departments)中匹配的记录。如果没有匹配,结果是NULL。其语法为"SELECT employees.last_name, employees.department_id, departments.department_name FROM employees LEFT OUTER JOIN departments ON employees.department_id = departments.department_id;"。
    • 自连接:自连接是同一个表内部的连接,通常用于比较表中的行或者找到满足特定关系的不同行。比如,要找出同一部门内员工薪水的差异,可以使用自连接。"SELECT e1.last_name AS employee1, e2.last_name AS employee2, ABS(e1.salary - e2.salary) AS salary_difference FROM employees e1 JOIN employees e2 ON e1.department_id = e2.department_id WHERE e1.employee_id != e2.employee_id;"。
  6. 子查询

    • 单行子查询:子查询是嵌套在另一个SQL查询中的查询,可以放在WHERE或HAVING子句中,也可以作为表达式的一部分。单行子查询是指只返回一个值的子查询。例如,要找出薪水最高的员工信息,主查询会使用子查询返回的最高薪水作为参照:"SELECT last_name, salary FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);"。
    • 多行子查询:多行子查询返回一组值,可以使用IN操作符来检查主查询中的值是否在子查询返回的值列表中。例如,查找所有属于部门名称为"Sales"的员工的详细信息:"SELECT last_name, department_id FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');"。
    • 关联子查询:关联子查询是指子查询引用了外部查询中的表。这种类型的子查询可以根据外部查询的每一行动态地生成结果。例如,要找出每个员工的工资等级(即比该员工工资高的员工的数目),可以使用:"SELECT last_name, salary, (SELECT COUNT(*) FROM employees e2 WHERE e2.salary > e1.salary) AS salary_rank FROM employees e1;"。

掌握MySQL的基础查询是理解和使用数据库的重要步骤。从简单的字段查询到复杂的子查询和连接查询,每种查询都有其特定的应用场景和功能。此外,各种查询相关的注意事项也需要特别留心:

  • 注释的重要性:在编写复杂的SQL查询时,不要忘记利用注释来提高代码的可读性和维护性。MySQL中可以使用"--"为单行注释,"/* */"为多行注释。
  • 字符集和校对:在设计数据库和写入查询时应注意字符集和校对规则的选择,以确保正确处理不同语言和编码的文本数据。
  • 索引的使用:了解何时使用索引能大幅提高查询性能,特别是在处理大量数据时。创建合适的索引可以加快检索速度,但同时也会影响数据的更新操作和占用额外的存储空间。
  • 安全性考虑:在公开的查询中避免直接暴露敏感信息,同时合理配置用户权限,防止未授权的数据访问或改动。

综上所述,MySQL查询是数据库操作的核心内容之一,它不仅涉及基本的SELECT语句,还包括复杂的连接、聚合和子查询等高级用法。要想熟练掌握这些技能,除了理论学习之外,实践操作同样重要。建议定期进行练习,并通过案例分析来深化理解。随着经验的积累,你将能够更加高效地利用MySQL进行数据管理和信息提取。

相关推荐
麦壳饼2 小时前
INSERT INTO:向时序表写入数据
数据库·sonnetdb
七夜zippoe2 小时前
多 Agent 协作架构:Supervisor 模式——主管 Agent 调度实战
数据库·ai·架构·agent
我不会起名字3222 小时前
Redis 缓存与数据库一致性:先删缓存还是先更新库的 4 种方案
数据库·redis·缓存·一致性·延迟双删
星恒随风2 小时前
Linux进程基础(二):进程调度、上下文切换、O(1)调度器、环境变量与虚拟地址空间
linux·笔记·学习·状态模式
for_ever_love__2 小时前
MySQL 锁与死锁讲透:行锁、间隙锁、Next-Key Lock 与排查方法
mysql·lock·行锁·死锁·间隙锁·排查·next-key
在繁华处2 小时前
1.2 Harness 工程:模型之外的竞争
数据库
云贝贝贝2 小时前
【无标题】TDSQL 分片键怎么选?选错等于数据倾斜加跨分片慢查询
运维·服务器·数据库·腾讯云
IvorySQL2 小时前
VACUUM FULL 之后 ROWID 就废了? IvorySQL 兼容性实测
数据库·人工智能·ai·postgresql·开源
A.说学逗唱的Coke3 小时前
【人工智能专题】PolarDB 深度解析:存算分离到 AI Lakebase,云原生数据库的架构演进与实战指南
数据库·人工智能·云原生
我不会起名字3223 小时前
InnoDB 间隙锁与死锁:两个 UPDATE 互相等待的 3 个原因
数据库·mysql·事务·innodb·锁