MySQL常用SQL语句实例:从建库到查询的完整指南

Hazel
Hazel
发布时间:2026-10-15| 3人浏览过
原创

本文整理了MySQL中最常用的SQL语句实例,涵盖数据库与表的创建删除、结构修改、索引管理、数据增删改查及视图操作。通过具体示例代码,帮助开发者快速掌握DDL与DML的核心语法,解决实际开发中遇到的数据库设计与维护问题。

数据库与表的基础管理

在开始操作之前,理解“模式(Schema)”即数据库的概念很有必要。以下是针对数据库和表的基本操作命令,用于创建、查看和销毁对象。

第1步:查看当前所有数据库

目的:列出服务器中现有的所有数据库名称。

SHOW DATABASES;

说明:该命令罗列所有数据库的名称,帮助了解当前环境。

第2步:创建新数据库

目的:建立一个名为TEST的新数据库。

CREATE DATABASE TEST;

第3步:选择并进入数据库

目的:激活指定数据库以便后续操作。

USE TEST;

第4步:查看当前库中的表结构

目的:显示当前数据库中存在的表格及其基本信息。

SHOW TABLES;

若需查看特定表的详细结构(包括字段类型、键信息等),可使用:

SHOW [FULL] COLUMNS FROM <表名>;
-- 或者简写为
DESC <表名>;

说明:SHOW FULL COLUMNS 会比 DESC 提供更详细的列级信息。此外,SHOW CREATE TABLE <表名> 可查看建表的完整SQL语句。

第5步:创建基本表

目的:定义新表的结构,包含字段名、数据类型及约束条件。

语法模板:

CREATE TABLE <表名> (
    <列名> <数据类型> [约束条件],
    ... 
);

实例1:创建学生表

CREATE TABLE STUDENT (
    studentId int(30) PRIMARY KEY,
    name varchar(255),
    address varchar(255)
);

实例2:创建教师表(含外键约束)

CREATE TABLE TEACHER (
    teacherId int(30),
    name varchar(255),
    age int(20),
    studentId int(30),
    PRIMARY KEY (teacherId),
    FOREIGN KEY (studentId) REFERENCES STUDENT(studentId)
);

修改表结构与完整性约束

在生产环境中,随着需求变更,经常需要调整表结构或约束。操作前请确保已备份相关数据。

第6步:修改表属性

目的:重命名表、添加列、修改列名或类型、删除列。

-- 重命名表
ALTER TABLE TEACHER RENAME S;

-- 添加新列
ALTER TABLE TEACHER ADD COLUMN ADDRESS varchar(255);

-- 修改列名及类型
ALTER TABLE TEACHER CHANGE COLUMN ADDRESS address varchar(230);

-- 删除列(column关键字可选)
ALTER TABLE TEACHER DROP [COLUMN] address;

第7步:删除基本表

风险提醒:删除表是不可逆操作,且可能受外键约束限制。执行前务必确认数据安全或有备份。

-- RESTRICT:只有当该表不被其他表引用(无外键)、无视图、无触发器等时才允许删除。
DROP TABLE STUDENT RESTRICT;

-- CASCADE:删除该表的同时,删除依赖它的对象(如视图)。但在MySQL中,若存在未解除的外键约束,直接CASCADE也可能失败。
DROP TABLE STUDENT CASCADE;

注意:如果在MySQL中遇到 Cannot delete or update a parent row: a foreign key constraint fails 错误,通常是因为子表中仍有记录引用了父表的主键,或者存在其他外键关联未解除。需先处理子数据或禁用外键检查。

第8步:管理完整性约束

目的:动态添加或删除主键、外键等约束。

-- 添加主键约束
ALTER TABLE teacher ADD CONSTRAINT pk_teacher_id PRIMARY KEY (id);

-- 删除主键约束
ALTER TABLE teacher DROP PRIMARY KEY;

-- 添加外键约束
ALTER TABLE student ADD CONSTRAINT fk_student_teacher 
FOREIGN KEY (teacherId) REFERENCES teacher(id);

索引的建立与删除

索引能显著提升查询速度,但会降低写入性能。合理使用索引是数据库优化的关键。

第9步:创建索引

方法一:使用 CREATE INDEX

-- UNIQUE表示唯一索引,每个索引值对应唯一记录
-- CLUSTER表示聚簇索引(InnoDB引擎默认主键即为聚簇索引)
CREATE UNIQUE INDEX id_index ON teacher(id ASC);

方法二:使用 ALTER TABLE

ALTER TABLE teacher ADD UNIQUE INDEX id_index (id ASC);

第10步:删除索引

方法一:使用 DROP INDEX

DROP INDEX id_index ON teacher;

方法二:使用 ALTER TABLE

ALTER TABLE teacher DROP INDEX id_index;

数据查询核心语句

SELECT是最复杂的SQL语句,包含多个子句。标准顺序为:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY。

第11步:基础查询与计算

目的:从表中选取数据,支持别名、表达式计算及函数使用。

-- 使用别名和表达式
SELECT teacherId AS id, salary - 100 AS S FROM teacher;

-- 使用字符串常量和内置函数(如转小写)
SELECT teacherid AS id, 'birth', salary - 20 AS SA, LOWER(name) FROM teacher;

-- 消除重复行
SELECT DISTINCT name FROM teacher;

第12步:条件过滤(WHERE子句)

目的:根据特定条件筛选元组。

  • 比较:=, >, <, >=, <=, !=, <>
  • 范围:BETWEEN ... AND ..., NOT BETWEEN ... AND ...
  • 集合:IN (...), NOT IN (...)
  • 字符匹配:LIKE '%...%', LIKE '_...' (%代表任意长度,_代表单个字符。注意中文占两个字符位)
  • 空值判断:IS NULL, IS NOT NULL(注意不能用 = NULL)
-- 组合条件示例
SELECT * FROM teacher 
WHERE name LIKE '%s%' OR salary = 500;

第13步:排序与分组

排序:ORDER BY 列名 [ASC|DESC],缺省为升序ASC。

SELECT * FROM teacher ORDER BY name DESC, salary ASC;

聚集函数:COUNT, SUM, AVG, MAX, MIN。缺省作用于ALL(全部记录),可用DISTINCT去重后计算。

SELECT COUNT(DISTINCT name), SUM(salary), AVG(salary) FROM teacher;

分组与HAVING:按列分组后,用HAVING筛选满足条件的组。

SELECT cno, COUNT(*) FROM teacher 
GROUP BY cno 
HAVING COUNT(*) >= 4;

高级查询技巧

第14步:连接查询(JOIN)

等值连接:利用WHERE条件连接两表。

SELECT s.*, t.* 
FROM student AS s, teacher AS t 
WHERE s.teacherid = t.teacherid;

外连接:保留一侧表的所有记录,另一侧若无匹配则填NULL。MySQL不支持FULL OUTER JOIN。

-- 左外连接:保留左边student表所有行
SELECT s.sno, s.name, c.cno, c.name 
FROM student AS s 
LEFT OUTER JOIN class AS c ON s.cno = c.cno;

-- 右外连接:保留右边class表所有行
SELECT c.cno, c.name, s.sno, s.name 
FROM student AS s 
RIGHT OUTER JOIN class AS c ON s.cno = c.cno;

第15步:嵌套与集合查询

带有IN的子查询:

SELECT sno, name FROM student 
WHERE cno IN (
    SELECT cno FROM student WHERE name = '华雄'
);

带有ANY/ALL的子查询:

-- 找出成绩小于等于所有学生最低分的学生(即最低分的那几个)
SELECT name, score FROM student 
WHERE score <= ALL (SELECT score FROM student);

集合运算:MySQL仅支持UNION(并集),不支持INTERSECT(交集)和EXCEPT(差集)。

SELECT * FROM student WHERE cno=1 
UNION 
SELECT * FROM student WHERE cno=2;

数据更新与维护

第16步:插入与复制数据

单条插入:

INSERT INTO student (cno, name, score) VALUES (2, '横切', 85);

批量插入(子查询结果):

-- 将student表数据复制到studentcopy表
INSERT INTO studentcopy SELECT * FROM student;

第17步:修改与删除数据

UPDATE:若不加WHERE,将更新所有行!

-- 修改特定行
UPDATE studentcopy SET score=80 WHERE sno=1;
-- 批量更新(谨慎使用)
UPDATE studentcopy SET score=score-20;

DELETE:若不加WHERE,将清空全表!建议先在测试环境验证。

-- 删除特定行
DELETE FROM studentcopy WHERE sno=1;
-- 带子查询删除
DELETE FROM studentcopy 
WHERE cno IN (SELECT cno FROM student AS s WHERE s.cno = 2);

视图的操作与管理

视图是基于SQL查询结果的虚拟表,用于简化复杂查询或限制数据访问。若底层基表结构变化,视图可能失效。

第18步:创建视图

-- 简单视图
CREATE VIEW part_student AS
SELECT * FROM student WHERE cno = 2;

-- 多表连接视图(建议明确指定列名)
CREATE VIEW student_class (sno, student_name, class_name, score) AS
SELECT s.sno, s.name, c.name, s.score
FROM student AS s, class AS c
WHERE s.cno = c.cno;

WITH CHECK OPTION:确保通过视图更新的数据符合视图定义的条件。

第19步:管理与删除视图

-- 删除视图,若有依赖视图需使用CASCADE级联删除
DROP VIEW <视图名> [CASCADE];

更新视图的逻辑与更新基本表类似,但受限于视图定义(如包含聚合函数、GROUP BY、DISTINCT等的视图通常不可直接更新)。

总结

以上涵盖了MySQL日常开发中最核心的SQL语句操作,从基础的DDL建库建表,到中层的索引优化与复杂查询,再到视图的管理。掌握这些实例能有效提升数据库操作的效率与规范性。以上就是MySQL常用SQL语句与操作实例的详细教程,更多关于数据库开发与优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。