前言
本篇文章介绍了 MySql 数据库的一些基础用法(增删改查),罗列了常用的SQL语句,并进行分类整理。
目录
一、 SQL 的概念
二、 MySql 服务的启动与登录
三、 DDL 数据定义语言 :操作数据库、表
四、 DML 数据操纵语言 :增删改表中数据
五、 DQL 数据查询语言 :查询表中的记录
六、数据库的备份和还原
七、总结
一、SQL 的概念
1.1 什么是 SQL
Structured Query Language 结构化查询语言.
其实就是定义了操作所有关系型数据库的规则
1.2 SQL 作用
- 是一种所有关系型数据库的查询规范,不同的数据库都支持。
- 通用的数据库操作语言,可以用在不同的数据库中。
- 不同的数据库 SQL 语句有一些区别
1.3 SQL通用语法
- SQL 语句可以单行或多行书写,以分号结尾。
- 可使用空格和缩进来增强语句的可读性。
- MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
- 注释
- 单行注释: -- 注释内容 或 # 注释内容(mysql 特有)
- 多行注释: /* 注释 */
1.3 SQL 语句分类
Data Definition Language (DDL 数据定义语言)
用来定义数据库对象:数据库,表,列等。
关键字:create, drop,alter 等Data Manipulation Language (DML 数据操纵语言)
用来对数据库中表的数据进行增删改。
关键字:insert, delete, update 等Data Query Language (DQL 数据查询语言)
用来查询数据库中表的记录(数据)。
关键字:select, where 等Data Control Language(DCL 数据控制语言)
用来定义数据库的访问权限和安全级别,及创建用户。
关键字:GRANT, REVOKE 等
二、MySql 服务的启动与登录
MySQL 服务器启动方式有两种:
- 通过服务的方式自动启动
- 手动启动的方式
2.1 通过服务的方式自动启动
操作方式:
选中我的电脑 -> 右键,选择管理 -> 点击服务和应用程序->点击服务->在右侧列表找到 MySql
2.2 手动启动的方式
操作方式:
以管理员身份打开命令行
启动服务:
net start mysql服务名
停止服务:
net stop mysql服务名
注意:
在命令行中输入的是 net start mysql80 ,命令最后是 MySql 服务的名字,是在安装时起的。
我的是mysql80,所以命令行输入的服务名就是 mysql80。
MySql 服务的名字可以在服务和应用程序中看到,上面第二张图。
2.3 控制台登录 MySql
MySQL 是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的 root 账号,使用安装时设置的密码即可登录
- 登录格式 1:
mysql -u用户名 -p密码
注意:
u 和 p 后面没有空格
- 登录格式 2 :
mysql -h ip地址 -u用户名 -p密码
注意:127.0.0.1 代表本机的 IP 地址
- 退出 Mysql :
quit 或 exit
三、 DDL 数据定义语言 :操作数据库、表
3.1 操作数据库:CRUD
3.1.1 C(Create) :创建
- 创建数据库
CREATE DATAVASE 数据库名;
- 判断数据库是否已经存在,不存在则创建数据库
CREATE DATAVASE IF NOT EXITS 数据库名;
- 创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
具体操作如下:
-- 直接创建数据库 db1
create database db1;
-- 判断是否存在,如果不存在则创建数据库 db2
create database if not exists db2;
-- 创建数据库并指定字符集为 gbk
create database db3 default character set gbk;
3.1.2 R(Retrieve): 查询
- 查看所有的数据库
show databases;
- 查看某个数据库的定义信息
show create database 数据库名;
3.1.3 U(Update): 修改
- 修改数据库默认的字符集
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
3.1.4 D(Delete): 删除
- 删除数据库
DROP DATABASE 数据库名;
- 判断数据库存在,存在再删除
DROP DATABASE IF EXISTS 数据库名称;
3.1.5 使用数据库
- 查看正在使用的数据库
SELECT DATABASE();
- 使用/切换数据库
USE 数据库名;
3.2 操作表 :CRUD
3.2.1 C(Create):创建
- 创建表
CREATE TABLE 表名(
字段名1 字段类型1 ,
字段名2 字段类型2
)
例如:
CREATE TABLE student(
id INT,
name VARCHAR(20),
age INT,
birthday DATE
)
常用数据类型
数据类型 | 描述 |
---|---|
int | 整数类型 |
double | 小数类型 |
date | 日期,只包含年月日,yyyy-MM-dd |
datetime | 日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss |
timestamp | 时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss 果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值 |
varchar | 字符串 |
- 复制表
CREATE TABLE 新表名 LIKE 旧表名;
3.2.2 R(Retrieve):查询
- 查看某个数据库中的所有表
SHOW TABLES;
- 查看表结构
DESC 表名;
- 查看创建表的 SQL 语句
SHOW CREATE TABLE 表名;
3.2.3 U(Update):修改
- 修改表名
ALERT TABLE 表名 RENAME TO 新表名;
- 添加表列 ADD
ALTER TABLE 表名 ADD 列名 类型;
- 修改列类型 MODIFY
ALTER TABLE 表名 MODIFY 列名 新的类型;
- 修改列名 CHANGE
ALTER TABLE 表名 CHANGE 旧列名 新列名 新的类型;
- 删除列 DROP
ALTER TABLE 表名 DROP 列名;
- 修改字符集 character set
ALTER TABLE student CHARACTER SET 字符集;
3.2.4 D(Delete):删除
- 直接删除表
DROP TABLE 表名;
- 判断表是否存在,如果存在则删除表
DROP TABLE IF EXISTS 表名;
四、DML 数据操纵语言 :增删改表中数据
4.1 添加数据
- 插入全部字段
INSERT INTO 表名 (字段名 1, 字段名 2, 字段名 3…) VALUES (值 1, 值 2, 值 3);
- 不写字段名
INSERT INTO 表名 VALUES (值 1, 值 2, 值 3…);
- 插入部分数据
INSERT INTO 表名 (字段名 1, 字段名 2, ...) VALUES (值 1, 值 2, ...);
没有添加数据的字段会使用 NULL
4.2 修改表记录
- 不带条件修改数据
UPDATE 表名 SET 字段名1=值1,字段名2=值2 ... [where 条件];
注意:
如果不加任何条件,则会将表中所有记录全部修改
4.3 删除表记录
DELETE FROM 表名 [ WHERE 条件 ];
注意:
如果不加条件,则删除表中所有记录
4.4 删除所有记录
有两种方式:
- DELETE FROM 表名;
不推荐使用。有多少条记录就会执行多少次删除操作 - TRUNCATE TABLE 表名;
推荐使用,效率更高。
先删除表,然后再创建一张相同的表。
- 使用 truncate 删除表中所有记录
TRUNCATE TABLE 表名;
4.5 truncate 和 delete 的区别:
truncate 相当于删除表的结构,再创建一张表
五、 DQL 数据查询语言 : 查询表中的记录
查询语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
5.1 基础查询
- 查询表所有行和列的数据
SELECT * FROM 表名;
- 查询指定列
SELECT 字段名1 [AS 别名], 字段名2 [AS 别名]... FROM 表名 [AS 表别名];
例如:
select t1.name as 姓名, t1.age as 年龄 from student as t1
- 查询指定列并且结果不出现重复数据
SELECT DISTINCT 字段名 FROM 表名;
- 某列数据和固定值运算
SELECT 列名1 + 固定值 FROM 表名;
- 某列数据和其他列数据参与运算
SELECT 列名1 + 列名2 FROM 表名;
注意:
参与运算的必须是数值类型
5.2 条件查询
为什么要条件查询?
如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件,对记录进行过滤
- 条件查询的语法
SELECT 字段名 FROM 表名 WHERE 条件;
运算符
运算符 | 说明 |
---|---|
>、<、<=、>=、=、<> | <>在 SQL 中表示不等于,在 mysql 中也可以使用!=,没有== |
BETWEEN...AND | 在一个范围之内,如:between 100 and 200相当于条件在 100 到 200 之间,包头又包尾 |
IN(集合) | 集合表示多个值,使用逗号分隔 |
LIKE '张%' | 模糊查询 % -> 匹配任意多个字符串 _ -> 匹配一个字符 |
IS NULL | 查询某一列为 NULL 的值,注:不能写=NULL |
逻辑运算符
运算符 | 说明 | ||
---|---|---|---|
and 或 && | 与,SQL 中建议使用前者,后者并不通用 | ||
or 或 | 或 | ||
not 或 ! | 非 |
例如:
-- 查询年龄大于20岁
SELECT * FROM student WHERE age > 20;
-- 查询年龄不等于20岁
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;
-- 查询年龄22岁,18岁,25岁的信息
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM student WHERE age IN (22,18,25);
-- 查询姓马的有哪些? like
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询姓名第二个字是化的人
SELECT * FROM student WHERE NAME LIKE "_化%";
-- 查询姓名是3个字的人
SELECT * FROM student WHERE NAME LIKE '___';
-- 查询姓名中包含德的人
SELECT * FROM student WHERE NAME LIKE '%德%';
5.3 排序查询
语法:
ORDER BY 排序字段1 [排序方式1] , 排序字段2 [排序方式2]...
排序方式:
- ASC:升序,默认的。
- DESC:降序
例如:
--查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序
SELECT * FROM student ORDER BY age DESC, math ASC;
注意 :
同时对多个字段进行排序,如果第 1 个字段相等,则按第 2 个字段排序,依次类推
5.4 聚合函数
将一列数据作为一个整体,进行纵向的计算。
聚合函数会忽略空值 NULL
语法:
SELECT 聚合函数(列名) FROM 表名
函数名 | 含义 |
---|---|
count(列名) | 统计这一列有多少条记录 |
max(列名) | 求这一列的最大值 |
min(列名) | 求这一列的最小值 |
sum(列名) | 求这一列总和 |
avg(列名) | 求这一列的平均值 |
例如:
--查询数学成绩总分
SELECT SUM(math) 总分 FROM student;
-- 查询数学成绩平均分
SELECT AVG(math) 平均分 FROM student;
由于聚合函数对 NULL 的记录不会统计,如果需要把 NULL 也统计进去,可以使用 IFNULL(列名,默认值)
SELECT IFNULL(math,0) FROM student;
5.5 分组查询
语法:
GROUP BY 分组字段 [HAVING 条件];
GROUP BY 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。
分组的目的就是为了统计,一般分组会跟聚合函数一起使用
注意:
当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的
例如:
-- 按照性别分组。分别查询男、女同学的平均分
SELECT sex , AVG(math) FROM student GROUP BY sex;
-- 按照性别分组。分别查询男、女同学的平均分,人数
SELECT sex , AVG(math), COUNT(id) FROM student GROUP BY sex;
-- 按照性别分组。分别查询男、女同学的平均分,人数
要求:分数低于70分的人,不参与分组
SELECT sex , AVG(math), COUNT(id) FROM student WHERE math>70 GROUP BY sex ;
-- 按照性别分组。分别查询男、女同学的平均分,人数
要求:分数低于70分的人,不参与分组。分组之后,人数要大于2个人
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
注意:最后一个查询语句,第二个条件人数要大于2个人,用的是关键字 HAVING
where 和 having 的区别?
- where 在分组之前进行限定,如果不满足条件,则不参与分组。
having在分组之后进行限定,如果不满足结果,则不会被查询出来 - where 后不可以跟聚合函数,having可以进行聚合函数的判断。
5.6 分页查询
语法:
LIMIT 开始的索引,每页查询的条数
公式:
开始的索引 = (当前的页码 - 1) * 每页显示的条数
例如:
-- 查询学生表中数据,从第 3 条开始显示,显示 6 条。
SELECT * FROM student LIMIT 2,6;
六、数据库的备份和还原
这里只介绍命令行方式,图形化界面的备份和还原请自行解决。
6.1 备份操作
格式:
mysqldump -u用户名 -p密码 数据库名称 > 文件的路径
注意:-u 和 用户名之间没有空格,-p也一样
--备份数据库test到D盘
mysqldump -uroot -p123456 test > d:/test.sql
执行完后,会在D盘生成一个test.sql文件
6.2 还原操作
格式:
use 数据库名称;
source 文件的路径
接着上一步的操作,我们模仿还原一下数据:
-- 1. 登录MySql
mysql -uroot -p123456;
-- 2.选中数据库test
use test;
show tables;
-- 3. 删除数据库test中的表,模仿数据丢失
drop table student;
-- 4. 使用 SOURCE 命令还原数据
source d:/test.sql;
-- 5. 查看还原结果
show tables;
select * from student;
七、总结
这篇文章主要对 MySql 的基础语法进行了整理归类,既对基础知识进行巩固,又可在遗忘时进行回顾。
下篇文章将会介绍数据库中约束以及表之间关系的相关知识。
注:由于本人水平有限,所以难免会有理解偏差或者使用不正确的问题。如果小伙伴们有更好的理解或者发现有什么问题,欢迎留言批评指正~