黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)
参考文章1:https://www.bilibili.com/video/BV1Kr4y1i7ru/
参考文章2:https://dhc.pythonanywhere.com/article/public/1/

文章目录
- 基础篇
- 数据库相关概念
- (数据库DataBase(DB)、数据库管理系统DataBase Management System(DBMS)、结构化查询语言SQL(Structured Query Language))
- 主流的关系型数据库管理系统(SQL统一语言标准)
- mysql安装及卸载
- 安装
- 卸载
- 数据模型
- 关系型数据库RDBMS(建立在关系模型基础上,由多张相互连接的二维表组成的数据库)
- SQL通用语法及分类
- 通用语法
- DDL(Data Definition Language): 数据定义语言,用来定义数据库对象(数据库,表,字段)
- 数据库操作
- 查询所有数据库:show databases
- 查询当前数据库:select
- 创建数据库:create
- 删除数据库:drop
- 使用数据库:use
- 注意事项
- 表操作
- mysql数据类型
- 数值类型
- 字符串类型
- 日期时间类型
- 查询当前数据库所有表:show tables
- 查询表结构:desc
- 查询指定表的建表语句:show create table(可展示表的详细信息,包括创建时的comment)
- 创建表:create table
- 添加字段:`ALTER TABLE ttt ADD fff ttt COMMENT 'xxx';`。MySQL中的字段可以在创建表时创建,也可以在创建表后单独添加
- 修改字段数据类型(`ALTER TABLE 表名 MODIFY`)(主要用于修改列的数据类型或更改默认值等。它只能用来修改已经存在的列的属性,不能修改列的名称)
- 修改字段名和字段数据类型(`ALTER TABLE 表名 CHANGE`)(不仅可以修改列的数据类型或更改默认值,还可以更改列的名称)
- 删除字段(`ALTER TABLE 表名 DROP 字段名;`)
- 修改表名(`ALTER TABLE 表名 RENAME TO 新表名`)
- 删除表(`DROP TABLE [IF EXISTS] 表名;`)
- 删除表,并重新创建该表(`TRUNCATE TABLE 表名`)(可用于清理表数据)
- DML(Data Manipulation Language): 数据操作语言,用来对数据库`表中`的数据进行增删改
- 添加数据`INSERT`
- 指定字段:`INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);`
- 全部字段:`INSERT INTO 表名 VALUES (值1, 值2, ...);`
- 批量添加数据
- 注意事项
- 更新数据(修改数据):`UPDATE`
- `UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ];`(注意:如果不带where条件修改的是整张表的数据)
- 删除(某条)数据:`DELETE`
- `DELETE FROM 表名 [ WHERE 条件 ];`(不带where条件将会删除整张表数据)
- DQL(Data Query Language): 数据查询语言,用来查询数据库中表的记录
- 基础查询
- 查询指定(单个或多个)字段:`SELECT 字段1, 字段2, 字段3, ... FROM 表名;`
- 查询所有字段:``SELECT * FROM 表名;``(建议开发中不要直接写`*`)
- 设置别名:`SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名;`或者`SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名;`
- 去除重复记录:`SELECT DISTINCT 字段列表 FROM 表名;`
- 转义:`ESCAPE`关键字定义转义字符
- 条件查询:`WHERE`关键字
- 语法
- 条件运算符
- 逻辑运算符
- 例子
- 聚合查询(聚合函数)(count、max、min、avg、sum)(将一列数据作为一个整体,进行纵向计算 )
- 常见聚合函数
- 语法
- 注意:所有的null值不参与聚合函数计算
- 示例
- 分组查询:`GROUP BY`关键字、`HAVING`关键字(可用`AS`关键字设置别名)
- 语法
- where 和 having 的区别
- 例子
- 注意事项
- 排序查询:ORDER BY关键字、ASC: 升序(默认)、DESC: 降序
- 语法
- 排序方式
- 例子
- 注意事项
- 分页查询:LIMIT关键字
- 语法
- 例子
- 注意事项
- DQL查询语句小结练习
- `DQL`语句编写顺序和执行顺序
- `DQL`编写顺序:`SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT`
- DQL执行顺序:`FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT`
- 示例:验证DQL执行顺序
- DCL(Data Control Language): 数据控制语言,用来管理数据库用户、控制数据库的访问权限
- 管理用户
- 查询用户
- 创建用户
- 修改用户密码
- 删除用户
- 例子
- 注意事项
- 权限控制
- 常用权限
- 查询权限:`SHOW GRANTS FOR`
- 授予权限:`GRANT `关键字
- 撤销权限:`REVOKE`关键字
- 注意事项
- 示例
基础篇
数据库相关概念
(数据库DataBase(DB)、数据库管理系统DataBase Management System(DBMS)、结构化查询语言SQL(Structured Query Language))

主流的关系型数据库管理系统(SQL统一语言标准)

mysql安装及卸载
安装

教程在windows上安装mysql社区版8.0.26版本
windows上安装方法参考视频:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=3
我用的是linux,我就介绍Ubuntu20.04上的安装mysql服务的方法:
-
首先,打开一个终端窗口。
-
更新包列表以确保获取最新的软件版本。可以通过运行以下命令来完成这一步:
sudo apt update -
安装MySQL服务器,运行以下命令:
sudo apt install mysql-server -
在安装完毕后,MySQL服务应该会自动启动。可以使用以下命令来确认MySQL正在运行:
sudo systemctl status mysql
-
对于初次安装MySQL,需要运行mysql_secure_installation脚本来提高MySQL的安全性。运行以下命令:
sudo mysql_secure_installation这个脚本将会引导你设置root用户的密码、删除匿名用户、禁止root远程登录,并删除测试数据库。
这个我们就不设置了,反正是调试用,设置太多影响效率
卸载
在Ubuntu 20.04中完全卸载MySQL,可以按照以下步骤操作:
-
首先,需要停止正在运行的MySQL服务。打开终端并输入以下命令:
sudo systemctl stop mysql -
然后,使用apt来卸载MySQL。输入以下命令:
sudo apt-get remove --purge mysql-server mysql-client mysql-common sudo apt-get autoremove sudo apt-get autoclean -
最后,为了确保所有相关的文件和配置都被删除,可以手动删除数据目录。默认情况下,这个目录通常是/var/lib/mysql。但是,应该检查系统以确认正确的位置。删除之前,请确保不再需要其中的任何数据。可以使用以下命令来删除这个目录:
sudo rm -rf /var/lib/mysql
注意:这将永久删除所有MySQL数据库和相关数据,所以在执行此操作前请确保已备份重要数据。
数据模型

关系型数据库RDBMS(建立在关系模型基础上,由多张相互连接的二维表组成的数据库)

同理,不通过表结构存储的数据库称为非关系型数据库。
SQL通用语法及分类
通用语法
在学习具体的SQL语句之前,先来了解一下SQL语言的通用语法。
- SQL语句可以单行或多行书写,以分号结尾。
- SQL语句可以使用空格/缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
- 注释:
单行注释:--注释内容 或#注释内容
多行注释:/*注释内容*/
DDL(Data Definition Language): 数据定义语言,用来定义数据库对象(数据库,表,字段)
数据库操作
- 先登录数据库:
mysql -u root -p
查询所有数据库:show databases
SHOW DATABASES;
-
示例:
show databases;
查询当前数据库:select
SELECT DATABASE();
-
示例:
select database();
创建数据库:create
CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ];
-
示例:
create database itcast;

-
不能创建名称已经存在的数据库:

-
可以加
if not exists判断选项,这样数据库存在不会创建,同时也不会报错:create database if not exists itcast;

-
创建时指定默认字符集(建议使用utf8mb4,占4个字节;而utf8只占3个字节):
create database if not exists itcast3 dafault charset utf8mb4;
当创建数据库时,选择
utf8mb4字符集的原因主要有以下几点:-
完整的Unicode支持:
utf8mb4(UTF-8 Multibyte 4)是一个在MySQL中用于表示UTF-8字符的字符集。与早期的utf8实现相比,它提供了对4字节长的Unicode字符的全面支持。这意味着它可以存储任何标准的Unicode字符。而原始的utf8实现只支持最多3字节长的字符,无法处理某些特殊字符,例如Emoji表情符号或者某些特殊的汉字。 -
数据安全性:由于
utf8不能正确处理4字节长的字符,如果试图插入这样的字符,可能会导致数据截断和丢失。使用utf8mb4可以避免这种情况,确保数据的完整性。 -
未来兼容性:随着更多的新的Unicode字符和Emoji表情符号的出现,
utf8mb4能够保证未来的兼容性。
因此,为了确保你的数据库能够处理所有类型的Unicode字符,一般建议在创建数据库时使用
utf8mb4字符集。 -
注意:字符集主要影响文本类型数据,例如 CHAR, VARCHAR, TEXT 等的存储和处理。通常它不会影响非字符串数据类型,如整型、浮点型、日期时间类型等的存储和处理。
删除数据库:drop
DROP DATABASE [ IF EXISTS ] 数据库名;
-
示例
drop database itcast;
使用数据库:use
USE 数据库名;
-
示例
use myDatabase;
-
可以使用select查询当前正在使用的数据库:

注意事项
- UTF8字符集长度为3字节,有些符号占4字节,所以推荐用utf8mb4字符集
表操作
mysql数据类型
数值类型

- 示例:
年龄:age tinyint unsigned
分数:score double(4,1),表示最长四位有效数字(100.0),然后1表示有1位小数。
字符串类型

定长字符串性能较好,变长字符串性能较差。
- 示例:
用户名:username varchar(50)
性别:gender char(1)
日期时间类型

- 示例:
生日:birthday date
查询当前数据库所有表:show tables
SHOW TABLES;
-
示例
show tables;
查询表结构:desc
DESC 表名;
-
示例
desc tb_user;
查询指定表的建表语句:show create table(可展示表的详细信息,包括创建时的comment)
SHOW CREATE TABLE 表名;
-
示例
show create table tb_user;
上面代码显示的是
tb_user表的创建语句。这个语句包含了表的名称、字段定义、存储引擎和字符集等信息。具体解释如下:
-
CREATE TABLE tb_user:创建名为tb_user的表。 -
下面是四个字段的定义:
idint DEFAULT NULL COMMENT ‘编号’:创建一个名为id的字段,数据类型为整型(int),默认值为NULL,注释为’编号’。namevarchar(50) DEFAULT NULL COMMENT ‘姓名’:创建一个名为name的字段,数据类型为可变长字符串(varchar),最大长度为50个字符, 默认值为NULL,注释为’姓名’。ageint DEFAULT NULL COMMENT ‘年龄’:创建一个名为age的字段,数据类型为整型(int),默认值为NULL,注释为’年龄’。gendervarchar(1) DEFAULT NULL COMMENT ‘性别’:创建一个名为gender的字段,数据类型为可变长字符串(varchar),最大长度为1个字符, 默认值为NULL,注释为’性别’。
-
ENGINE=InnoDB:指定表的存储引擎为InnoDB。MySQL支持多种存储引擎,每种存储引擎都有自己的优点和特性,InnoDB是最常用的一种,支持事务处理和行级锁定。 -
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci:指定表的默认字符集为utf8mb4,排序规则为utf8mb4_0900_ai_ci。字符集决定了表中文本数据的存储和处理方式,而排序规则决定了如何比较字符。 -
COMMENT='用户表':给表添加注释,说明这是一个’用户表’。
-
创建表:create table
CREATE TABLE 表名(字段1 字段1类型 [COMMENT 字段1注释],字段2 字段2类型 [COMMENT 字段2注释],字段3 字段3类型 [COMMENT 字段3注释],...字段n 字段n类型 [COMMENT 字段n注释]
)[ COMMENT 表注释 ];
注意:最后一个字段后面没有逗号
-
示例1

create table tb_user(id int comment '编号',name varchar(50) comment '姓名',age int comment '年龄',gender varchar(1) comment '性别') comment '用户表';

https://www.bilibili.com/video/BV1Kr4y1i7ru?p=8
-
示例2
设计一张员工信息表,要求如下:- 编号(纯数字)
- 员工工号 (字符串类型,长度不超过10位)
- 员工姓名(字符串类型,长度不超过10位)
- 性别(男/女,存储一个汉字)
- 年龄(正常人年龄,不可能存储负数)
- 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
- 入职时间(取值年月日即可)
对应的建表语句如下:

create table emp (id int comment '编号',workno varchar(10) comment '工号',name varchar(10) comment '姓名',gender char(1) comment '性别',age tinyint unsigned comment '年龄',idcard char(18) comment '身份证号',entrydate date comment '入职时间'
) comment '员工表';
把这个粘贴到终端就能添加了。
root@ubuntu:~#
root@ubuntu:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.34-0ubuntu0.20.04.1 (Ubuntu)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| myDatabase |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)mysql>
mysql>
mysql> use myDatabase;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql>
mysql>
mysql>
mysql> select database();
+------------+
| database() |
+------------+
| myDatabase |
+------------+
1 row in set (0.00 sec)mysql>
mysql>
mysql> show tables;
+----------------------+
| Tables_in_myDatabase |
+----------------------+
| tb_user |
+----------------------+
1 row in set (0.00 sec)mysql>
mysql>
mysql> create table emp (-> id int comment '编号',-> workno varchar(10) comment '工号',-> name varchar(10) comment '姓名',-> gender char(1) comment '性别',-> age tinyint unsigned comment '年龄',-> idcard char(18) comment '身份证号',-> entrydate date comment '入职时间'-> ) comment '员工表';
Query OK, 0 rows affected (0.10 sec)mysql>
mysql> show tables;
+----------------------+
| Tables_in_myDatabase |
+----------------------+
| emp |
| tb_user |
+----------------------+
2 rows in set (0.01 sec)mysql>
mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| workno | varchar(10) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| age | tinyint unsigned | YES | | NULL | |
| idcard | char(18) | YES | | NULL | |
| entrydate | date | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)mysql>
https://www.bilibili.com/video/BV1Kr4y1i7ru?p=8
添加字段:ALTER TABLE ttt ADD fff ttt COMMENT 'xxx';。MySQL中的字段可以在创建表时创建,也可以在创建表后单独添加
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
例:ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵称';
- 示例:给表添加email字段
# 列出所有数据库
show databases;
# 切换到指定数据库
use myDatabase;
# 查看当前使用的数据库
select database();
# 列出当前数据库所有表
show tables;
# 查看指定表结构
desc tb_user;
# 为指定表增加指定字段
alter table tb_user add email varchar(255);
# 查看指定表结构
desc tb_user;

修改字段数据类型(ALTER TABLE 表名 MODIFY)(主要用于修改列的数据类型或更改默认值等。它只能用来修改已经存在的列的属性,不能修改列的名称)
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
修改字段名和字段数据类型(ALTER TABLE 表名 CHANGE)(不仅可以修改列的数据类型或更改默认值,还可以更改列的名称)
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
- 例:将emp表的nickname字段修改为username,类型为varchar(30)
ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '昵称';


删除字段(ALTER TABLE 表名 DROP 字段名;)
ALTER TABLE 表名 DROP 字段名;
示例:


修改表名(ALTER TABLE 表名 RENAME TO 新表名)
ALTER TABLE 表名 RENAME TO 新表名
- 示例:


删除表(DROP TABLE [IF EXISTS] 表名;)
DROP TABLE [IF EXISTS] 表名;
- 示例:

删除表,并重新创建该表(TRUNCATE TABLE 表名)(可用于清理表数据)
TRUNCATE TABLE 表名;
- 示例:

DML(Data Manipulation Language): 数据操作语言,用来对数据库表中的数据进行增删改
添加数据INSERT
指定字段:INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
- 示例
给employee表所有的字段添加数据:
insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,'1','Itcast','男',10,'123456789012345678','2000-01-01');
-
用DataGrip:
点击表右键 --> New --> Query Console:

将上面的sql语句粘贴进去,全选sql语句(不然软件不知道你要执行哪一句),然后点击运行:


查询表数据,双击表即可查看,或者执行select * from xxx表查询表数据:

执行:select * from emp;
全部字段:INSERT INTO 表名 VALUES (值1, 值2, ...);
INSERT INTO 表名 VALUES (值1, 值2, ...);
- 示例:
insert into emp values(3,'3','Itcast','男',10,'12345','2000-01-01');

批量添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
-
示例:
insert into emp values(4,'4','Itcast','男',10,'123456789012345681','2000-01-01'),(5,'5','Itcast','男',10,'123456789012345682','2000-01-01');
注意用逗号,分隔不同条(行)的数据。
注意事项
- 字符串和日期类型数据应该包含在引号中
- 插入的数据大小应该在字段的规定范围内
更新数据(修改数据):UPDATE
UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ];(注意:如果不带where条件修改的是整张表的数据)
UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ];
- 例:
UPDATE emp SET name = 'Jack' WHERE id = 1;

删除(某条)数据:DELETE
DELETE FROM 表名 [ WHERE 条件 ];(不带where条件将会删除整张表数据)
DELETE FROM 表名 [ WHERE 条件 ];
-
示例1
DELETE FROM emp WHERE name = 'Jack';
-
示例2
DELETE FROM emp WHERE name = 'Jack';上面语句将会删除整张表数据:

DQL(Data Query Language): 数据查询语言,用来查询数据库中表的记录
-
语法:
SELECT字段列表 FROM表名字段 WHERE条件列表 GROUP BY分组字段列表 HAVING分组后的条件列表 ORDER BY排序字段列表 LIMIT分页参数 -
数据准备
表结构:create table emp (id int comment '编号',workno varchar(10) comment '工号',name varchar(10) comment '姓名',gender char(1) comment '性别',age tinyint unsigned comment '年龄',idcard char(18) comment '身份证号',workaddress varchar(50) comment '工作地址',entrydate date comment '入职时间' ) comment '员工表';表数据:
INSERT INTO emp (id, workno, name, gender, age, idcard,workaddress, entrydate) VALUES (1,'1','柳岩','女',20,'123456789012345678' ,'北京','2000-01-01'), (2,'2','张无忌','男',18,'123456789012345670' ,'北京' ,'2005-09-01'), (3,'3','韦一笑','男',38,'123456789712345670' ,'上海' ,'2005-08-01'), (4,'4','赵敏','女',18,'123456757123845670' ,'北京' ,'2009-12-01'), (5,'5','小昭','女',16,'123456769012345678' ,'上海' ,'2007-07-01'), (6,'6','杨道','男',28,'12345678931234567X' ,'北京' ,'2006-01-01'), (7,'7','范瑶','男',40,'123456789212345670' ,'北京' ,'2005-05-01'), (8,'8','黛绮丝','女',38,'123456157123645670' ,'天津' ,'2015-05-01'), (9,'9','范凉凉','女',45,'123156789012345678' ,'北京' ,'2010-04-01'), (10,'10','陈友谅','男',53,'123456789012345670' ,'上海' ,'2011-01-01'), (11,'11','张士诚','男',55,'123567897123465670' ,'江苏' ,'2015-05-01'), (12,'12','常遇春','男',32,'123446757152345670' ,'北京' ,'2004-02-01'), (13,'13','张三丰','男',88,'123656789012345678' ,'江苏' ,'2020-11-01'), (14,'14','灭绝','女',65,'123456719012345670' ,'西安' ,'2019-05-01'), (15,'15','胡青牛','男',70,'12345674971234567X' ,'西安' ,'2018-04-01'), (16,'16','周芷若','女',18,null ,'北京' ,'2012-06-01');

基础查询
查询指定(单个或多个)字段:SELECT 字段1, 字段2, 字段3, ... FROM 表名;
SELECT 字段1, 字段2, 字段3, ... FROM 表名;
-
示例
查询以下指定字段select name,workno,age from emp;
查询所有字段:SELECT * FROM 表名;(建议开发中不要直接写*)
- 示例:
SELECT * FROM emp;
设置别名:SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名;或者SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名;
SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名;
SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名;
-
示例:
SELECT workaddress as '工作地址' FROM emp;或者:
SELECT workaddress '工作地址' FROM emp;
去除重复记录:SELECT DISTINCT 字段列表 FROM 表名;
SELECT DISTINCT 字段列表 FROM 表名;
-
示例:
select distinct workaddress from emp;
转义:ESCAPE关键字定义转义字符
SELECT * FROM 表名 WHERE name LIKE '/_张三' ESCAPE '/'
/ 之后的_不作为通配符
在SQL查询中,LIKE操作符用于搜索某列的模式。其中,百分号(%)和下划线(_)是特殊字符。百分号表示任意数量的字符,包括零字符;而下划线代表一个单独的任意字符。
有时,我们可能需要搜索包含这些特殅字符的数据。为了使这些特殊字符被识别为普通字符,我们需要使用ESCAPE关键字。它定义了一个转义字符,让你能够在LIKE模式中搜索百分号或下划线。
在你给出的例子中,
ESCAPE '/'声明了斜杠(/)作为转义字符。然后,在WHERE子句中,name LIKE '/_张三'表示搜索以“张三”开头且前面有任意一个字符的所有名字。因此,/_张三匹配到的可能是“1张三”,“a张三”等等。总的来说,加上
ESCAPE '/'是为了明确指定在该查询中,我们希望把斜杠(/)视为转义字符,使得在LIKE模式中可以正确解析其后的下划线。
条件查询:WHERE关键字
语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
条件运算符
| 比较运算符 | 功能 |
|---|---|
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| = | 等于 |
| <> 或 != | 不等于 |
| BETWEEN … AND … | 在某个范围内(含最小、最大值) |
| IN(…) | 在in之后的列表中的值,多选 |
| LIKE 占位符 | 模糊匹配(_匹配单个字符,%匹配任意个字符) |
| IS NULL | 是NULL |
逻辑运算符
| 逻辑运算符 | 功能 |
|---|---|
| AND 或 && | 并且(多个条件同时成立) |
| OR 或 || | 或者(多个条件任意一个成立) |
| NOT 或 ! | 非,不是 |
例子
# 查找年龄等于20的员工信息
select * from emp where age = 20;# 查找年龄等于20的员工信息
select * from emp where age < 20;# 查找身份证号为null的员工信息
select * from emp where idcard is null;# 查找身份证号不是null的员工信息
select * from emp where idcard is not null;# 查找年龄不等于88的员工信息
select * from emp where age != 88;
select * from emp where age <> 88;# 查询年龄在15到20岁之间的员工信息
select * from emp where age > 15 and age < 20;
select * from emp where age > 15 && age < 20;
# 注意between为闭区间
select * from emp where age between 15 and 20;# 查询性别为女且年龄小于25岁的员工
select * from emp where gender = '女' and age < 25;
select * from emp where age in(18,19,40);# 查询姓名为两个字的员工信息
select * from emp where name like '__';# 查询身份证号最后一位为X的员工信息
select * from emp where emp.idcard like '%X';
select * from emp where emp.idcard like '_________________X';

聚合查询(聚合函数)(count、max、min、avg、sum)(将一列数据作为一个整体,进行纵向计算 )
常见聚合函数
| 函数 | 功能 |
|---|---|
| count | 统计数量 |
| max | 最大值 |
| min | 最小值 |
| avg | 平均值 |
| sum | 求和 |
语法
SELECT 聚合函数(字段列表) FROM 表名;
注意:所有的null值不参与聚合函数计算
示例
-- 统计企业员工数量(注意:不会统计字段值为null的行,所以不要把可能为null的字段来用于统计)
SELECT count(*) FROM emp;
SELECT count(id) FROM emp;-- 统计员工的平均年龄
SELECT avg(age) FROM emp;-- 统计员工的最大年龄
SELECT max(age) FROM emp;-- 统计员工的最小年龄
SELECT min(age) FROM emp;-- 统计西安地区的年龄之和
SELECT sum(age) FROM emp where workaddress = '西安';
分组查询:GROUP BY关键字、HAVING关键字(可用AS关键字设置别名)
语法
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ];
where 和 having 的区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件不参与分组;having是分组后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
例子
-- 根据性别分组,统计男性和女性数量(只显示分组数量,不显示哪个是男哪个是女)
select count(*) from emp group by gender;-- 根据性别分组,统计男性和女性数量(会显示哪个是男,哪个是女)
select gender, count(*) from emp group by gender;-- 根据性别分组,统计男性和女性的平均年龄
select gender, avg(age) from emp group by gender;-- 统计根据工作地址分组的人数
select workaddress, count(*) from emp group by workaddress;-- 统计年龄小于45,根据工作地址分组的人数
select workaddress, count(*) from emp where age < 45 group by workaddress;-- 统计年龄小于45,根据工作地址分组的人数,输出员工数量大于等于3的组(可设置别名as,as关键字可省略)
select workaddress, count(*) from emp where age < 45 group by workaddress having count(*) >= 3;
select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;
select workaddress, count(*) as address_count from emp where age < 45 group by workaddress having address_count >= 3;
注意事项
- 执行顺序:where > 聚合函数 > having
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
排序查询:ORDER BY关键字、ASC: 升序(默认)、DESC: 降序
语法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;
排序方式
- ASC: 升序(默认)
- DESC: 降序
例子
-- 根据年龄升序排序
SELECT * FROM emp ORDER BY age ASC;
SELECT * FROM emp ORDER BY age;-- 根据入职时间降序排序
SELECT * FROM emp ORDER BY entrydate desc ;-- 两字段排序,根据年龄升序排序,入职时间降序排序
SELECT * FROM emp ORDER BY age ASC, entrydate DESC;
注意事项
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
分页查询:LIMIT关键字
语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
例子
-- 查询第一页数据,展示10条
SELECT * FROM emp LIMIT 0, 10;
-- 查询第一页时,索引可省略
SELECT * FROM emp LIMIT 10;-- 查询第二页
SELECT * FROM emp LIMIT 10, 10;
注意事项
- 起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数
- 分页查询是数据库的方言,不同数据库有不同实现,MySQL是LIMIT
- 如果查询的是第一页数据,起始索引可以省略,直接简写 LIMIT 10
DQL查询语句小结练习


注意,第五个问题可能有歧义:
它可能有以下两种理解:
1、查询emp表中性别为男,且年龄在20到40岁(含20和40)的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
2、1、查询emp表中性别为男,且年龄在20到40岁(含20和40),年龄升序排序,年龄相同按入职时间升序排序,获取前5个员工信息。
对于第一种理解,“查询emp表中性别为男,且年龄在20到40岁(含20和40)的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。” 因为SQL的限制,不能直接先取前5条然后再排序,但可以通过子查询实现,如下:
SELECT *
FROM (SELECT *FROM empWHERE sex = '男' AND age BETWEEN 20 AND 40LIMIT 5
) AS subquery
ORDER BY age ASC, join_time ASC;
对于第二种理解,“查询emp表中性别为男,且年龄在20到40岁(含20和40),年龄升序排序,年龄相同按入职时间升序排序,获取前5个员工信息。” 这个问题是先排序,然后取前五个记录。对应的SQL语句为:
SELECT *
FROM emp
WHERE sex = '男' AND age BETWEEN 20 AND 40
ORDER BY age ASC, join_time ASC
LIMIT 5;
DQL语句编写顺序和执行顺序

DQL编写顺序:SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT
DQL执行顺序:FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT
示例:验证DQL执行顺序
-- 查询年龄大于15的员工的姓名、年龄,并根据年龄进行升序排序
select name,age from emp where age > 15 order by age asc ;
-- 验证执行顺序
select e.name e_name,e.age e_age from emp e where e.age > 15 order by e_age asc ;
DCL(Data Control Language): 数据控制语言,用来管理数据库用户、控制数据库的访问权限
管理用户
查询用户
USE mysql;
SELECT * FROM user;

localhost,root的含义是这个root只能通过本机访问数据库,无法通过远程方式访问数据库
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
删除用户
DROP USER '用户名'@'主机名';
例子
-- 创建用户arnoldtest1,只能在当前主机localhost访问,密码123456# create user 'arnoldtest1'@'localhost' identified by 'Reaishenghuo';
-- 提示:[2023-10-02 02:07:26] [HY000][1819] Your password does not satisfy the current policy requirements
-- 用:SHOW VARIABLES LIKE 'validate_password%';查看当前密码规则
SHOW VARIABLES LIKE 'validate_password%';
# validate_password.changed_characters_percentage,0
# validate_password.check_user_name,ON
# validate_password.dictionary_file,""
# validate_password.length,8
# validate_password.mixed_case_count,1
# validate_password.number_count,1
# validate_password.policy,MEDIUM
# validate_password.special_char_count,1
CREATE USER 'arnoldTest1'@'localhost' IDENTIFIED BY 'Reai#2023shenghuo';-- 创建用户arnoldTest1,能在任意主机访问
create user 'arnoldTest1'@'%' identified by 'Reai#2023shenghuo';-- 修改密码
alter user 'arnoldTest1'@'localhost' identified with mysql_native_password by 'Reai#2024shenghuo';-- 删除用户
drop user 'arnoldTest1'@'localhost';
drop user 'arnoldTest1'@'%';
注意事项
- 主机名可以使用 % 通配,此时创建的账号可从任意主机访问数据库
- 这类
SQL开发人员操作的比较少,主要是DBA(Database Administrator数据库管理员)使用
权限控制
常用权限
| 权限 | 说明 |
|---|---|
| ALL, ALL PRIVILEGES | 所有权限 |
| SELECT | 查询数据 |
| INSERT | 插入数据 |
| UPDATE | 修改数据 |
| DELETE | 删除数据 |
| ALTER | 修改表 |
| DROP | 删除数据库/表/视图 |
| CREATE | 创建数据库/表 |
更多权限请看权限一览表
查询权限:SHOW GRANTS FOR
SHOW GRANTS FOR '用户名'@'主机名';
授予权限:GRANT 关键字
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
撤销权限:REVOKE关键字
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意事项
- 多个权限用逗号分隔
- 授权时,数据库名和表名可以用
*进行通配,代表所有
示例
-- 创建用户
CREATE USER 'arnoldTest'@'localhost' IDENTIFIED BY 'Reai#2023shenghuo';-- 查询权限
SHOW GRANTS FOR 'arnoldTest'@'localhost';-- 授予权限(授予'arnoldTest'@'localhost'用户对myDatabase所有表的所有权限)
grant all on myDatabase.* to 'arnoldTest'@'localhost' ;-- 撤销权限
revoke all on myDatabase.* from 'arnoldTest'@'localhost' ;-- 删除用户
drop user 'arnoldTest'@'localhost';
不知道为啥授予和撤销权限的时候,老提示:
myDatabase> grant all on myDatabase.* to 'arnoldTest'@'localhost'
[2023-10-02 02:44:57] [42000][1044] Access denied for user 'root'@'%' to database 'myDatabase'
[2023-10-02 02:44:57] [42000][1044] Access denied for user 'root'@'%' to database 'myDatabase'
myDatabase> revoke all on myDatabase.* from 'arnoldTest'@'localhost'
[2023-10-02 02:44:59] [42000][1044] Access denied for user 'root'@'%' to database 'myDatabase'
[2023-10-02 02:44:59] [42000][1044] Access denied for user 'root'@'%' to database 'myDatabase'
莫名其妙的问题,以后遇到再说了!。。。
相关文章:
黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)
参考文章1:https://www.bilibili.com/video/BV1Kr4y1i7ru/ 参考文章2:https://dhc.pythonanywhere.com/article/public/1/ 文章目录 基础篇数据库相关概念(数据库DataBase(DB)、数据库管理系统DataBase Management Sy…...
最新AI智能创作系统源码V2.6.2/AI绘画系统/支持GPT联网提问/支持Prompt应用
一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的AI智能问答系统和AI绘画系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图…...
神器 CodeWhisperer
这两天看到了好多关于 Amazon CodeWhisperer 针对个人用户终身免费使用的消息,便抽空简单来重点介绍下如何在 VS Code 这款 IDE 上安装和使用 CodeWhisperer。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视…...
GraphQL全面深度讲解
目录 一、GraphQL 是什么 二、GraphQL 规范 数据模型 字段 参数 三、运行示例 四、优势和劣势 优势 劣势 一、GraphQL 是什么 GraphQL 是一种用于 API 的查询语言,也是一个基于服务端的运行引擎。 GraphQL 提供了一套完整的规范和描述用于查询 API…...
9.1 链表
链表:数据结构,一堆数据的集合,链表的每一项都是结构体,都使用指针指向下一个结构体。 数组的缺点:由于数组的地址是连续的,对数组的数据进行增、删、改后数据不连续,需要较大的运算量才能实现…...
分布式文件系统FastDFS实战
1. 分布式文件系统应用场景 互联网海量非结构化数据的存储需求: 电商网站:海量商品图片视频网站:海量视频文件网盘:海量文件社交网站:海量图片 2.FastDFS介绍 https://github.com/happyfish100/fastdfs 2.1简介 …...
手机自动直播系统源码交付与代理加盟注意事项解析!
随着直播行业的不断发展,手机自动直播已经成为了人们生活中不可或缺的一部分。手机无人直播软件成了香饽饽,各类手机实景直播APP大批量涌现。因为创业和技术门槛低,市场需求高,所以成了最火热创业赛道。那么如果是不懂技术的人群&…...
NodeJS 如何连接 MongoDB
初始化: yarn init使用命令: yarn add mongodb新建 index.js 文件: const MongoClient require(mongodb).MongoClient; const db_name "fly_articleDb"; const url mongodb://127.0.0.1:27017;(async function () {const cli…...
基于Java的老年人体检管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
燃气安全如何保障?万宾燃气管网监测系统时刻感知管网运行态势
近年来随着我国城镇化建设的加快,燃气已经成为每个家庭的必需品。然而,每年夏季频繁发生的燃气爆炸事故,已经严重危害人民生命财产安全危害社会公共安全和公共利益。为了保障燃气安全运行,近日,许多城市都在大力推进燃…...
2. selenium学习
Selenium 学习 简介 Selenium 是一个用于自动化浏览器的工具,它提供了多种编程语言的支持,包括 Python、Java、C# 等。它可以模拟用户在浏览器中的操作,比如点击按钮、填写表单、提交数据等。Selenium 具有强大的功能和灵活的定制性&#x…...
数学建模Matlab之评价类方法
大部分方法来自于http://t.csdnimg.cn/P5zOD 层次分析法 层次分析法(Analytic Hierarchy Process, AHP)是一种结构决策的定量方法,主要用于处理复杂问题的决策分析。它将问题分解为目标、准则和方案等不同层次,通过成对比较和计算…...
json能够存储图片吗?
JSON 本身并不适合存储图片,因为它是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON 数据格式简单,只包含键值对,因此它主要用于存储和传输文本数据。 然而,你可以将图片转换为 …...
C语言中自定义类型讲解
前言:C语言中拥有三种自定义类型,这三种自定义类型是怎么运用呢?在内存中又是怎么存储的呢?通过这篇文章我们来逐个讲解讲解。 三种类型分别是: 1.结构体 – 通俗的来讲就是可以把不同类型的变量放在一个集合中 2.枚举…...
Win10系统中GPU深度学习环境配置记录
运行环境 系统:Win10 处理器 Intel(R) Core(TM) i7-9700K CPU 3.60GHz 3.60 GHz 机带 RAM 16.0 GB 设备 ID A18D4ED3-8CA1-4DC6-A6EF-04A33043A5EF 产品 ID 00342-35285-64508-AAOEM 系统类型 64 位操作系统, 基于 x64 的处理器 显卡:NVIDIA GeF…...
pycharm一直没显示运行步骤,只是出现waiting for process detach
pycharm一直没显示运行步骤,只是出现waiting for process detach;各类音乐免费软件;最棒的下载torch-geometric-CSDN博客(不太推荐)我强烈推荐这个:_waiting for process detachhttps://blog.csdn.net/weix…...
管道读写特点以及设置成非阻塞
管道的读写特点: 使用管道时,需要注意以下几种特殊的情况(假设都是阻塞I/O操作) 1.所有的指向管道写端的文件描述符都关闭了(管道写端引用计数为0),有进程从管道的读端 读数据,那么管…...
(c++)类和对象 下篇
目录 1.再次了解构造函数 2. Static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 1.再次了解构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { pub…...
Tomcat报404问题的原因分析
1.未配置环境变量 按照需求重新配置即可。 2.IIs访问权限问题 注意:这个问题有的博主也写了,但是这个问题可有可无,意思是正常情况下,有没有都是可以访问滴放心 3.端口占用问题 端口占用可能会出现这个问题,因为tomcat的默认端口号是8080,如果在是运行tomcat时计算机的…...
《发现的乐趣》作者费曼(读书笔记)
目录 一、书简介 二、作者理查德•费曼 费曼式思维 教育与传承 三、个人思考 四、笔记 科学家眼中的花之美 关于偏科 父亲教育我的方式 知道一个概念和真正懂得这个概念有很大区别 我没有义务去成全别人对我的期望 诺贝尔奖——够格吗? 探究世界的游戏规…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
