MySql常用SQL命令详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、E-R模型</a></li><li><a href="#_label1">二、数据类型</a></li><li><a href="#_label2">三、字段命名规范</a></li><li><a href="#_label3">四、数据库创建与管理</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_0">4.1 创建数据库</a></li><li><a href="#_lab2_3_1">4.2 删除数据库</a></li><li><a href="#_lab2_3_2">4.3 列出数据库</a></li><li><a href="#_lab2_3_3">4.4 备份数据库</a></li><li><a href="#_lab2_3_4">4.5 还原数据库</a></li><li><a href="#_lab2_3_5">4.6 使用某个数据库</a></li></ul><li><a href="#_label4">五、数据表创建与管理</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_6">5.1 创建表</a></li><li><a href="#_lab2_4_7">5.2 查看表结构</a></li><li><a href="#_lab2_4_8">5.3 查看数据表</a></li><li><a href="#_lab2_4_9">5.4 复制表结构</a></li><li><a href="#_lab2_4_10">5.5 复制表数据</a></li><li><a href="#_lab2_4_11">5.6 修改表名</a></li><li><a href="#_lab2_4_12">5.7 增加字段</a></li><li><a href="#_lab2_4_13">5.8 删除字段</a></li><li><a href="#_lab2_4_14">5.9 修改字段数据类型</a></li><li><a href="#_lab2_4_15">5.10 修改字段名称</a></li><li><a href="#_lab2_4_16">5.11 设置主键</a></li><li><a href="#_lab2_4_17">5.12 删除主键</a></li><li><a href="#_lab2_4_18">5.13 设置外键</a></li><li><a href="#_lab2_4_19">5.14 删除外键</a></li></ul><li><a href="#_label5">六、数据更新操作</a></li><ul class="second_class_ul"><li><a href="#_lab2_5_20">6.1 插入记录(INSERT)</a></li><ul class="third_class_ul"><li><a href="#_label3_5_20_0">6.1.1 插入单条记录</a></li><li><a href="#_label3_5_20_1">6.1.2 插入多条记录</a></li><li><a href="#_label3_5_20_2">6.1.3 子查询插入多条记录</a></li></ul><li><a href="#_lab2_5_21">6.2 删除记录(DELETE)</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_5_22">6.3 更新记录(UPDATE)</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_5_23">⚠️ 重要提示</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label6">七、数据查询操作</a></li><ul class="second_class_ul"><li><a href="#_lab2_6_24">7.1 单表查询</a></li><ul class="third_class_ul"><li><a href="#_label3_6_24_3">7 .1.2 条件过滤(WHERE)</a></li><li><a href="#_label3_6_24_4">7.1.3 排序(ORDER BY)</a></li><li><a href="#_label3_6_24_5">7.1.4 聚集函数</a></li><li><a href="#_label3_6_24_6">7.1.5 分组(GROUP BY)</a></li></ul><li><a href="#_lab2_6_25">7.2 连接查询</a></li><ul class="third_class_ul"><li><a href="#_label3_6_25_7">7.2.1 简单连接(逗号分隔)</a></li><li><a href="#_label3_6_25_8">7.2.2 JOIN 连接</a></li></ul><li><a href="#_lab2_6_26">7.3 嵌套查询(子查询)</a></li><ul class="third_class_ul"><li><a href="#_label3_6_26_9">7.3.2 比较运算符</a></li><li><a href="#_label3_6_26_10">7.3.3ANY/ALL谓语</a></li><li><a href="#_label3_6_26_11">7.3.4EXISTS谓语</a></li></ul><li><a href="#_lab2_6_27">7.4 合并查询(UNION)</a></li><ul class="third_class_ul"><li><a href="#_label3_6_27_12">⚠️ 关键安全提示</a></li></ul></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、E-R模型</h2><p>实体-联系模型(E-R模型)提供了一种不受特定数据库管理系统(DBMS)约束的、面向用户的表达方法,在数据库设计中被广泛用作数据建模工具。在项目开发中,需提前使用E-R模型绘制ER图,以确保数据库结构清晰、合理。<br />DBMS 中的约束是用于强制限制可以插入、更新或删除到表中的数据或数据类型的一组规则。约束的整个目的是在执行更新、删除或插入操作时保持数据的完整性。</p>
<p><strong>约束的类型</strong></p>
<ol><li>非空约束 (Not Null Constraint):确保列中的值不能为NULL,防止插入或更新空值。</li><li>唯一约束 (Unique Constraint):确保表中某一列或多列的值是唯一的,但允许空值存在。</li><li>默认约束 (Default Constraint):为列指定默认值,当插入新行时如果没有为该列提供值,则使用默认值。</li><li>检查约束 (Check Constraint):定义对列值的条件限制,确保数据满足特定的条件或范围。</li><li>主键约束 (Primary Key Constraint):唯一标识表中的每一行数据,要求值唯一且非空。</li><li>外键约束 (Foreign Key Constraint):确保表之间的引用完整性,要求一个表的列值必须在另一个表的主键列中存在。</li></ol>
<blockquote><p>知识库中提到的"域约束"实际上是检查约束的功能描述,而"映射约束"不是标准的数据库约束类型。数据库中标准的约束类型为上述六种。</p></blockquote>
<p class="maodian"><a name="_label1"></a></p><h2>二、数据类型</h2>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010609164235.png" /></p>
<p class="maodian"><a name="_label2"></a></p><h2>三、字段命名规范</h2>
<ol><li><strong>命名组成</strong>:采用26个英文字母(区分大小写)、0-9数字(通常不使用)和下划线<code>_</code>,确保命名简洁明确,多单词用下划线分隔(如<code>user_id</code>)。</li><li><strong>大小写规范</strong>:统一使用小写字母(如<code>is_active</code>,而非<code>IsActive</code>)。</li><li><strong>禁用关键字</strong>:避免使用数据库保留字(如<code>table</code>、<code>time</code>、<code>datetime</code>、<code>primary</code>)。</li><li><strong>命名逻辑</strong>:字段名应为名词或动宾短语(如<code>user_id</code>、<code>is_valid</code>)。</li><li><strong>长度限制</strong>:名称需易读易懂,通常不超过三个英文单词(如 <code>order_date</code>,而非 <code>order_creation_timestamp</code>)。</li></ol>
<p class="maodian"><a name="_label3"></a></p><h2>四、数据库创建与管理</h2>
<p class="maodian"><a name="_lab2_3_0"></a></p><h3>4.1 创建数据库</h3>
<p><strong>语法</strong>:<code>CREATE DATABASE db_name;</code><br /><strong>示例</strong>:<code>CREATE DATABASE db_test;</code></p>
<p class="maodian"><a name="_lab2_3_1"></a></p><h3>4.2 删除数据库</h3>
<p><strong>语法</strong>:<code>DROP DATABASE db_name;</code><br /><strong>示例</strong>:<code>DROP DATABASE db_test;</code></p>
<p class="maodian"><a name="_lab2_3_2"></a></p><h3>4.3 列出数据库</h3>
<p><strong>语法</strong>:<code>SHOW DATABASES;</code><br /><strong>示例</strong>:<code>SHOW DATABASES;</code></p>
<p class="maodian"><a name="_lab2_3_3"></a></p><h3>4.4 备份数据库</h3>
<p><strong>语法</strong>:<code>mysqldump -h 主机名 -u 用户名 -p 密码 数据库名称 > 脚本文件路径;</code><br /><strong>示例</strong>:<code>mysqldump -u root -p000000 test > test.sql;</code></p>
<blockquote><p><strong>说明</strong>:宿主机操作可省略<code>-h</code>参数(如<code>mysqldump -u root -p000000 test > test.sql;</code>)。</p></blockquote>
<p class="maodian"><a name="_lab2_3_4"></a></p><h3>4.5 还原数据库</h3>
<p><strong>语法1(命令行)</strong>:<code>mysql -h 主机名 -u 用户名 -p 密码 数据库名称 < 脚本文件路径;</code><br /><strong>示例1</strong>:<code>mysql -u root -p000000 test < test.sql;</code><br /><strong>语法2(MySQL客户端)</strong>:<code>SOURCE 脚本文件路径;</code><br /><strong>示例2</strong>:<code>SOURCE test.sql;</code></p>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>4.6 使用某个数据库</h3>
<p><strong>语法</strong>:<code>USE db_name;</code><br /><strong>示例</strong>:<code>USE db_test;</code></p>
<p class="maodian"><a name="_label4"></a></p><h2>五、数据表创建与管理</h2>
<p class="maodian"><a name="_lab2_4_6"></a></p><h3>5.1 创建表</h3>
<p><strong>语法</strong>:<code>CREATE TABLE table_name (col_name1 data_type1, col_name2 data_type2, ...);</code><br /><strong>说明</strong>:</p>
<ul><li><code>data_type</code> 中的数字表示字段长度(如 <code>CHAR(20)</code> 表示最多存储 20 个字符)。<br /><strong>示例</strong>:</li></ul>
<div class="jb51code"><pre class="brush:sql;">CREATE TABLE t_test (id CHAR(20), name CHAR(10));
</pre></div>
<p class="maodian"><a name="_lab2_4_7"></a></p><h3>5.2 查看表结构</h3>
<div class="jb51code"><pre class="brush:sql;">DESCRIBE table_name;-- 或简写为 `DESC table_name;`
</pre></div>
<p><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">DESC t_test;
</pre></div>
<p class="maodian"><a name="_lab2_4_8"></a></p><h3>5.3 查看数据表</h3>
<p><strong>语法</strong>:<code>SHOW TABLES;</code><br /><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">SHOW TABLES;
</pre></div>
<p class="maodian"><a name="_lab2_4_9"></a></p><h3>5.4 复制表结构</h3>
<p><strong>语法</strong>:<code>CREATE TABLE new_table_name LIKE old_table_name;</code><br /><strong>说明</strong>:若复制其他数据库的表,需在 <code>old_table_name</code> 前添加数据库名(如 <code>db_test.t_test</code>)。<br /><strong>示例</strong>(复制 <code>t_test</code> 结构到当前库,命名为 <code>t_test2</code>):</p>
<div class="jb51code"><pre class="brush:sql;">CREATE TABLE t_test2 LIKE t_test;
</pre></div>
<p class="maodian"><a name="_lab2_4_10"></a></p><h3>5.5 复制表数据</h3>
<p><strong>表结构一致</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO table_name_new SELECT * FROM table_name_old;
</pre></div>
<p><strong>表结构不一致</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO table_name_new (col1, col2)
SELECT col1, col2 FROM table_name_old;
</pre></div>
<p class="maodian"><a name="_lab2_4_11"></a></p><h3>5.6 修改表名</h3>
<p><strong>语法</strong>:<code>ALTER TABLE old_table_name RENAME new_table_name;</code><br /><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE t_test1 RENAME t_test2;
</pre></div>
<p class="maodian"><a name="_lab2_4_12"></a></p><h3>5.7 增加字段</h3>
<p><strong>语法</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE table_name ADD col_name data_type;
</pre></div>
<p><strong>插入首位</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE table_name ADD col_name data_type FIRST;
</pre></div>
<p><strong>插入指定字段后</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE table_name ADD col_name data_type AFTER existing_col;
</pre></div>
<p><strong>示例</strong>(在 <code>t_test</code> 表首位添加 <code>test_address</code>):</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE t_test ADD test_address VARCHAR(255) FIRST;
</pre></div>
<p class="maodian"><a name="_lab2_4_13"></a></p><h3>5.8 删除字段</h3>
<p><strong>语法</strong>:<code>ALTER TABLE table_name DROP col_name;</code><br /><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE t_test DROP test1;
</pre></div>
<p class="maodian"><a name="_lab2_4_14"></a></p><h3>5.9 修改字段数据类型</h3>
<p><strong>语法</strong>:<code>ALTER TABLE table_name MODIFY col_name new_data_type;</code><br /><strong>示例</strong>(将 <code>test2</code> 类型从 <code>VARCHAR</code> 改为 <code>CHAR(100)</code>):</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE t_test MODIFY test2 CHAR(100);
</pre></div>
<p class="maodian"><a name="_lab2_4_15"></a></p><h3>5.10 修改字段名称</h3>
<p><strong>语法</strong>:<code>ALTER TABLE table_name CHANGE old_col_name new_col_name data_type;</code><br /><strong>示例</strong>(将 <code>test_address</code> 改为 <code>address</code>,类型为 <code>CHAR(100)</code>):</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE t_test CHANGE test_address address CHAR(100);
</pre></div>
<p class="maodian"><a name="_lab2_4_16"></a></p><h3>5.11 设置主键</h3>
<p><strong>创建表时设置</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">CREATE TABLE student (
xs_id CHAR(12),
xs_name CHAR(10),
PRIMARY KEY (xs_id)-- 单字段主键
);
</pre></div>
<div class="jb51code"><pre class="brush:sql;">CREATE TABLE student (
xs_id CHAR(12),
xs_name CHAR(10),
PRIMARY KEY (xs_id, xs_name)-- 组合主键
);
</pre></div>
<p><strong>创建表后设置</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE student ADD PRIMARY KEY (xs_id);
</pre></div>
<p class="maodian"><a name="_lab2_4_17"></a></p><h3>5.12 删除主键</h3>
<p><strong>语法</strong>:<code>ALTER TABLE table_name DROP PRIMARY KEY;</code><br /><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE student DROP PRIMARY KEY;
</pre></div>
<p class="maodian"><a name="_lab2_4_18"></a></p><h3>5.13 设置外键</h3>
<p><strong>作用</strong>:确保引用完整性(如 <code>t_test2.id</code> 必须在 <code>t_test1.id</code> 中存在)。<br /><strong>语法</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE table_name
ADD CONSTRAINT fk_name
FOREIGN KEY (foreign_col)
REFERENCES referenced_table (primary_col);
</pre></div>
<p><strong>示例</strong>(将 <code>t_test2.id</code> 设为外键,引用 <code>t_test1.id</code>):</p>
<div class="jb51code"><pre class="brush:sql;">ALTER TABLE t_test2
ADD CONSTRAINT fk1
FOREIGN KEY (id)
REFERENCES t_test1(id);
</pre></div>
<p class="maodian"><a name="_lab2_4_19"></a></p><h3>5.14 删除外键</h3>
<p><strong>步骤</strong>:</p>
<ol><li>查找外键名:<code>SHOW CREATE TABLE table_name;</code></li><li>删除外键:<code>ALTER TABLE table_name DROP FOREIGN KEY fk_name;</code><br /><strong>示例</strong>:</li></ol>
<div class="jb51code"><pre class="brush:sql;">-- 查看外键名
SHOW CREATE TABLE t_test2;
-- 删除外键(假设外键名为 fk1)
ALTER TABLE t_test2 DROP FOREIGN KEY fk1;</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>六、数据更新操作</h2>
<p class="maodian"><a name="_lab2_5_20"></a></p><h3>6.1 插入记录(INSERT)</h3>
<p class="maodian"><a name="_label3_5_20_0"></a></p><h4>6.1.1 插入单条记录</h4>
<p><strong>语法</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO 表名 [(字段1, 字段2, ...)] VALUES (值1, 值2, ...);
</pre></div>
<p><strong>说明</strong>:</p>
<ul><li>字段列表可选(不指定则需按表结构顺序提供所有值)。</li><li>值类型需与字段数据类型匹配。<br /><strong>示例</strong>:</li></ul>
<div class="jb51code"><pre class="brush:sql;">-- 插入完整字段
INSERT INTO test (id, name) VALUES (123, 'tt');
-- 插入指定字段(id)
INSERT INTO test (id) VALUES (124);</pre></div>
<p class="maodian"><a name="_label3_5_20_1"></a></p><h4>6.1.2 插入多条记录</h4>
<p><strong>语法</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), ...;
</pre></div>
<p><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO test VALUES
(125, 'ttww'),
(126, 'ttwwe'),
(127, 'ttqqq');
</pre></div>
<p class="maodian"><a name="_label3_5_20_2"></a></p><h4>6.1.3 子查询插入多条记录</h4>
<p><strong>语法</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO 表名1 [(字段1, 字段2, ...)]
SELECT 字段1, 字段2, ...
FROM 表名2 ;
</pre></div>
<p><strong>说明</strong>:</p>
<ul><li>目标表字段与查询字段数量、类型需一致。<br /><strong>示例</strong>:</li></ul>
<div class="jb51code"><pre class="brush:sql;">-- 插入所有字段
INSERT INTO test1 SELECT * FROM test2;
-- 插入指定字段
INSERT INTO test1 (id, name) SELECT id, name FROM test2;</pre></div>
<p class="maodian"><a name="_lab2_5_21"></a></p><h3>6.2 删除记录(DELETE)</h3>
<p><strong>语法</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">DELETE FROM 表名 WHERE 条件;
</pre></div>
<p><strong>说明</strong>:</p>
<ul><li>必须指定 <code>WHERE</code> 条件!否则会删除整表数据。<br /><strong>示例</strong>:</li></ul>
<div class="jb51code"><pre class="brush:sql;">-- 删除所有记录(危险!慎用)
DELETE FROM test;
-- 删除指定条件记录
DELETE FROM test WHERE id = 123;</pre></div>
<p class="maodian"><a name="_lab2_5_22"></a></p><h3>6.3 更新记录(UPDATE)</h3>
<p><strong>语法</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE 表名
SET 字段1 = 值1, 字段2 = 值2, ...
WHERE 条件;
</pre></div>
<p><strong>说明</strong>:</p>
<ul><li>必须指定 <code>WHERE</code> 条件!否则会更新整表数据。<br /><strong>示例</strong>:</li></ul>
<div class="jb51code"><pre class="brush:sql;">-- 更新指定条件的记录
UPDATE test
SET name = 'new_name'
WHERE id = 123;
-- 同时更新多字段
UPDATE test
SET name = 'updated', status = 1
WHERE id = 124;</pre></div>
<p class="maodian"><a name="_lab2_5_23"></a></p><h3>⚠️ 重要提示</h3>
<table><thead><tr><th>操作</th><th>未指定 WHERE 的后果</th></tr></thead><tbody><tr><td><code>DELETE</code></td><td><strong>清空整表</strong>(不可逆!)</td></tr><tr><td><code>UPDATE</code></td><td><strong>全表字段被覆盖</strong>(数据丢失)</td></tr></tbody></table>
<blockquote><p><strong>建议</strong>:执行前先用 <code>SELECT</code> 验证条件,或在测试环境操作。</p></blockquote>
<p class="maodian"><a name="_label6"></a></p><h2>七、数据查询操作</h2>
<p class="maodian"><a name="_lab2_6_24"></a></p><h3>7.1 单表查询</h3>
<p>7.1.1 基础语法</p>
<div class="jb51code"><pre class="brush:sql;">SELECT [列名1, 列名2, ... | *] FROM 表名;
</pre></div>
<ul><li><strong>通配符 <code>*</code></strong>:匹配所有列</li><li><strong>别名 <code>AS</code></strong>:为字段/结果指定临时名称(如 <code>name AS 姓名</code>)</li></ul>
<p><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT id, name AS 姓名 FROM test;-- 为name字段取别名
SELECT * FROM test; -- 查询所有列
</pre></div>
<p class="maodian"><a name="_label3_6_24_3"></a></p><h4>7 .1.2 条件过滤(WHERE)</h4>
<table><thead><tr><th>关键字</th><th>作用</th><th>示例</th></tr></thead><tbody><tr><td><code>AND</code>/<code>OR</code></td><td>连接多个条件</td><td><code>WHERE age > 20 AND salary > 5000</code></td></tr><tr><td><code>BETWEEN ... AND</code></td><td>范围查询</td><td><code>WHERE price BETWEEN 100 AND 200</code></td></tr><tr><td><code>IS NULL</code></td><td>查询空值</td><td><code>WHERE email IS NULL</code></td></tr><tr><td><code>IN</code></td><td>查询集合中值</td><td><code>WHERE city IN ('北京', '上海')</code></td></tr><tr><td><code>LIKE</code></td><td>模糊查询</td><td><code>WHERE name LIKE '张%'</code>(以张开头)</td></tr></tbody></table>
<p><strong>通配符</strong>:</p>
<ul><li><code>%</code>:匹配任意长度字符(如 <code>name LIKE '%明%'</code>)</li><li><code>_</code>:匹配单个字符(如 <code>name LIKE '张_'</code>)</li></ul>
<p class="maodian"><a name="_label3_6_24_4"></a></p><h4>7.1.3 排序(ORDER BY)</h4>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM 表名 ORDER BY 列名 ;
</pre></div>
<ul><li><strong>默认升序(ASC)</strong>,<code>DESC</code> 为降序<br /><strong>示例</strong>:</li></ul>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM books ORDER BY price DESC;-- 按价格降序
</pre></div>
<p class="maodian"><a name="_label3_6_24_5"></a></p><h4>7.1.4 聚集函数</h4>
<table><thead><tr><th>函数</th><th>作用</th><th>示例</th></tr></thead><tbody><tr><td><code>COUNT()</code></td><td>计数</td><td><code>SELECT COUNT(*) FROM books;</code></td></tr><tr><td><code>MAX()</code></td><td>最大值</td><td><code>SELECT MAX(price) FROM books;</code></td></tr><tr><td><code>MIN()</code></td><td>最小值</td><td><code>SELECT MIN(price) FROM books;</code></td></tr><tr><td><code>SUM()</code></td><td>求和</td><td><code>SELECT SUM(salary) FROM employees;</code></td></tr><tr><td><code>AVG()</code></td><td>平均值</td><td><code>SELECT AVG(age) FROM students;</code></td></tr></tbody></table>
<p class="maodian"><a name="_label3_6_24_6"></a></p><h4>7.1.5 分组(GROUP BY)</h4>
<div class="jb51code"><pre class="brush:sql;">SELECT 聚集函数(列), 分组列 FROM 表名 GROUP BY 分组列;
</pre></div>
<p><strong>示例</strong>(统计出版社图书数量):</p>
<div class="jb51code"><pre class="brush:sql;">SELECT COUNT(*), pressName
FROM books
GROUP BY pressName;
</pre></div>
<blockquote><p><strong>结果说明</strong>:<code>pressName</code> 为 “人民邮电出版社” 的记录数 = 1,“清华大学出版社” = 6。</p></blockquote>
<p class="maodian"><a name="_lab2_6_25"></a></p><h3>7.2 连接查询</h3>
<p class="maodian"><a name="_label3_6_25_7"></a></p><h4>7.2.1 简单连接(逗号分隔)</h4>
<div class="jb51code"><pre class="brush:sql;">SELECT 表1.列, 表2.列
FROM 表1, 表2
WHERE 表1.关联列 = 表2.关联列;
</pre></div>
<p><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT b.reader_id, br.book_name
FROM books b, borrow_record br
WHERE b.ISBN = br.ISBN;
</pre></div>
<p class="maodian"><a name="_label3_6_25_8"></a></p><h4>7.2.2 JOIN 连接</h4>
<table><thead><tr><th>类型</th><th>语法</th><th>说明</th></tr></thead><tbody><tr><td><strong>内连接</strong></td><td><code>SELECT * FROM 表1 INNER JOIN 表2 ON 条件;</code></td><td>仅返回匹配的记录</td></tr><tr><td><strong>左连接</strong></td><td><code>SELECT * FROM 表1 LEFT JOIN 表2 ON 条件;</code></td><td>保留左表所有记录</td></tr><tr><td><strong>右连接</strong></td><td><code>SELECT * FROM 表1 RIGHT JOIN 表2 ON 条件;</code></td><td>保留右表所有记录</td></tr></tbody></table>
<p><strong>示例</strong>(左连接):</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM books b
LEFT JOIN borrow_record br
ON b.ISBN = br.ISBN;
</pre></div>
<blockquote><p>⚠️ <strong>注意</strong>:<code>ON</code> 用于指定连接条件,<strong>不可用 <code>WHERE</code> 替代</strong>(否则会丢失左表空值记录)。</p></blockquote>
<p class="maodian"><a name="_lab2_6_26"></a></p><h3>7.3 嵌套查询(子查询)</h3>
<p>**7.3.1 <code>IN</code> 谓语</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM 表1
WHERE 列名 IN (SELECT 列名 FROM 表2 WHERE 条件);
</pre></div>
<p><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM books
WHERE isbn IN (SELECT isbn FROM borrow_record WHERE reader_id = '201801');
</pre></div>
<p class="maodian"><a name="_label3_6_26_9"></a></p><h4>7.3.2 比较运算符</h4>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM 表1
WHERE 列名 > (SELECT 列名 FROM 表2 WHERE 条件);
</pre></div>
<p><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM books
WHERE isbn = (SELECT isbn FROM borrow_record WHERE reader_id = '201801');
</pre></div>
<p class="maodian"><a name="_label3_6_26_10"></a></p><h4>7.3.3ANY/ALL谓语</h4>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM 表1
WHERE 列名 > ANY (SELECT 列名 FROM 表2 WHERE 条件);
</pre></div>
<p><strong>示例</strong>(查询未借阅的图书):</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM books
WHERE isbn <> ALL (SELECT isbn FROM borrow_record WHERE reader_id = '201801');
</pre></div>
<p class="maodian"><a name="_label3_6_26_11"></a></p><h4>7.3.4EXISTS谓语</h4>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM 表1
WHERE NOT EXISTS (SELECT 1 FROM 表2 WHERE 表1.列 = 表2.列 AND 条件);
</pre></div>
<p><strong>示例</strong>(查询未借阅的图书):</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM books
WHERE NOT EXISTS (
SELECT 1
FROM borrow_record
WHERE isbn = books.isbn AND reader_id = '201801'
);
</pre></div>
<p class="maodian"><a name="_lab2_6_27"></a></p><h3>7.4 合并查询(UNION)</h3>
<p><strong>作用</strong>:合并两个查询结果(去重)</p>
<div class="jb51code"><pre class="brush:sql;">SELECT 列 FROM 表1
UNION
SELECT 列 FROM 表2;
</pre></div>
<p><strong>示例</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM t_major1
UNION
SELECT * FROM t_major;
</pre></div>
<blockquote><p><strong>要求</strong>:</p>
<ol><li>两个查询的列数和数据类型必须一致</li><li>默认去重,用 <code>UNION ALL</code> 保留重复项</li></ol></blockquote>
<p class="maodian"><a name="_label3_6_27_12"></a></p><h4>⚠️ 关键安全提示</h4>
<table><thead><tr><th>操作</th><th>风险</th><th>避免方法</th></tr></thead><tbody><tr><td><code>SELECT *</code></td><td>传输冗余数据,影响性能</td><td>显式指定所需字段</td></tr><tr><td>无条件 <code>DELETE</code>/<code>UPDATE</code></td><td>清空整表数据</td><td><strong>必须添加 <code>WHERE</code> 条件</strong></td></tr><tr><td>嵌套查询未优化</td><td>慢查询导致数据库阻塞</td><td>确保子查询返回结果集小</td></tr></tbody></table>
<blockquote><p><strong>最佳实践</strong>:</p>
<ol><li>单表查询避免 <code>SELECT *</code>,只选必要字段</li><li>连接查询优先用 <code>JOIN</code> 语法(清晰、性能高)</li><li>嵌套查询用 <code>EXISTS</code> 替代 <code>IN</code>(大数据集性能更好)</li></ol></blockquote>
頁:
[1]