MySQL语句大全,面试官也难不倒我了。。。

MySQL查询语句全解

公众号:阿Q技术站

文章目录

  • MySQL查询语句全解
      • 一、条件查询
        • 1. 基本 `SELECT` 语句
        • 2. 使用 `WHERE` 子句进行条件查询
        • 3. 常用的条件运算符
        • 4. 使用 `AND` 和 `OR` 组合条件
        • 5. 使用 `IN` 和 `BETWEEN`
        • 6. 使用 `LIKE` 进行模糊查询
        • 7. 使用 `IS NULL` 和 `IS NOT NULL`
        • 综合示例
      • 二、排序
        • 1. 基本排序语句
        • 2. 指定排序顺序
        • 3. 按多列排序
        • 4. 使用别名排序
        • 5. 混合使用升序和降序
        • 6. 对计算列排序
        • 7. `ORDER BY` 与 `LIMIT` 结合使用
        • 8. `ORDER BY` 与 `GROUP BY` 结合使用
        • 综合示例
      • 三、聚合函数
        • 1. `COUNT()`
        • 2. `SUM()`
        • 3. `AVG()`
        • 4. `MAX()`
        • 5. `MIN()`
        • 6. `GROUP BY` 与聚合函数结合
        • 7. `HAVING` 子句
        • 综合示例
      • 四、分组
        • 基本语法
        • 1. 按部门分组并计算每个部门的员工数量
        • 2. 按部门分组并计算每个部门的平均工资
        • 3. 使用 `HAVING` 过滤分组结果
        • 4. 多列分组
        • 注意事项
      • 五、连接查询
        • 1. 内连接 (INNER JOIN)
        • 2. 左连接 (LEFT JOIN) 或左外连接 (LEFT OUTER JOIN)
        • 3. 右连接 (RIGHT JOIN) 或右外连接 (RIGHT OUTER JOIN)
        • 4. 全连接 (FULL JOIN) 或全外连接 (FULL OUTER JOIN)
        • 5. 自连接 (Self Join)
        • 6. 交叉连接 (CROSS JOIN)
      • 六、子查询
        • 1. 在 SELECT 语句中的子查询
        • 2. 在 FROM 子句中的子查询
        • 3. 在 HAVING 子句中的子查询
        • 4. 在 UPDATE 语句中的子查询
        • 5. 在 DELETE 语句中的子查询
        • 6. 相关子查询

一、条件查询

1. 基本 SELECT 语句
SELECT column1, column2 FROM table_name;

table_name 表中选择 column1column2 列。

2. 使用 WHERE 子句进行条件查询

WHERE 子句用于指定选择条件,只返回满足条件的记录。

示例

SELECT * FROM employees WHERE age > 30;

employees 表中选择所有年龄大于 30 的记录。

3. 常用的条件运算符
  • = : 等于
  • <>!= : 不等于
  • > : 大于
  • < : 小于
  • >= : 大于或等于
  • <= : 小于或等于

示例

SELECT * FROM products WHERE price <= 100;

products 表中选择价格小于或等于 100 的记录。

4. 使用 ANDOR 组合条件
  • AND:所有条件必须满足
  • OR:任一条件满足即可

示例

SELECT * FROM employees WHERE age > 30 AND department = 'HR';

employees 表中选择年龄大于 30 且部门为 ‘HR’ 的记录。

SELECT * FROM employees WHERE age > 30 OR department = 'HR';

employees 表中选择年龄大于 30 或部门为 ‘HR’ 的记录。

5. 使用 INBETWEEN
  • IN:匹配列表中的任一值
  • BETWEEN:在某个范围内

示例

SELECT * FROM employees WHERE department IN ('HR', 'IT', 'Finance');

employees 表中选择部门为 ‘HR’, ‘IT’ 或 ‘Finance’ 的记录。

SELECT * FROM products WHERE price BETWEEN 50 AND 100;

products 表中选择价格在 50 到 100 之间的记录。

6. 使用 LIKE 进行模糊查询

LIKE 用于在 WHERE 子句中进行模糊查询,常与 %_ 通配符一起使用。

  • %:表示零个或多个字符
  • _:表示一个字符

示例

SELECT * FROM employees WHERE name LIKE 'J%';

employees 表中选择名称以 ‘J’ 开头的记录。

SELECT * FROM employees WHERE name LIKE 'J_n';

employees 表中选择名称为三个字符且以 ‘J’ 开头,中间任意一个字符,结尾为 ‘n’ 的记录。

7. 使用 IS NULLIS NOT NULL
  • IS NULL:检查某列是否为 NULL
  • IS NOT NULL:检查某列是否不为 NULL

示例

SELECT * FROM employees WHERE manager_id IS NULL;

employees 表中选择 manager_idNULL 的记录。

SELECT * FROM employees WHERE manager_id IS NOT NULL;

employees 表中选择 manager_id 不为 NULL 的记录。

综合示例
SELECT name, department, salary
FROM employees
WHERE age > 30 AND department IN ('HR', 'IT');

employees 表中选择年龄大于 30 且部门为 ‘HR’ 或 ‘IT’ 的员工姓名、部门和工资。

二、排序

1. 基本排序语句

ORDER BY 子句用于按指定的列对查询结果进行排序。默认情况下,排序是升序的。

示例

SELECT * FROM employees ORDER BY salary;

employees 表中选择所有记录,并按 salary 升序排序。

2. 指定排序顺序

可以使用 ASC 指定升序,或使用 DESC 指定降序。

示例

SELECT * FROM employees ORDER BY salary DESC;

employees 表中选择所有记录,并按 salary 降序排序。

3. 按多列排序

可以按多列排序,先按第一列排序,再按第二列排序,以此类推。

示例

SELECT * FROM employees ORDER BY department, salary DESC;

employees 表中选择所有记录,先按 department 升序排序,再按 salary 降序排序。

4. 使用别名排序

可以使用列的别名进行排序。

示例

SELECT name, salary AS employee_salary FROM employees ORDER BY employee_salary;

employees 表中选择 namesalary 列,并按 employee_salary 别名升序排序。

5. 混合使用升序和降序

可以在同一个查询中混合使用升序和降序。

示例

SELECT * FROM employees ORDER BY department ASC, salary DESC;

employees 表中选择所有记录,先按 department 升序排序,再按 salary 降序排序。

6. 对计算列排序

可以对计算列进行排序。

示例

SELECT name, salary, salary * 1.1 AS new_salary FROM employees ORDER BY new_salary;

employees 表中选择 namesalary 和计算列 new_salary,并按 new_salary 升序排序。

7. ORDER BYLIMIT 结合使用

可以将 ORDER BYLIMIT 子句结合使用,获取排序后的前几条记录。

示例

SELECT * FROM employees ORDER BY salary DESC LIMIT 5;

employees 表中选择所有记录,并按 salary 降序排序,仅返回前五条记录。

8. ORDER BYGROUP BY 结合使用

可以将 ORDER BYGROUP BY 子句结合使用,先分组再排序。

示例

SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ORDER BY avg_salary DESC;

employees 表中选择 department 和平均 salary,按 department 分组,并按平均 salary 降序排序。

综合示例
SELECT department, name, salary
FROM employees
WHERE age > 30
ORDER BY department ASC, salary DESC;

employees 表中选择 departmentnamesalary,仅返回年龄大于 30 的员工记录,先按 department 升序排序,再按 salary 降序排序。

三、聚合函数

1. COUNT()

计算表中记录的数量,通常用于计数满足条件的行数。

示例

SELECT COUNT(*) FROM employees;

计算 employees 表中的总行数。

2. SUM()

计算指定列的总和,通常用于数值列。

示例

SELECT SUM(salary) FROM employees;

计算 employees 表中 salary 列的总和。

3. AVG()

计算指定列的平均值,通常用于数值列。

示例

SELECT AVG(salary) FROM employees;

计算 employees 表中 salary 列的平均值。

4. MAX()

返回指定列的最大值。

示例

SELECT MAX(salary) FROM employees;

返回 employees 表中 salary 列的最大值。

5. MIN()

返回指定列的最小值。

示例

SELECT MIN(salary) FROM employees;

返回 employees 表中 salary 列的最小值。

6. GROUP BY 与聚合函数结合

GROUP BY 子句用于将结果集按一个或多个列进行分组,然后对每个分组应用聚合函数。

示例

SELECT department, AVG(salary) 
FROM employees 
GROUP BY department;

department 分组,并计算每个部门的平均 salary

7. HAVING 子句

HAVING 子句用于过滤分组后的结果,常与 GROUP BY 子句结合使用。

示例

SELECT department, AVG(salary) 
FROM employees 
GROUP BY department 
HAVING AVG(salary) > 50000;

department 分组,并筛选出平均 salary 大于 50000 的部门。

综合示例
SELECT department, COUNT(*), AVG(salary), MAX(salary), MIN(salary) 
FROM employees 
GROUP BY department;

department 分组,并返回每个部门的员工数、平均 salary、最高 salary 和最低 salary

四、分组

在 MySQL 中,分组操作可以通过 GROUP BY 子句来实现,它用于将结果集按一个或多个列进行分组。分组后,您可以对每个分组应用聚合函数,如 COUNT()SUM()AVG()MAX()MIN() 等。下面是详细的解释和示例。

基本语法
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ...;

示例

假设有一个名为 employees 的表,结构如下:

CREATE TABLE employees (id INT,name VARCHAR(50),department VARCHAR(50),salary DECIMAL(10, 2)
);
1. 按部门分组并计算每个部门的员工数量
SELECT department, COUNT(*) AS num_employees
FROM employees
GROUP BY department;

输出示例:

+------------+---------------+
| department | num_employees |
+------------+---------------+
| HR         | 10            |
| Sales      | 15            |
| IT         | 20            |
+------------+---------------+
2. 按部门分组并计算每个部门的平均工资
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

输出示例:

+------------+------------+
| department | avg_salary |
+------------+------------+
| HR         | 50000.00   |
| Sales      | 60000.00   |
| IT         | 70000.00   |
+------------+------------+
3. 使用 HAVING 过滤分组结果

HAVING 子句用于过滤分组后的结果,与 WHERE 子句不同的是,HAVING 作用于聚合后的结果。

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 55000;

输出示例:

+------------+------------+
| department | avg_salary |
+------------+------------+
| Sales      | 60000.00   |
| IT         | 70000.00   |
+------------+------------+
4. 多列分组

您可以根据多个列进行分组。

SELECT department, name, SUM(salary) AS total_salary
FROM employees
GROUP BY department, name;

输出示例:

+------------+---------+--------------+
| department | name    | total_salary |
+------------+---------+--------------+
| HR         | Alice   | 30000.00     |
| HR         | Bob     | 20000.00     |
| Sales      | Carol   | 40000.00     |
| Sales      | Dave    | 20000.00     |
| IT         | Eve     | 50000.00     |
| IT         | Frank   | 20000.00     |
+------------+---------+--------------+
注意事项
  1. GROUP BY 子句中的列应当出现在 SELECT 语句中,除非使用聚合函数。
  2. HAVING 子句用于过滤聚合后的结果,而 WHERE 子句用于过滤聚合前的数据。
  3. GROUP BY 子句会影响查询的性能,尤其是大数据集上,优化索引和查询非常重要。

五、连接查询

1. 内连接 (INNER JOIN)

内连接返回两个表中满足连接条件的交集记录。

SELECT a.column1, b.column2
FROM table1 a
INNER JOIN table2 b
ON a.common_column = b.common_column;

示例:

SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
2. 左连接 (LEFT JOIN) 或左外连接 (LEFT OUTER JOIN)

左连接返回左表的所有记录及右表中满足连接条件的记录,没有匹配的记录则结果中包含NULL。

SELECT a.column1, b.column2
FROM table1 a
LEFT JOIN table2 b
ON a.common_column = b.common_column;

示例:

SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
3. 右连接 (RIGHT JOIN) 或右外连接 (RIGHT OUTER JOIN)

右连接返回右表的所有记录及左表中满足连接条件的记录,没有匹配的记录则结果中包含NULL。

SELECT a.column1, b.column2
FROM table1 a
RIGHT JOIN table2 b
ON a.common_column = b.common_column;

示例:

SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
4. 全连接 (FULL JOIN) 或全外连接 (FULL OUTER JOIN)

全连接返回左右表中所有记录,无论是否满足连接条件,不支持在MySQL中,可以通过左连接和右连接的联合实现。

SELECT a.column1, b.column2
FROM table1 a
LEFT JOIN table2 b
ON a.common_column = b.common_column
UNION
SELECT a.column1, b.column2
FROM table1 a
RIGHT JOIN table2 b
ON a.common_column = b.common_column;

示例:

SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id
UNION
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
5. 自连接 (Self Join)

自连接是指一个表与自身的连接,常用于树状数据结构的查询。

SELECT a.column1, b.column2
FROM table1 a
INNER JOIN table1 b
ON a.common_column = b.common_column;

示例:

SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
INNER JOIN employees e2
ON e1.manager_id = e2.id;
6. 交叉连接 (CROSS JOIN)

交叉连接返回两个表的笛卡尔积,即所有可能的记录组合。

SELECT a.column1, b.column2
FROM table1 a
CROSS JOIN table2 b;

示例:

SELECT employees.name, departments.department_name
FROM employees
CROSS JOIN departments;

六、子查询

MySQL 子查询是指在另一个 SQL 语句中嵌套的查询,通常用于复杂查询场景。子查询可以出现在 SELECT、INSERT、UPDATE、DELETE 语句中的 WHERE、HAVING、FROM 子句等位置。

1. 在 SELECT 语句中的子查询
SELECT column1
FROM table1
WHERE column2 = (SELECT column2 FROM table2 WHERE condition);

示例:

SELECT name
FROM employees
WHERE department_id = (SELECT id FROM departments WHERE name = 'Sales');

此查询返回所有属于“Sales”部门的员工名字。

2. 在 FROM 子句中的子查询

子查询作为临时表使用:

SELECT a.column1, b.column2
FROM (SELECT column1, column2 FROM table1) a
JOIN table2 b ON a.column1 = b.column1;

示例:

SELECT dept_employee.name, department.total_sales
FROM (SELECT id, name FROM employees) AS dept_employee
JOIN (SELECT department_id, SUM(sales) AS total_sales FROM sales GROUP BY department_id) AS department
ON dept_employee.id = department.department_id;
3. 在 HAVING 子句中的子查询
SELECT column1, SUM(column2)
FROM table1
GROUP BY column1
HAVING SUM(column2) > (SELECT AVG(column2) FROM table1);

示例:

SELECT department_id, SUM(salary)
FROM employees
GROUP BY department_id
HAVING SUM(salary) > (SELECT AVG(salary) FROM employees);

此查询返回总薪资高于平均薪资的部门 ID 和其总薪资。

4. 在 UPDATE 语句中的子查询
UPDATE table1
SET column1 = (SELECT expression FROM table2 WHERE condition)
WHERE condition;

示例:

UPDATE employees
SET salary = (SELECT AVG(salary) FROM employees)
WHERE department_id = 1;

此查询将部门 ID 为 1 的员工薪资设置为公司平均薪资。

5. 在 DELETE 语句中的子查询
DELETE FROM table1
WHERE column1 = (SELECT column1 FROM table2 WHERE condition);

示例:

DELETE FROM employees
WHERE department_id = (SELECT id FROM departments WHERE name = 'HR');

此查询删除属于“HR”部门的所有员工记录。

6. 相关子查询

相关子查询依赖于外部查询中的数据:

SELECT column1
FROM table1
WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.column2 = table2.column2);

示例:

SELECT e.name
FROM employees e
WHERE EXISTS (SELECT 1 FROM departments d WHERE e.department_id = d.id AND d.name = 'HR');

此查询返回所有属于“HR”部门的员工名字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全--安全设备(三)IPS

IPS入侵防御系统 一、IPS基础&#xff08;1&#xff09;IPS是什么&#xff1f;&#xff08;2&#xff09;入侵防御系统&#xff08;IPS&#xff09;的底层原理&#xff08;3&#xff09;IPS工作流程&#xff08;4&#xff09;IPS威胁防范方法&#xff08;6&#xff09;IPS和IDS…

美团校招机试 - 小美的平衡矩阵(20240309-T1)

题目来源 美团校招笔试真题_小美的平衡矩阵 题目描述 小美拿到了一个 n * n 的矩阵&#xff0c;其中每个元素是 0 或者 1。 小美认为一个矩形区域是完美的&#xff0c;当且仅当该区域内 0 的数量恰好等于 1 的数量。 现在&#xff0c;小美希望你回答有多少个 i * i 的完美…

redis哨兵模式(Redis Sentinel)

哨兵模式的背景 当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这就需要人工干预&#xff0c;费事费力&#xff0c;还会造成一段时间内服务不可用。这不是一种推荐的方式。 为了解决单点故障和提高系统的可用性&#xff0c;需要一种自动化的监…

固态硬盘与机械硬盘之间的区别

固态硬盘与机械硬盘之间有哪些方面的区别呢&#xff1f; 固态硬盘和机械硬盘在容量方面就有着一定的区别&#xff0c;固态硬盘主要是半导体存储&#xff0c;通常是直接存储在闪存颗粒当中&#xff0c;因为每个闪存颗粒的容量是有限的&#xff0c;所以固态硬盘的存储容量相对小一…

暑假本科生、研究生怎么学?来看详细的AI夏令营规划

Datawhale夏令营 发布&#xff1a;2024 AI 夏令营 学习规划 「学习内容详览」 01机器学习方向&#xff1a;2024/7/1~7/7 「Datawhale」邀请想入门人工智能领域并实践机器学习算法的学习者和我们一起来学习~ 详细学习规划如下&#xff1a; 02大模型技术方向&#xff1a;2024/7…

基于springboot、vue汽车租赁系统

设计技术&#xff1a; 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatisvue工具&#xff1a;IDEA、Maven、Navicat 主要功能&#xff1a; 用户进入系统可以查看首页、个人中心、车辆信息管理、租赁订单列表管理、还车记录管理等操作 管理…

SAP-创建预留和采购申请

METHOD zyc_ii_si_data_dump_in~si_data_dump_in. "反馈 DATA: output_hd TYPE zmmi005_dt_mesg_hd, output_body TYPE zun_dt_un_resp_msgbd_tab, output_line TYPE zun_dt_un_resp_msgbd. DATA: r_obj TYPE REF TO zun_co_si_un_resp_out, out TYPE zun_mt_un_resp. * T…

串级PID控制算原理及法详解

文章目录 1. PID 2. 串级PID 3. 串级PID的物理量 4. C语言实现单极PID 5. C语言实现串极PID 6. 模拟仿真 1. PID PID是应用最广泛的闭环控制方法之一&#xff0c;是一种常用的反馈控制方法&#xff0c;对于每个PID控制器由三个部分组成&#xff1a;比例控制&#xff08;…

自然语言处理——英文文本预处理

高质量数据的重要性 数据的质量直接影响模型的性能和准确性。高质量的数据可以显著提升模型的学习效果&#xff0c;帮助模型更准确地识别模式、进行预测和决策。具体原因包括以下几点&#xff1a; 噪音减少&#xff1a;高质量的数据经过清理&#xff0c;减少了无关或错误信息…

Wp-scan一键扫描wordpress网页(KALI工具系列三十)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

《梦醒蝶飞:释放Excel函数与公式的力量》6.1 DATE函数

6.1 DATE函数 第一节&#xff1a;DATE函数 1&#xff09;DATE函数概述 DATE函数是Excel中的一个内置函数&#xff0c;用于根据指定的年、月、日返回对应的日期序列号。这个函数非常有用&#xff0c;尤其是在处理日期数据时&#xff0c;它可以帮助你构建特定的日期&#xff0…

pycharm工具回退键调出

pycharm工具调出回退键。 View->Appearance->Toolbar,即可调出 调不出的可以使用快捷键&#xff1a;ctrlalt向左箭头 但是这个快捷键容易和电脑屏幕旋转冲突。可将电脑的快捷键关掉&#xff0c;即可。 ctrlalt向上箭头&#xff1a;将屏幕旋转到正常&#xff08;横向&am…

【面试干货】final、finalize 和 finally 的区别

【面试干货】final、finalize 和 finally 的区别 1、final1.1 修饰类1.2 修饰方法1.3 修饰变量 2、finally3、finalize4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;final、finalize和finally都是关键…

汽车免拆诊断案例 | 2016 款吉利帝豪EV车无法加速

故障现象 一辆2016款吉利帝豪EV车&#xff0c;累计行驶里程约为28.4万km&#xff0c;车主反映车辆无法加速。 故障诊断 接车后路试&#xff0c;行驶约1 km&#xff0c;踩下加速踏板&#xff0c;无法加速&#xff0c;车速为20 km/h左右&#xff0c;同时组合仪表上的电机及控制…

设备驱动框架之LED

文章目录 前言一、什么是驱动框架二、使用步骤1.注册LED设备2.卸载LED设备3.内核中申请内存4.container_of5.platform_get_drvdata 和 platform_set_drvdata6.module_platform_driver 三、驱动示例总结 前言 为了尽量降低驱动开发者难度以及接口标准化&#xff0c;就出现了设备…

面试-Java线程池

1.利用Excutors创建不同的线程池满足不同场景的需求 分析&#xff1a; 如果并发的请求的数量非常多&#xff0c;但每个线程执行的时间非常短&#xff0c;这样就会频繁的创建和销毁线程。如此一来&#xff0c;会大大降低系统的效率。 可能出现&#xff0c;服务器在为每个线程创建…

Docker创建容器时提示 [Warning] IPv4 forwarding is disabled. Networking will not work.

解决办法 1. 在docker的宿主机中更改以下文件&#xff1a; [rootlocalhost ~]# vi /usr/lib/sysctl.d/00-system.conf2. 添加如下代码&#xff1a; net.ipv4.ip_forward13. 重启network服务&#xff1a; systemctl restart network

Lua 垃圾回收

Lua 垃圾回收 Lua 是一种轻量级的编程语言&#xff0c;广泛用于游戏开发、脚本编写和其他应用程序。Lua 的设计哲学是简单和高效&#xff0c;这同样体现在它的内存管理机制中。在 Lua 中&#xff0c;垃圾回收&#xff08;Garbage Collection&#xff0c;简称 GC&#xff09;是…

利用powershell开展网络钓鱼

要确保人们打开我们的恶意文件并执行它们&#xff0c;我们只需让微软努力工作多年来赢得人们的信任&#xff0c;然后将一些危险的宏插入到幻灯片中。 本博文将介绍如何通过屏幕顶部的一个友好的警告提示&#xff0c;在用户启用宏后立即运行您的宏。 首先&#xff0c;我们需要打…

【面向对象】复习(四)

const构不构成重载 C 加const能不能构成重载的几种情况_多个const修饰可以重载吗-CSDN博客