当前位置: 首页 > news >正文

MySQL查询语句详解

一、SQL 基础操作

1. 数据库与表的基本查询

-- 查询当前数据库
SELECT DATABASE();-- 查看数据库中所有表
SHOW TABLES;-- 查看表结构(字段、类型、约束等)
DESC tableName;
-- 或
SHOW COLUMNS FROM tableName;-- 查看表的创建语句(包含完整结构和约束)
SHOW CREATE TABLE tableName;

2. 数据查询基本语法

SELECT [DISTINCT]1,2, ...  -- 要查询的列(DISTINCT用于去重)
FROM 表名                        -- 数据来源表
WHERE 条件                        -- 筛选行的条件
GROUP BY1,2, ...           -- 按列分组
HAVING 分组后的筛选条件           -- 对分组结果进一步筛选
ORDER BY1 [ASC|DESC], ...     -- 按列排序(ASC升序,DESC降序,默认升序)
LIMIT 数量;                      -- 限制返回结果条数
示例:
-- 查询所有员工信息
SELECT * FROM Employees;-- 查询指定列(姓名、姓氏)
SELECT FirstName, LastName FROM Employees;-- 条件查询(年龄大于30的员工)
SELECT * FROM Employees WHERE Age > 30;-- 排序(按姓氏升序)
SELECT * FROM Employees ORDER BY LastName ASC;

3. 别名与去重

  • 别名:为列或表起简化名称,增强可读性

    -- 列别名(AS可省略)
    SELECT employee_id AS e_id, name AS emp_name FROM list;
    
  • 去重:使用DISTINCT去除重复记录(对查询的所有列联合去重)

    -- 查询所有不重复的部门ID
    SELECT DISTINCT department_id FROM Employees;
    

二、子查询(嵌套查询)

子查询是嵌套在其他 SQL 语句中的查询,用于更灵活地筛选数据。根据返回结果的结构,可分为以下几类:

1. 标量子查询

返回单行单列的结果(如一个数字、一个值),可作为条件使用比较运算符(>、<、=、>=、<=)。

-- 示例:查询工资高于平均工资的员工
SELECT name, salary
FROM WORK
WHERE salary > (SELECT AVG(salary) FROM WORK)  -- 子查询返回平均工资(单行单列)
ORDER BY salary DESC;

2. 列子查询

返回多行单列的结果(一个列表),需配合IN、ANY、ALL等操作符使用。

  • IN:判断值是否在子查询结果中(多选一)
  • NOT IN:与IN相反
  • ANY/SOME:与子查询返回的任意一个值满足条件
  • ALL:与子查询返回的所有值都满足条件
-- 示例:查询缺席天数为2或3的员工
SELECT * FROM WORK
WHERE name IN (SELECT name FROM WORK WHERE absence = 3 OR absence = 2  -- 子查询返回符合条件的姓名列表
);

3. 行子查询

返回单行多列的结果(一条记录),通常用于多列条件匹配。

-- 示例:查询与"employee 19"缺席天数相同的员工
SELECT * FROM WORK
WHERE (absence) = (  -- 子查询返回单行单列(此处简化为单行单列,多行多列需用括号包裹多列)SELECT absence FROM WORK WHERE name = 'employee 19'
);

4. 子查询作为临时表

当子查询返回多行多列时,可将其视为临时表,与主表进行连接查询。

-- 示例:查询2011-11-11后入职的员工及其部门信息
SELECT * 
FROM dept t1, (SELECT * FROM emp WHERE join_date > '2011-11-11'  -- 子查询作为临时表t2
) t2
WHERE t1.id = t2.dept_id;  -- 关联临时表与部门表

三、连接查询(表关联)

连接查询用于组合多个表的数据,根据关联方式不同可分为内连接、外连接等。

1. 内连接(INNER JOIN)

只返回两个表中匹配连接条件的记录(交集)。

  • 显式内连接(推荐,可读性强):

    SELECT1.,2.FROM1
    INNER JOIN2 ON1.连接列 =2.连接列;  -- ON指定连接条件
    
  • 隐式内连接(通过 WHERE 指定连接条件):

    SELECT1.,2.FROM1,2
    WHERE1.连接列 =2.连接列;  -- WHERE同时承担连接和筛选功能
    
示例:
-- 查询员工姓名及其所属部门名称
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

2. 外连接

返回一个表的所有记录,以及另一个表中匹配的记录(不匹配的部分用NULL填充)。

  • 左外连接(LEFT JOIN):返回左表(FROM后的表)所有记录,右表(JOIN后的表)匹配记录

    SELECT employees.name, departments.department_name
    FROM employees
    LEFT JOIN departments ON employees.department_id = departments.id;
    
  • 右外连接(RIGHT JOIN):返回右表所有记录,左表匹配记录

    SELECT employees.name, departments.department_name
    FROM employees
    RIGHT JOIN departments ON employees.department_id = departments.id;
    
  • 全外连接(FULL JOIN):返回左表和右表所有记录(不匹配的部分用NULL填充)
    注意:MySQL 不直接支持FULL JOIN,可通过LEFT JOIN + UNION + RIGHT JOIN模拟

    SELECT employees.name, departments.department_name
    FROM employees
    FULL JOIN departments ON employees.department_id = departments.id;
    
http://www.lryc.cn/news/606575.html

相关文章:

  • 常见的中间件漏洞练习教程
  • python每日一题练习---简单题目
  • kafka使用kraft
  • 第二篇:Three.js核心三要素:场景、相机、渲染器
  • AscendantPath | 实现视觉小说的人物对话系统(二)
  • 嵌入式开发学习———Linux环境下IO进程线程学习(一)
  • 分布内侧内嗅皮层的层Ⅱ或层Ⅲ的网格细胞(grid cells)对NLP中的深层语义分析的积极影响和启示
  • 什么是数据集成?和数据融合有什么区别?
  • AI陪伴的发展现状
  • Linux应用开发基础知识——Makefile初级教程(九)
  • 20250731解决RK3588的AIOT参考设计刷机之后可以启动但是断电进MASKROM模式
  • Ⅹ—6.计算机二级综合题19---22套
  • flowable对已经部署的流程进行更新,不产生新版本
  • anaconda searchanaconda show | conda 检索包资源安装指定版本包指定源安装命令package
  • Java学习------Executor框架
  • 数据结构:多项式表示(polynomial representation)
  • 力扣 Pandas 挑战(6)---数据合并
  • 从零开始搞定类和对象(上)
  • Pycaita二次开发基础代码解析:曲面法线生成、零件加载与材料应用
  • stm32F407 实现有感BLDC 六步换相 cubemx配置及源代码(一)
  • MySQL 中的聚簇索引和非聚簇索引的区别
  • 【STM32】HAL库中的实现(一)GPIO/SysTick/EXTI
  • Cesium 快速入门(五)坐标系
  • 【JavaEE】(7) 网络原理 TCP/IP 协议
  • Python 环境配置
  • React的介绍和特点
  • 学习曲线之TS
  • 检索召回率优化探究二:基于 LangChain 0.3集成 Milvus 2.5向量数据库构建的智能问答系统
  • 结构体、共用体,位运算
  • MPU6050模块