MySQL基本命令

基本操作

数据库和表的基本操作

创建数据库

CREATE DATABASE 数据库名;

创建表

CREATE TABLE 表名
(
    字段名,数据类型,
    字段名,数据类型,
    .....
)

查看表结构

DESCRIBE 表名;

其中,该结构中各个字段的含义分别为:

  • NULL:表示该列是否能存储 NULL 值;
  • Key:表示该列是否已编制索引;
  • PRI:表示该列是此表主键的一部分;
  • UNI:表示该列是 UNIQUE 索引的一部分;
  • MUL:表示在列中某个给定值允许出现多次;
  • Default:表示该列是否有默认值,如果有的话值是多少;
  • Extra:表示可以获取的与给定列有关的附加信息。

查看建表时的详细语句、存储引擎、字符编码

SHOW CREATE TABLE 表名;

使用SHOW CREATE TABLE语句,不仅仅可以返回给我们建表时所写的详细语句,而且还可以查看存储引擎和字符编码。

注:在表名后加上\G可以改善排版

修改表名

ALTER TABLE 旧表名 RENAME 新表名;

修改字段名与字段数据类型

修改字段名

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;

注:如果不需要修改字段的数据类型,可以把新字段的数据类型设置为和原来一样,但是!千万不要空着它!

修改字段数据类型

ALTER TABLE 表名 MODIFY 字段名 数据类型;

注:修改字段类型所消耗的计算机资源远超删除并重建。所以我们遇到需要修改的字段,一般会选择删除并重建

添加与删除字段

1.添加字段

一个完整的字段包括:字段名数据类型完整性约束

语法规则:

ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] [FIRST|AFTER] 已存在字段名;

以下是在 MySQL 中常用的约束。

  • NOT NULL 约束:确保某列不能有 NULL 值。
  • DEFAULT 约束:当某列没有指定值时,为该列提供默认值。
  • UNIQUE 约束:确保某列中的所有值是不同的。
  • PRIMARY Key 约束:唯一标识数据库表中的各行/记录。
  • CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件。

注:只要不做[FIRST|AFTER]的位置说明,在添加字段时MySQL会默认把新字段加入到表的最后一列。

  • 不加参数,默认:新字段在最后一列
  • FIRST:添加到第一列
  • AFTER:添加到指定字段后
    示例:
ALTER TABLE Mall_products ADD prod_country varchar(30) AFTER prod_name;

2.删除字段

ALTER TABLE 表名 DROP 字段名;

修改字段的排列位置

ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST|AFTER 字段2;

其中,字段1指要修改位置的字段,FIRSTAFTER 字段2为可选参数。

删除表的外键约束

ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;

插入数据

假设有test_1这张表,结构为

class_id class_name
则有插入数据语句
INSERT INTO test_1 (class_id,class_name) VALUES (1,'软件工程');  -- 不指定数据库(需要提前跳转到目标数据库)

INSERT INTO test.test_1 (class_id,class_name) VALUES (2,'高级开发'); -- 指定数据库

INSERT INTO test_1 (class_id,class_name) VALUES (1,'软件工程'),(2,'高级开发'); -- 一次插入多条数据

注:插入的数据的列数等信息要与表结构保持一致

更新数据

记住UPDATE语句三要素就能轻松掌握,它们分别是:

  • 需要更新的表(table)名;
  • 需要更新的字段(column)名和它的新内容(value);
  • 决定更新哪一条内容(value)的过滤条件。
UPDATE 表名 SET 字段名1 = 内容1, 字段名2 = 内容2, 字段名3 = 内容3 WHERE 过滤条件;

删除数据

DELETE FROM 表名 WHERE 条件语句;

删除表中的所有行

DELETE FROM 表名;

注:TRUNCATE TABLE 语句也可以用来删除表中的所有记录。但是与 DELETE 不同的是,TRUNCATE TABLE 语句直接删除的是表,而不是表中的内容,删除结束后还会重新创建一个表。所以它的执行速度会比 DELETE 语句快。 语法为:TRUNCATE TABLE 表名;

Select查询(Where限制条件)

带 IN 关键字的查询

IN关键字被用在WHERE语句的后边,用来过滤你所需要查询的内容。更形象的说,IN关键字的使用情形就像点名,点到谁谁就要站出来。

SELECT 字段名 FROM 表名 WHERE 字段名 IN (n1,n2,n3,...);

带NOT IN关键字的查询
加了NOT取反后,就意味着,我们要查询的是除了括号中出现内容外的所有内容。

SELECT 字段名 FROM 表名 WHERE 字段名 NOT IN (n1,n2,n3,...);

带 BETWEEN AND 的范围查询

使用关键字BETWEEN AND提取数据表中的指定数据内容。

BETWEEN AND需要两个参数支持,一个是范围的开始值,另一个就是结束值了。如果字段值满足指定的范围查询条件,就返回这些满足条件的数据内容。

SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN n1 AND n2;

NOT BETWEEN AND关键字的查询
像上面介绍的关键字IN一样,我们还可以对关键字BETWEEN AND进行取反,表示查询指定范围之外的值。

SELECT 字段名 FROM 表名 WHERE 字段名 NOT BETWEEN n1 AND n2;

带 LIKE 的字符匹配查询

SQL语句支持很多种通配符,其中可以和LIKE一起搭配使用的就是通配符%_了。

使用通配符%模糊匹配数据内容
百分号通配符%可以匹配任意长度的字符,甚至包括零字符。

SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符%';

其中 % 的位置可以根据需要在字符间变化。

使用通配符_模糊匹配数据内容
下划线通配符_与百分号通配符%类似,也用于模糊匹配。但是区别在于下划线通配符_只能模糊匹配1个字符。如果你执意想用下划线通配符_匹配多个字符,那只能多用几个_咯!

SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符_';

其中_的位置可以根据需要在字符间变化。

查询空值

关键字IS NULL检索数据表中指定的字段的空值

SELECT 字段名 FROM 表名 WHERE 字段名 IS NULL;

去除重复结果

消除数据表中重复的数据

SELECT DISTINCT 字段名 FROM 表名;

示例:

SELECT DISTINCT prod_name, prod_country, prod_price
FROM Mall_products;

带 AND 与 OR 的多条件查询

带AND关键字的多条件查询
MySQL在WHERE子句中使用AND操作符限制只有满足所有条件的查询才会被返回

SELECT 字段名 FROM 表名 WHERE 表达式1 AND 表达式2;

带OR关键字的多条件查询
与AND相反,在WHERE声明中使用OR关键字表示只需满足两个条件中的其中一个条件即可返回结果。

SELECT 字段名 FROM 表名 WHERE 表达式1 OR 表达式2;

OR 可以和 AND 一起使用。但是 AND 的优先级要高于 OR 的优先级!

在这里我们不得不提到关键字IN,它能实现与OR相同的功能。

SELECT  ID, prod_name, prod_price
FROM Mall_products
WHERE ID IN('BNBG01', 'BR01');

虽然两种写法功能一样,但是我们更推荐使用 IN 关键字。因为它不仅逻辑清晰,执行的速度也会快于 OR 关键字。更重要的是,使用 IN 关键字,我们以后可以执行更加复杂的嵌套语句。

对查询结果进行排序

使用Order By子句来设定你想要按照的字段进行排序并返回结果。

SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC[DESC]];
  • ASC 升序关键字(默认)
  • DESC 降序关键字

分组查询

分组查询的单独使用
分组查询的关键字是Group By,查询的是每个分组中 首次出现的一条记录

SELECT 字段名 FROM 表名 GROUP BY 字段名;

只显示每个分组中的一条记录,意义不大。一般情况下,GROUP BY都和聚合函数一起使用。

使用 LIMIT 限制查询结果的数量

在我们查询大量数据结果时,会返回很多条数据,有需要的记录可能就其中的一条或者几条。比如,实现分页功能,若每页显示10条记录,每次查询就只需要10条记录。
在MySQL中,提供了LIMIT关键字,用来限制查询结果的数量。

SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数;
  • 第一个参数,OFFSET,可选参数,表示偏移量,如果不指定默认值为0,表示从查询结果的第一条记录开始,若偏移量为1,则从查询结果中的第二条记录开始,以此类推。

  • 第二个参数,记录数,表示返回查询结果的条数。

注意Limit放到最后面,Order By写在Limit前面

查询重命名

tb_student表数据:

id name class_id
1 Emma 2
2 Mary 4
3 Allen (null)
4 Kevin 1
5 Rose 2
6 James 1
tb_class表数据:

id name
1 软件1631
2 软件1632
3 测试1631
4 测试1632

select 
tb_student.name as studentName,tb_class.name as className 
from tb_student 
join tb_class on tb_student.class_id = tb_class.id;

查询结果:(将属性名重命名为自定义字符串)

studentName	className
Kevin	软件1631
James	软件1631
Emma	软件1632
Rose	软件1632
Mary	测试1632

连接查询

1.内连接查询

仅将两个表中满足连接条件的行组合起来作为结果集,称为内连接;

表1 [inner] join 表2 on 表1.字段=表2.字段

从表1中取出每一条记录,去表2中与所有的记录进行匹配,匹配必须是某个条件在表1中与表2中相同,最终才会保留结果,否则不保留。inner 关键字可省略不写;on 表示连接条件:条件字段就是代表相同的业务含义

select tb_student.name as studentName,tb_class.name as className from tb_student join tb_class on tb_student.class_id = tb_class.id;

2.外连接查询

以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管能不能匹配上条件,最终都会保留。能匹配,正确保留;不能匹配,其它表的字段都置空(null),称为外连接。

外连接查询分为左外连接查询和右外连接查询;

表1 left/right [outer]  join 表2 on 表1.字段=表2.字段
  • 左外连接:在内连接的基础上,还包含表1中所有不符合条件的数据行,并在其中的表2列填写 NULL;
  • 右外连接:在内连接的基础上,还包含表2中所有不符合条件的数据行,并在其中的表1列填写 NULL。

左外连接

select tb_student.name as studentName,tb_class.name as className
from tb_student left join tb_class on tb_student.class_id = tb_class.id;

右外连接

select tb_student.name as studentName,tb_class.name as className
from tb_student right join tb_class on tb_student.class_id = tb_class.id;

正则表达式查询

正则表达式关键字为REGEXP,常用于where后

示例:

SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;

输出:

prod_name
JetPack 1000
JetPack 2000

与LIKE的差别:
LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非用通配符)。
REGEXP在列值内匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别

SELECT prod_name
FROM products
WHERE prod_name LIKE '1000'
ORDER BY prod_name;

匹配不到任何内容(只能匹配值为1000的内容,而不能匹配abc1000)

正则OR匹配

# 正则进行or匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;

匹配具有特殊含义的字符

# 匹配具有特殊含义的字符
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;

解释:多数正则表达式实现使用单个反斜杠转移特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)

预定义字符类

表达式 说明
[:alnum:] 字母和数字
[:alpha:] 字母
[:digit:] 数字
[:lower:] 小写字母
[:upper:] 大写字母
[:space:] 空白字符
[:punct:] 标点符号

单词边界定位符

元字符 说明 示例(匹配独立单词)
[[:<:]] 匹配单词的开头边界(左单词边界) [[:<:]]cat → 匹配 "cat" 开头的单词,不匹配 "catalog" 中的 "cat"? (视引擎而定)
[[:>:]] 匹配单词的结尾边界(右单词边界) cat[[:>:]] → 匹配以 "cat" 结尾的单词

约束

添加主键约束

有两种方式可以添加主键约束:

  1. 在定义列的同时指定主键;
  2. 在定义完字段之后再指定主键。

添加主键

定义列的同时指定主键

CREATE TABLE t_user1 (
    ->     userId INT PRIMARY KEY,#PRIMARY KEY的作用是声明主键
    ->     name VARCHAR(32),
    ->     password VARCHAR(11),
    ->     phone VARCHAR(11),
    ->     email VARCHAR(32)
    -> );

在定义完字段之后再指定主键

CREATE TABLE t_user1 (
    userId INT,
    name VARCHAR(32),
    password VARCHAR(11),
    phone VARCHAR(11),
    email VARCHAR(32),
    PRIMARY KEY (userId)
);

多字段联合主键

CREATE TABLE t_emp2
(
    name VARCHAR(32),
    deptId INT,
    salary FLOAT,
    PRIMARY KEY(name,deptId)  #声明联合主键
)

添加外键约束

CONSTRAINT 外键名 FOREIGN KEY 字段名 REFERENCES 主表名(主键名)
CREATE TABLE t_dept
(
    deptId INT PRIMARY KEY,
    name VARCHAR(22),
    location VARCHAR(50)
);
CREATE TABLE t_emp
(
    id INT PRIMARY KEY,
    name VARCHAR(22),
    deptId INT,
    CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES t_dept(deptId)
    # 将t_dept的deptId这个主键作为外键与t_emp的deptId属性相关联
);

唯一约束

要求该列唯一,允许为空,但是只能有一个空值。唯一约束可以确保一列或者几列不出现重复值。

场景:
定义部门表的部门名称唯一,SQL语句如下:关键词 UNIQUE。

CREATE TABLE t_dept(
    id INT PRIMARY KEY,
    name VARCHAR(22) UNIQUE,
    location VARCHAR(50)
)

非空约束

CREATE TABLE t_dept(
    id INT PRIMARY KEY,
    name VARCHAR(22) NOT NULL,
    location VARCHAR(50)
)

默认约束

默认约束:即给字段一个默认值。

CREATE TABLE t_emp(
    id INT PRIMARY KEY,
    name VARCHAR(22),
    sex VARCHAR(2) DEFAULT '男'
) DEFAULT CHARSET=utf8;

如果是添加字符串型默认值要使用单引号,如果是整型则不需要加任何符号;
如果要添加的是中文默认值,则需要加上DEFAULT CHARSET=utf8;使用英文字符则不需要。

自增约束

CREATE TABLE t_tmp
(
    id int PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(32)
)

函数方法

可移植性(Portable):指代码能够在多个数据库管理系统(DBMS)上运行。

  • 大多数标准 SQL 语句具有较好的可移植性,不同 DBMS 之间的差异通常较小。
  • 数据库函数的可移植性较差,不同 DBMS 支持的函数及其实现往往存在较大差异。
  • 为了提高代码的可移植性,通常建议优先使用标准 SQL,尽量减少使用数据库专有函数。
  • 但数据库函数通常性能更高,某些功能使用函数实现也更加简单、高效。
  • 如果使用了数据库特有的函数,应添加必要的注释,便于后续维护和数据库迁移。

1.concat 拼接两个列(或字符)(concatenate)

SELECT CONCAT(vend_name,'(',vend_country,')') as vend_title
FROM vendors
ORDER BY vend_name;

基本语法

CONCAT(str1, str2, str3, ...)
  • str1str2str3 ...:要拼接的字符串或字段。
  • 返回值:将所有参数按顺序连接后的字符串。

2.算数运算(直接算)

SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
操作符 说明
+
-
*
/

测试计算

SELECT 提供了测试和试验函数与计算的一个很好的办法。虽然 SELECT 通常用来从表中检索数据,但可以省略 FROM 子句,以便简单地访问和处理表达式。

例如:

SELECT 3 * 2;  

返回结果:

6  
SELECT TRIM('abc');  

返回结果:

abc  
SELECT NOW();  

返回结果:

2026-07-02 12:34:56  

NOW() 会返回当前日期和时间,实际结果会根据执行时间而变化。

通过这些例子,可以利用 SELECT 对函数、表达式和计算进行快速测试,而无需查询任何数据表。

3. TRIM 去除字符串两端字符

SELECT TRIM(vend_name) AS vend_name
FROM vendors;

基本语法

TRIM([LEADING | TRAILING | BOTH] [remstr] FROM str)

或 MySQL 常用简写:

TRIM(str)
  • str:要处理的字符串。
  • remstr:要删除的字符,默认为空格。
  • LEADING:仅删除左侧字符。
  • TRAILING:仅删除右侧字符。
  • BOTH:删除两侧字符(默认)。
  • 返回值:删除指定字符后的字符串。

示例

去除字符串两端空格:

SELECT TRIM('   hello   ');

结果:

hello

去除指定字符:

SELECT TRIM('*' FROM '***hello***');

结果:

hello

仅去除左侧字符:

SELECT TRIM(LEADING '0' FROM '000123');

结果:

123

仅去除右侧字符:

SELECT TRIM(TRAILING '0' FROM '123000');

结果:

123

去除两侧指定字符:

SELECT TRIM(BOTH '0' FROM '000123000');

结果:

123

4.聚合函数(Aggregate Functions)

聚合函数用于对一列数据进行统计计算,通常与 SELECT 一起使用。

函数 作用
AVG() 返回某列的平均值(忽略 NULL 值)
COUNT() 返回记录数量,可统计行数或非 NULL 值的数量
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列所有值的总和(忽略 NULL 值)

示例

-- 平均价格
SELECT AVG(prod_price) FROM products;

-- 商品数量
SELECT COUNT(*) FROM products;

-- 最高价格
SELECT MAX(prod_price) FROM products;

-- 最低价格
SELECT MIN(prod_price) FROM products;

-- 库存总数
SELECT SUM(quantity) FROM products;

注意

  • AVG()SUM()MAX()MIN() 会自动忽略 NULL 值。
  • COUNT(*) 统计所有行(包括包含 NULL 的行)。
  • COUNT(列名) 仅统计该列非 NULL 的记录数。
posted @ 2026-07-02 18:13  畅畅c  阅读(2)  评论(0)    收藏  举报