MySQL快速入门指南:从零基础到基本操作

SQL语言介绍

SQL是数据库标准化语言,所有关系型数据库都适用

DQL 数据查询语言

用以从表中获得数据,确定数据怎样在应用程序给出。

关键字:SELECT、FROM、WHERE、ORDER BY、HAVING

DML 数据操作语言(针对表中的数据)

INSERT:添加数据

UPDATE:更新数据

DELETE:删除数据

DDL 数据定义语言(针对数据库对象,比如数据库)

CREATE:创建数据库对象

ALTER:修改数据库对象

DROP:删除数据库对象

DCL 数据控制语言

GRANT:授予用户某种权限

REVOKE:回收授予的某种权限

TCL 事务控制语言

COMMIT:提交事务

ROLLBACK:回滚事务

SAVEPOINT:设置回滚点

SQL语句不区分大小写,关键字建议大写

SQL可以单行或多行书写,以分号结尾

创建与删除数据库

创建数据库:

sql 复制代码
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符编码;

查看数据库编码:

sql 复制代码
show databases

查看数据库编码(假设数据库名为test):

sql 复制代码
select schema_name,default_character_set_name from information_schema.schemata
where schema_name = 'test';

删除数据库:

使用DDL语言删除数据库:

sql 复制代码
DROP DATABASE 数据库名称

示例:

sql 复制代码
drop database test

选择数据库

在创建表时,需要先选择数据库

sql 复制代码
USE 数据库名;

MySQL中的数据类型

整数类型

|--------------|----------------------------------|
| MySQL数据类型 | 含义(有符号) |
| tinyint(m) | 1个字节 范围(-128~127) |
| smallint(m) | 2个字节 范围(-32768~32767) |
| mediumint(m) | 3个字节 范围(-8388608~8388607) |
| int(m) | 4个字节 范围(-2147483648~2147483647) |
| bigint(m) | 8个字节 范围(+-9.22*10的18次方) |

数值类型中的长度m是指显示长度,并不表示存储长度,只有字段指定zerofill时有用。

浮点类型

|-------------|---------------------------|
| MySQL数据类型 | 含义 |
| float(m,d) | 单精度浮点型8位精度(4字节)m总个数,d小数位 |
| double(m,d) | 双精度浮点型16位精度(8字节)m总个数,d小数位 |

字符类型

|------------|--------------------|
| MySQL数据类型 | 含义 |
| char(n) | 固定长度,最多255个字符 |
| tinytext | 可变长度,最多255个字符 |
| varchar(n) | 可变长度,最多65535个字符 |
| text | 可变长度,最多65535个字符 |
| mediumtext | 可变长度,最多2的24次方-1个字符 |
| longtext | 可变长度,最多2的32次方-1个字符 |

char和varchar:

char长度固定,即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定长。

varchar可变长度,可以设置最大长度;适合用在长度可变的属性。

text不设置长度,当不知道属性的最大长度时,适合用text。

按照查询速度:char最快,varchar次之,text最慢

字符串型使用建议:

经常变化的字段用varchar

知道固定长度的用char

尽量用varchar

超过255字符的只能用varchar或者text

能用varchar的地方不用text

日期类型

|-----------|--------------------------|
| MySQL数据类型 | 含义 |
| date | 日期 YYYY-MM-DD |
| time | 时间 HH:MM:SS |
| datetime | 日期时间 YYYY-MM-DD HH:MM:SS |
| timestamp | 时间戳 YYYYMMDD HHMMSS |

二进制数据(BLOB)

BLOB和TEXT存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以

二进制方式存储,不分大小写。

BLOB存储的数据只能整体读出。

TEXT可以指定字符集,BLOB不用指定字符集。

创建表与删除表

使用DDL语句创建表

sql 复制代码
CREATE TABLE 表名(列名 类型,列名 类型......);

使用DDL语句删除表

sql 复制代码
DROP TABLE 表名;

修改表

修改表名:

使用DDL语句修改表

sql 复制代码
ALTER TABLE 旧表名 RENAME 新表名;

修改列名

sql 复制代码
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型;

修改列类型

sql 复制代码
ALTER TABLE 表名 MODIFY 列名 新类型;

添加新列

sql 复制代码
ALTER TABLE 表名 ADD COLUMN 新列名 类型;

删除指定列

sql 复制代码
ALTER TABLE 表名 DROP COLUMN 列名;

MySQL中的约束

约束:数据库提供的一种数据校验方式。

数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。

主键约束(Primary Key)PK

  • 不允许为空
  • 不允许有重复值出现
  • 保证数据的唯一性
添加主键约束

单一主键:使用一个列作为主键列,当该列的值有重复时,则违反唯一约束

联合主键:使用多个列作为主键列,当多个列的值都相同时,则违反唯一约束

修改表添加主键约束:

sql 复制代码
ALTER TABLE 表名 ADD PRIMARY KEY(列名)

主键自增长

MySQL中的自动增长类型要求:

  • 一个表中只能有一个列为自动增长。
  • 自动增长的列的类型必须是整数类型。
  • 自动增长只能添加到具备主键约束与唯一性约束的列上。
  • 删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然后再删除约束。
sql 复制代码
alter table 表名 modify 主键 类型 auto_increment;
删除主键约束
sql 复制代码
ALTER TABLE 表名 DROP PRIMARY KEY;

删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后再删除主键

去掉自动增长:

sql 复制代码
alter table 表名 modify 列名 类型;

外键约束(Foreign Key)

  • 允许有空值
  • 允许有重复
  • 值必须是参照表的参照列中所包含的值
  • 保证数据的参照完整性
添加外键约束
sql 复制代码
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY(列名) REFERENCES 参照的表名(参照的列名);
删除外键约束
sql 复制代码
ALTER TABLE 表名 DROP FOREIGN KEY 约束名;

唯一性约束(Unique)

  • 相同值只能出现一次
  • 允许为多个列添加唯一性约束
  • 保证数据的唯一性
添加唯一性约束
sql 复制代码
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名);
删除唯一性约束
sql 复制代码
ALTER TABLE 表名 DROP KEY 约束名

非空约束(Not Null)

  • 列中不能有空值
  • 允许重复值
  • 允许为多个列添加非空约束
  • 保证数据没有空值
添加非空约束
sql 复制代码
ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL;
删除非空约束
sql 复制代码
ALTER TABLE 表名 MODIFY 列名 类型 NULL;

检查约束(Check)

  • 用户自己定义约束条件
  • 保证数据满足自定义的条件约束
  • MySQL目前不支持检查约束

创建表时添加约束

查询表中的约束信息:

sql 复制代码
SHOW KEYS FROM 表名;

示例:

创建depts表包含department_id该列为主键且自动增长,department_name列不允许重复,location_id列不允许含有空值。

sql 复制代码
create table depts(department_id int primary key
auto_increment, department_name varchar(30) unique,leocation_id
int not null);

MySQL中DML操作

insert 添加数据

update 更新数据

delete 删除数据

添加数据

选择插入:

sql 复制代码
INSERT INTO 表名(列名1,列名2,列名3......)VALUES(值1,值2,值3......)

完全插入:

sql 复制代码
INSERT INTO 表名 VALUES(值1,值2,值3......);

如果主键是自动增长,需要使用default或者null或者0占位。

默认值处理

在MySQL中可以使用DEFAULT为列设定一个默认值。如果在插入数时并未指定该列的

值,那么MySQL会将默认值添加到该列中。

创建表时指定列的默认值:

sql 复制代码
CREATE TABLE 表名(列名 类型 default 默认值,...... );

修改表添加新列并指定默认值:

sql 复制代码
ALTER TABLE 表名 ADD COLUMN 列名 类型 DEFAULT 默认值;

插入数据时的默认值处理:

如果在插入数据时并未指定该列的值,那么MySQL会将默认值添加到该列中。如果是完全

项插入需要使用default来占位。

更新数据(UPDATE)

sql 复制代码
UPDATE 表名 SET 列名=值,列名=值 WHERE 条件;

注意:更新语句中一定要给定更新条件,否则表中的所有数据都会被更新。

示例:

更新emp3表中的id为1的数据,添加address为Beijing。

sql 复制代码
update emp3 set address = "BeiJing" where emp_id = 1;

删除数据(DELETE)

DELETE删除数据

sql 复制代码
DELETE FROM 表名 WHERE条件;

注意:在DELETE语句中,如果没有给定删除条件则会删除表中的所有数据。

示例:

删除emp3表中emp_id为1的雇员信息。

sql 复制代码
delete from emp3 where emp_id = 1;
TRUNCATE清空表
sql 复制代码
TRUNCATE TABLE 表名;

清空表时DELETE与TRUNCATE区别:

  • truncate是整体删除(速度较快),delete是逐条删除(速度较慢);
  • truncate不写服务器log,delete写服务器log,这也是truncate效率比delete高的原因;
  • truncate是会重置自增值,相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的值。而delete删除以后,自增值仍然会继续累加。

MySQL的DQL 查询数据

在 MySQL 中,SELECT 是 DQL 查询的核心语句,作用是从数据表中查询并返回需要的数据:

  • 选取字段(列筛选) 按需指定数据表中的字段,查询后只展示选中字段的数据,不需要的字段可以直接忽略。
  • 筛选数据行(行过滤) 通过设置筛选条件,只查询满足条件的数据行,避免查询整张表全部数据。
  • 多表连接查询 当业务数据分散在多张不同数据表时,依靠关联条件把多张表的数据拼接整合,一次性查询所需的关联数据。

SELECT基本语法:

sql 复制代码
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table;
  • SELECT 指定列
  • FROM 指定表

|----------------------|-------------|
| 语句 | 含义 |
| SELECT | 是一个或多个字段的列表 |
| * | 选择所有的列 |
| DISTINCT | 禁止重复 |
| column | expression | 选择指定的字段或表达式 |
| alias | 给所选择的列不同的标题 |
| FROM table | 指定包含列的表 |

查询中的列选择

选择所有列:

sql 复制代码
SELECT *
FROM 表名;

选择指定列:

sql 复制代码
SELECT 列名,列名
FROM 表名;
查询中的算术表达式

用算术运算符创建数字和日期数据的表达式

|----|----|
| 操作 | 说明 |
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除 |

需要修改数据显示方式时,可以用到算术表达式。

使用算术表达式(示例):

sql 复制代码
SELECT last_name,salary,salary + 300
FROM employees;

MySQL中定义空值 Null:

包含空值的算术表达式计算结果为空

MySQL中的别名

列别名:

sql 复制代码
SELECT 列名 AS 列别名 FROM 表名 WHERE 条件;

示例:

sql 复制代码
SELECT last_name AS name,commission_pot comm
FROM employees;

表别名:

sql 复制代码
SELECT 表别名.列名 FROM 表名 as 表别名 WHERE 条件;
MySQL中去除重复

SELECT默认显示所有的行,包括相同的行

在SELECT 子句中用DISTINCT关键字除去相同的行

sql 复制代码
SELECT DISTINCT 列名
FROM 表名;

查询中的行选择

用WHERE子句限制从查询返回的行。一个WHERE子句包含一个必须满足的条件,WHERE子句紧跟着FROM子句。如果条件是true,返回满足条件的行。

sql 复制代码
SELECT * | 投影列 FROM 表名 WHERE 选择条件;
MySQL中的比较条件:

|---------|------|
| 运算 | 含义 |
| = | 等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| <> != | 不等于 |

其他比较条件:

|-------------------|------------------|
| 操作 | 含义 |
| BETWEEN ...AND... | 在两个值之间(包含) |
| IN(set) | 匹配一个任意值列表 |
| LIKE | 匹配一个字符模块 |
| IS NULL | 检查某个字段是否为 NULL |
| IS NOT NULL | 检查字段是否包含非 NULL 值 |

使用BETWEEN条件

显示上下限之间的行

sql 复制代码
SELECT 列名,列名
FROM 表名
WHERE 列名 BETWEEN 下限 AND 上限;

用BETWEEN范围条件显示基于一个值范围的行,范围包括下限和上限(闭区间)

使用IN条件
sql 复制代码
SELECT 列名,列名,列名,列名
FROM 表名
WHERE 列名 IN (值,值,值);
使用LIKE条件

使用LIKE条件执行有效搜索串值的通配符搜索

搜索条件既可以包含文字也可以包含数字:

%表示零个或多个字符(占位)

_表示一个字符(占位)

sql 复制代码
SELECT 列名
FROM 表名
WHERE 列名 LIKE '_字符%';
使用NULL条件

在数据库中,NULL 表示缺失、未知或不适用的值。它不同于空字符串或零,需要特殊处理。

IS NULL 用于检查某个字段是否为 NULL。

sql 复制代码
SELECT 列名,列名
FROM 表名
WHERE 列名 IS NULL;

IS NOT NULL 用于检查字段是否包含非 NULL 值。

sql 复制代码
SELECT column_name
FROM table_name
WHERE column_name IS NOT NULL;

NULL 表示数据缺失或未知,无法用常规的比较运算符(如 =<>)判断。

逻辑条件

|-----|-------------------------|
| 运算 | 含义 |
| AND | 如果两个组成部分的条件都为真,返回TRUE |
| OR | 如果两个组成部分中的任一条件为真,返回TRUE |
| NOT | 如果跟随的条件为假,返回TRUE |

逻辑条件通过组合或反转比较条件生成最终结果,仅当所有条件为真时返回行。

示例:

sql 复制代码
SELECT * FROM table  
WHERE condition1 AND condition2;  -- 仅当 condition1 和 condition2 均为真时返回行  
优先规则

|------|-------------------------------------|
| 求值顺序 | |
| 1 | 算术运算 |
| 2 | 连字操作 |
| 3 | 比较操作 |
| 4 | IS NOT NULL , LIKE , NOT IN |
| 5 | NOT BETWEEN |
| 6 | NOT 逻辑条件 |
| 7 | AND 逻辑条件 |
| 8 | OR 逻辑条件 |

可以使用()改变优先规则

使用 ORDER BY排序

用ORDER BY字句排序行

  • ASC:升序排序,默认
  • DESC:降序排序

ORDER BY子句在SELECT 语句的最后

sql 复制代码
SELECT 列名
FROM 表名
ORDER BY 列名 ASC|DESC,列名 ASC|DESC;
相关推荐
bjzhang751 小时前
mysql 常用命令
数据库·mysql
计算机安禾1 小时前
【算法分析与设计】第48篇:流算法与数据概要技术
java·服务器·网络·数据库·算法
数据库小学妹1 小时前
时序数据库核心原理拆解:写入吞吐、压缩存储、融合分析全链路分析
数据库·经验分享·时序数据库·dba
我是一颗柠檬1 小时前
【Redis】Redis缓存应用实战Day12(2026年)
数据库·redis·缓存
zzz_23682 小时前
【Redis】Redis 面试深度系列
数据库·redis·面试
Java_2017_csdn2 小时前
在 Java 中,MessageFormat.format() 和 String.format() 函数对比?
java·开发语言·前端·数据库
basketball6162 小时前
Redis基础:2. Redis 常用命令
数据库·redis·缓存
码农阿豪2 小时前
Node.js 连金仓数据库(下篇):连接池、事务和那些坑
数据库·node.js