数据库是按照数据结构组织、存储和管理数据的仓库,存放数据的仓库,为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。mysql数据库就是这样一个关系型数据库管理系统(RDBMS),它可以称得上是目前运行速度最快的SQL数据库管理系统。
mysql是一款自由软件,任何人可以从官网网址中下载。mysql是一个真正的多用户,多线程sql数据库服务器。它是以客户/服务器结构的实现,由一个服务程序mysqld和很多不同的客户程序和库组成。它能够快捷、有效和安全地处理大量的数据。相对于oracle等数据库来说,mysql在使用时非常简单。mysql的主要目标是快捷、便捷和易用,以下是mysql的一些特点:
关系数据库是数据项之间具有预定义关系的数据项的集合。这些项被组织为一组具有列和行的表。表用于保存有关要在数据库中表示的对象的信息。表中的每列都保存着特定类型的数据,字段存储着属性的实际值。表中的行表示一个对象或实体的相关值的集合。表中的每一行可标有一个称为主键的唯一标识符,并且可使用外键在多个表中的行之间建立关联。可以通过许多不同的方式访问此数据,而无需重新组织数据库表本身。
关系型数据库有几个重要的方面,其特点如下:
**SQL:**SQL(结构化查询语言)是用于与关系数据库通信的主要接口。SQL 于 1986 年成为美国国家标准协会 (ANSI) 的标准。流行的所有关系数据库引擎都支持标准的 ANSI SQL,其中一些引擎还对 ANSI SQL 进行了扩展,可支持特定于该引擎的功能。SQL 可用于添加、更新或删除数据行,检索事务处理和分析应用程序的数据子集,以及管理数据库的所有方面。
**数据完整性:**数据完整性指的是数据的整体完整性、准确性和一致性。关系数据库使用一组约束来强制确保数据库中数据的完整性。它们包括主键、外键、“Not NULL”约束、“Unique”约束、“Default”约束和“Check”约束。这些完整性约束有助于在表中的数据上强制实施业务规则,以确保数据的准确性和可靠性。除此之外,大多数关系数据库还允许将自定义代码嵌入到基于数据库上的操作执行的触发器中。
**事务处理:**数据库事务是作为构成单个逻辑工作单元的操作序列执行的一个或多个 SQL 语句。事务提供了一个“全是或全否”命题,这意味着整个事务必须作为一个单元完成并写入数据库,否则事务的各个组成部分都不应执行。在关系数据库术语中,事务会导致 COMMIT 或 ROLLBACK。每个事务以连贯和可靠的方式独立于其他事务进行处理。
ACID 合规性:
所有数据库事务都必须遵守 ACID,即必须是原子的、一致的、隔离的和持久的,以确保数据的完整性。
原子性要求事务作为一个整体成功执行,如果事务的任一部分执行失败,则整个事务都将无效。一致性规定作为事务一部分写入数据库的数据必须遵守所有定义的规则及限制,后者包括约束、级联和触发器。隔离对于实现并发控制至关重要,它确保每个事务对其自身是独立的。持久性要求在成功完成事务后,对数据库所做的所有更改都是永久性的。
SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系型数据库的编程语言。它被用于创建、修改和查询数据库,以及执行诸如数据插入、删除和更新等各种任务。SQL 在Web开发、数据分析和数据库管理系统中被广泛应用。
--
注释内容或 #
注释内容/*
注释内容 */
SQL 语句的分类如下:
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Define Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
搜索 MySQL Command Line Client
,打开并输入密码,则可以尝试以下命令:
查询所有数据库
SHOW DATABASES;
查询当前数据库
SELECT DATABASE();
创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则]
删除数据库
DROP DATABASE[IF EXISTS] 数据库名
使用数据库
USE 数据库名;
查询当前数据库所有表
SHOW TABLES;
查询表的结构,即表定义的列的类型等
DESC 表名;
查询指定表的建表语句
SHOW CREATE TABLE 表名;
创建表
表的创建语句如下:
CREATE TABLE 表名(
字段名1 字段1类型 [COMMENT 字段名1注释],
字段名2 字段2类型 [COMMENT 字段名2注释],
字段名3 字段3类型 [COMMENT 字段名3注释],
……
字段名n 字段n类型 [COMMENT 字段名n注释]
)
创建的语句示例如下:
create table tb_user(
id int comment '编号',
name varchar(50) comment '姓名',
age int comment '年龄',
gender varchar(1) comment '性别'
) comment '用户表';
添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度)[COMMENT 注释][约束]
修改列数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度)
修改字段名和数据类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束]
删除字段
ALTER TABLE 表名 DROP 字段名
修改表名
ALTER TABLE 表名 RENAME TO 新表名
删除表
DROP TABLE [IF EXISTS] 表名
数值类型
类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
---|---|---|---|---|
TINYINT |
1 byte | (-128, 127) |
(0, 255) |
小整数值 |
SMALLINT |
2 bytes | (-32768, 32767) |
(0, 65535) |
大整数值 |
MEDIUMINT |
3 bytes | (-8388608, 8388607) |
(0, 16777215) |
大整数值 |
INT 或INTEGER |
4 bytes | (-2147483648, 2147483647) |
(0, 4294967295) |
大整数值 |
BIGINT |
8 bytes | (-2^63, 2^63-1) |
(0, 2^64-1) |
极大整数值 |
FLOAT |
4 bytes | (-3.402823466 E+38, 3.402823466351 E+38) |
0 和 (1.175494351 E-38, 3.402823466 E+38) |
单精度浮点数值 |
DOUBLE |
8 bytes | (-1.7976931348623157 E+308, 1.7976931348623157 E+308) |
0 和 (2.2250738585072014 E-308, 1.7976931348623157 E+308) |
双精度浮点数值 |
DECIMAL |
依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确定点数) |
字符串类型
类型 | 大小 | 描述 |
---|---|---|
CHAR |
0-255 bytes | 定长字符串 |
VARCHAR |
0-65535 bytes | 变长字符串 |
TINYBLOB |
0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT |
0-255 bytes | 短文本字符串 |
BLOB |
0-65 535 bytes | 二进制形式的长文本数据 |
TEXT |
0-65 535 bytes | 长文本数据 |
MEDIUMBLOB |
0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT |
0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB |
0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT |
0-4 294 967 295 bytes | 极大文本数据 |
日期类型数据
类型 | 大小 | 范围 | 格式 | 描述 |
---|---|---|---|---|
DATE |
3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD |
日期值 |
TIME |
3 | -838:59:59 至 838:59:59 | HH:MM:SS |
时间值或持续时间 |
YEAR |
1 | 1901 至 2155 | YYYY |
年份值 |
DATETIME |
8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS |
混合日期和时间值 |
TIMESTAMP |
4 | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS |
混合日期和时间值,时间戳 |
首先新建一个Project,然后点击 + 号,找到对应的数据源,这里选 MySQL。
然后填写连接中的账号和密码,并点击下面的 Test Connection,如果显示成功则点击OK。
然后点击 New Schema 创建数据库。
弹出窗口后创建数据库的名字,注意,这里的语句中建立 Schema和Database起到的效果是一致的。
创建表也一样简单,只需要右键创建表即可,
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作,其通常的操作如下:
添加数据(INSERT)
修改数据(UPDATE)
删除数据(DELETE)
给指定字段添加数据
INSERT INTO 表名(字段名1,……) VALUES(值1,……)
给全部字段添加数据
INSERT INTO 表名 VALUES(值1,……)
批量添加数据
INSERT INTO 表名(字段名1,……) VALUES(值1,……),(值1,……),(值1,……);
INSERT INTO 表名 VALUES(值1,……),(值1,……),(值1,……);
注意:
修改数据
UPDATE 表名 SET 字段名1=值1, 字段名2=值2,…… [WHERE 条件]
如果不加 where
条件, 则修改的时整个表的所有行的字段名。
删除数据
DELETE FROM 表名 [WHERE 条件]
DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
DELETE语句不能删除某一个字段的值(可以使用UPDATE)。
DQL 数据库查询语句的一般模板如下:
查询多个字段
SELECT 字段1,... FROM 表名
SELECT * FROM 表名 ;
*
号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
字段设置别名
SELECT 字段1 [AS 别名1], 字段2 [AS 别名2] ... FROM 表名;
SELECT 字段1 [别名1], 字段2 [别名2] ... FROM 表名;
在设置字段别名的时候,AS
可以省略不写。
去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
条件查询的语句如下:
SELECT 字段列表 FROM 表1 名 WHERE 条件列表;
常用的比较运算符如下:
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN … AND … | 在某个范围之内(含最小、最大值) |
IN(…) | 在in之后的列表中的值,多选一 |
LIKE 占位符 | 占位符模糊匹配(_匹配单个字符, %匹配任意个字符) |
IS NULL | 是NULL |
常用的逻辑运算符如下:
逻辑运算符 | 功能 |
---|---|
AND 或 && | 并且(多个条件同时成立) |
OR 或 || | 或者(多个条件任意一个成立) |
NOT 或 ! | 非,不是 |
语法示例如下:
# 查询没有身份证号的员工信息
select * from emp where idcard is null;
# 查询年龄不等于 88 的员工信息
select * from emp where age != 88;
select * from emp where age <> 88;
# 查询年龄等于18 或 20 或 40 的员工信息
select * from emp where age in(18,20,40);
聚合函数将一列数据作为一个整体,进行纵向计算 。
常见的聚合函数如下:
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
其语法为:
SELECT 聚合函数(字段列表) FROM 表名 ;
注意 : 表中的NULL
值是不参与计算的。
语句示例为:
# 统计该企业员工的平均年龄
select avg(age) from emp;
# 统计西安地区员工的年龄之和
select sum(age) from emp where workaddress = '西安';
分组查询语法为:
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING分组后过滤条件 ];
在这里给大家说说 where,having
的区别。
where
是分组之前进行过滤,不满足where
条件,不参与分组;而having
是分组之后对结果进行过滤。where
不能对聚合函数进行判断,而having
可以。其使用案例如下:
# 根据性别分组 , 统计男性员工 和 女性员工的数量
select gender, count(*) from emp group by gender;
# 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址
select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;
# 统计各个工作地址上班的男性及女性员工的数量
select workaddress, gender, count(*) '数量' from emp group by gender, workaddress;
排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序。
排序的语法如下:
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2 ;
排序方式包括:
ASC
升序(默认值),由于是默认,可以不用指定DESC
降序如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台都需要借助于数据库的分页操作。
分页查询的语法如下:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
其中:
起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10
在查询语法的各个部分,有不同的执行顺序,其各个部分对应的执行顺序如下图所示:
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。
查询用户
SELECT * FROM mysql.user
查询的结果如下:
其中 Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问,是不可以远程访问的。 User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯一标识一个用户。
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
删除用户
DROP USER '用户名'@'主机名' ;
其代码示例如下:
# 创建用户suppose, 只能够在当前主机localhost访问, 密码123456;
create user 'suppose'@'localhost' identified by '123456';
# 创建用户go, 可以在任意主机访问该数据库, 密码123456;
create user 'go'@'%' identified by '123456';
# 修改用户go的访问密码为1234;
alter user 'go'@'%' identified with mysql_native_password by '1234';
MySQL中定义了很多种权限,但是常用的就以下几种:
权限 | 说明 |
---|---|
ALL, ALL PRIVILEGES |
所有权限 |
SELECT |
查询数据 |
INSERT |
插入数据 |
UPDATE |
修改数据 |
DELETE |
删除数据 |
ALTER |
修改表 |
DROP |
删除数据库、表、视图 |
CREATE |
创建数据库、表 |
上述只是简单罗列了常见的几种权限描述,其他权限描述及含义,可以直接参考官方文档。
有关权限的语法如下:
查询权限
SHOW GRANTS FOR '用户名'@'主机名' ;
授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意:
*
进行通配,代表所有示例如下:
# 查询 'go'@'%' 用户的权限
show grants for 'go'@'%';
# 授予 'go'@'%' 用户study数据库所有表的所有操作权限
grant all on study.* to 'go'@'%';
# 撤销 'go'@'%' 用户的study数据库的所有权限
revoke all on study.* from 'go'@'%';
%
:表示任何字符出现任意次数 (可以是0次)。_
:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然,也可以like “陈____”,数量不限。like
操作符:LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较;但如果like后面没出现通配符,则在SQL执行优化时将 like 默认为 “=”执行%通配符
# 模糊匹配含有“工”字的数据
select * from tb_user where profession like '%工%'
# 模糊匹配以“工”字结尾的数据
select * from tb_user where profession like '%工'
# 模糊匹配以“工”字开头的数据
select * from tb_user where profession like '工%'
_通配符
# 查询以“工”为结尾的,长度为四个字的数据
select * from tb_user where profession like '___工'
# 查询以“软”开头,“工”结尾的数据
select * from tb_user where profession like '软__工'
**注意大小写。**在使用模糊匹配时,也就是匹配文本时,MySQL默认配置是不区分大小写的。当你使用别人的MySQL数据库时,要注意是否区分大小写,是否区分大小写取决于用户对MySQL的配置方式。如果是区分大小写,那么像Test12这样记录是不能被"test__"这样的匹配条件匹配的。
注意NULL。%
通配符可以匹配任意字符,但是不能匹配NULL
,也就是说SELECT * FROM blog where title_name like '%';
是匹配不到title_name
为NULL
的的记录。
**不要过度使用通配符。**通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长,消耗更多的内存等资源。如果其他操作符能达到相同的目的,应该使用其他操作符。
**在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。**因为MySQL在where后面的执行顺序是从左往右执行的,如果把通配符置于搜索模式的开始处(最左侧),搜索起来是最慢的(因为要对全库进行扫描)。
通配符转义。 像如果我们匹配的结果有 _,%
的情况,我们就需要使用到转义符了。MySQL中的转义符需要加 ESCAPE
关键字进行转义。如下,ESCAPE
后面跟着一个字符,里面写着什么,MySQL就把那个符号当做转义符,一般我就写成"/"
。
select * from tb_user where profession like '%/_%' escape '/';
MySQL有内置的函数检索,即 locate,position,instr
,相当于Java中的 str.contains()
方法,返回的是匹配内容在字符串中的位置,效率和可用性上都优于通配符匹配。
下面我们即对MySQL的三个内置函数检索进行讲解,首先声明,MySQL的下标是从1开始,并不是从0开始。
其函数语法为:
LOCATE(substr,str, [pos])
返回 substr
在 str
中第一次出现的位置。如果 substr
在 str
中不存在,返回值为 0,如果substr
在 str
中存在,返回值为substr
在 str
中第一次出现的位置。
如果有pos
参数存在,那么从位置pos
开始的字符串str
中第一次出现子字符串substr
的位置。 如果substr
不在str
中,则返回0
。 如果substr
或str
为NULL
,则返回NULL
。
示例:
其中使用反引号是为了用于引用表列名,以便识别列名中包含特殊字符、空格或与 SQL 关键字冲突的情况。
# 用LOCATE关键字进行模糊匹配,等同于:"like '%工%'"
SELECT * from tb_user where LOCATE('工', `profession`) > 0;
#
SELECT * from tb_user where LOCATE('工', `profession`, 2) > 0;
语法如下:
POSITION(substr IN substr)
这个方法可以理解为locate(substr,str)
方法的别名,因为它和locate(substr,str)
方法的作用是一样的。
语法如下:
INSTR(str,substr)
返回字符串str
中第一次出现子字符串substr
的位置。INSTR()
与LOCATE()
的双参数形式相同,只是参数的顺序相反。
# 用INSTR关键字进行模糊匹配,功能跟like一样 ,等同于:"like '%工%'"
SELECT * from tb_user where INSTR(`profession`, '工');
MySQL中的regexp
和rlike
关键字属于同义词,功能相同。下面仅讲解regexp
。
REGEXP 不支持通配符"%、_",支持正则匹配规则,是一种更细力度且优雅的匹配方式。
参数类型 | 作用 |
---|---|
(^) | 匹配字符串的开始位置,如“^a”表示以字母a开头的字符串。 |
($) | 匹配字符串的结束位置,如“X^”表示以字母X结尾的字符串。 |
(.) | 这个字符就是英文下的点,它匹配任何一个字符,包括回车、换行等。 |
(*) | 星号匹配0个或多个字符,在它之前必须有内容。如:select * from table where name regexp 'ba*' (可以命中“baaa”) |
(+) | 加号匹配1个或多个字符,在它之前也必须有内容。加号跟星号的用法类似,只是星号允许出现0次,加号则必须至少出现一次。 |
(?) | 问号匹配0次或1次。 |
{n} | 匹配指定n个 |
{n,} | 匹配不少于n个 |
{n,m} | 匹配n-m个 |
使用 REGEXP '工'
等同于 like '%网%'
,如下示例。
SELECT * from tb_user where profession REGEXP '工';
-- 等同于
SELECT * from tb_user where profession like '%工%';
regexp
中的或使用的是 |
符号,其可以搜索多个字符串之一,相当于 or,示例如下:
# 匹配包含“中国”或“互联网”或“大学”的数据
SELECT * from app_info where appName REGEXP '中国|互联网|大学';
REGEXP
后的匹配完全按照正则表达式来进行,所以可以直接使用正则表达式即可。
mysql中有一些特殊含义的符号,可以代表不同类型的匹配,如:
# 匹配name中含有数字的
select * from app_info where appName regexp '[[:digit:]]';
其他的这种字符类还有:
字符类 | 作用 |
---|---|
[:alnum:] | 匹配字面和数字字符。(等同于[AZaz0~9]) |
[:alpha:] | 匹配字母字符。(等同于[AZaz]) |
[:blank:] | 匹配空格或制表符(同[\\t]) |
[:cntrl:] | 匹配控制字符(ASCII0到37和127) |
[:digit:] | 匹配十进制数字。(等同于[0-9]) |
[:graph:] | 匹配ASCII码值范围33~126的字符。与[:print:]相似,但不包括空格字符 |
[:print:] | 任何可打印字符 |
[:lower:] | 匹配小写字母,等同于[a-z] |
[:upper:] | 匹配大写字母,等同于[A-Z] |
[:space:] | 匹配空白字符(同[\f\n\r\t\v]) |
[:xdigit:] | 匹配十六进制数字。等同于[0-9A-Fa-f] |
这种字符类需要主要的外层要加一层[]
。
上面的字符类中有两个比较特殊的,这两个是关于位置的,[:<:]
匹配词的开始,[:>:]
匹配词的结束,它们和 ^、$
不同。后者是匹配整个整体的开头和结束,而前者是匹配一个单词的开始和结束。示例如下:
# 只能匹配整体以a开头的,例如abcd
select * from app_info where appName regexp '^a';
# 能匹配整体以a开头的,也能匹配中间的单词以a开头,如:dance after
select * from app_info where appName regexp '[[:<:]]a';
select "a word a" REGEXP "[[:<:]]word[[:>:]]"; -- 1(表示匹配)
select "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -- 0(表示不匹配)
select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -- 1(表示匹配)
[1]https://blog.csdn.net/qq_46940224/article/details/125031647