MySQL学习笔记
个人理解可能存在偏差,仅为参考文档;一切以官方文档为准~。
1|0数据库
1|1什么是数据库
按照一定数据结构来组织和存储数据的仓库
数据库应用场景:数据量庞大繁多。
1|2什么是数据表
一个数据库可包含多张数据表,一张表可包含多个字段。
一个数据表必须有表名 字段名 字段的数据类型,虽然理论上约束类型是可有可无的,但实际开发中都会书写字段的约束类型。(规范标准)
1|3数据库分类
网状数据库
层次型数据库
关系型数据库(RDBMS)
关系型数据库管理系统,大多采用C/S或B/S的形式
常见的关系型数据库
SQLite
微型数据库,常用于移动设备
MySQL
开源中小型数据库,可用于各种操作系统(AB公司开发>SUN公司收购>Oracle公司收购)oracle分支 mysql
Martin分支 MariaDB
PostgreSQL
开源中小型数据库
SQL Server
微软公司开发的中型数据库,只用于Windows系统
Oracle
Oracle公司开发的中大型数据库,可用于各种操作系统
DB2
IBM公司开发的中大型数据库,常与IBM服务器搭配(银行用的较多)
非关系型数据库(NoSQL)
Redis
MongoDB
2|0MySQL
LAMP组合(Linux + Apache + MySQL + PHP)是目前最流行的开源服务器端技术之一,尤其适合于中小型站点、需要快速部署的Web应用。
XAMPP:服务器套装(内包含了Apache、MySQL等#....)
SQL:结构化查询语言,专门用于操作关系型数据库服务器
2|1MySQL部署结构
服务器端:启动服务(
./xampp/mysql/bin/mysqld.exe
)客户端:连接服务器(
./xampp/mysql/bin/mysql.exe
)
2|2MySQL类型
数字类型
TINYINT
-128~127 占1字节例如:
TINYINT(5)
,其中5表示格式,如3会显示就是00003
SMALLINT
-32768~32767 占2字节
INT
-2147483648~2147483647 占4字节
BIGINT
-9223372036854775808~9223372036854775807 占8字节
FLOAT[(总有效位数,小数点后面允许的有效位数)]
单精度。占用4个字节存储空间
DOUBLE[(总有效位数,小数点后面允许的有效位数)]
双精度。占用8个字节存储空间
DECIMAL[(总有效位数,小数点后面允许的有效位数)]
定点类型。严格定点数,用于保存精确小数
如:DECIMAL(6,2) #9999.99
小数取整
ROUND(小数)
布尔类型
BOOL
或BOOLEAN
取值TRUE、FALSE,也可以1、0
字符串类型
CHAR(长度)
定长字符串,不够会用\0补齐。最大长度255个字符(最多只能存255个字符)超出设置长度的字符会被去掉
VARCHAR(长度)
可变长度的字符串。最大长度65535个字符(实际上并不一定能存65535个字符)
TEXT(长度)
可变长度的字符串,比VARCHAR
更长。长度可达2^32(4G)个字符
举例说明
CHAR(5)
和VARCHAR(5)
的区别:
CHAR(5) VARCHAR(5) a a\0\0\0\0 a\0 ab ab\0\0\0 ab\0 abcde abcde abcde 一二 一二\0\0\0 一二\0
一般固定长度字符使用
CHAR
,可变长度的字符用VARCHAR
,因为操作CHAR
速度要比VARCHAR
要快些。
日期时间类型
DATE
日期类型,范围1000-01-01
到9999-12-31
TIME
时间类型,范围00:00:00
到23:59:59
DATATIME
日期时间类型,支持范围1000-01-01 00:00:00
到9999-12-31 23:59:59
由于不同系统日期时间类型表示范围不完全一样,不同语言区域的默认日期格式也不一样;推荐使用BIGINT来存储日期时间。
NULL
表示空,在插入数据的时候,表示无法确定的数据,例如无法确定商品的规格,上架时间
查询是否为NULL
数据的方法参考:NULL值查询
2|3MySQL常用管理命令
使用客户端连接服务器端
在xampp的shell命令下输入
-h
host 主机,服务器的地址或域名(IP为127.0.0.1时,写错成127.0.x.x 会自动纠正并连接成功)
-P
port 端口号(一般MySQL默认端口号为3306)
-u
user 用户 root为管理员用户除root以外都是来宾用户,一般平时开发中都不会使用管理员账号
root
(user写错时,也会自动纠正并连接成功)
-p
password 密码 xampp下root的密码为空
如:IP为127.0.0.1,端口号3306,用户为管理员root,密码为空
以上的cmd管理命令可做以下简化:
IP为127.0.0.1,可省略
MySQL默认Port为3306,可省略
密码为空,可省略
mysql.exe可简化成mysql因此,cmd管理命令可简化,直接敲:
*注意:连接数据库的命令无需加;
当连接上数据库后,在数据库中交互的命令都需要加;
以示结束。
导入脚本
在没进入数据库情况下,使用mysql -uroot < 脚本完整路径
导入脚本,前提是要先设置好系统环境变量
在已进入数据库情况下,使用source 脚本完整路径
导入脚本。
退出连接
QUIT;
退出服务器连接
当前数据库服务器下所有的数据库
SHOW DATABASES;
显示当前数据库服务器下所有的数据库
进入数据库
USE 数据库名;
进入指定数据库
显示当前数据表
SHOW TABLES;
显示当前数据库中所有数据表
查看当前表中数据的结构
DESC 表名;
(describe)描述表的结构
查看创建表所用命令
SHOW CREATE TABLE 表名;
查看创建表所用命令
注释
单行注释
#注释
多行注释
/* 注释 */
如:
字段或列的注释是用属性comment来添加。
创建新表的脚本时,可在字段定义脚本中添加comment属性来添加注释。
2|4SQL语句规范
关键字内容大写;数据库名,数据表名,字段名小写。
必须使用英文分号(;)结尾,代表语句已经结束。
数据库名、数据表名、字段名 必须使用反引号
包裹。
2|5SQL语句分类
DDL(Data Define Language) 定义数据的结构
DML(Data Manipulate Language) 操作数据,即增删改
DQL(Data Query Language) 查询数据
DCL(Data Control Language) 控制用户的权限(grant 授权/ revoke 收权)
DDL DML DQL DCL CREATE INSERT SELECT GRANT DROP DELETE REVOKE ALTER UPDATE TRUNCATE
2|6数据库操作
创建数据库/数据表
创建数据库
CREATE DATABASE 数据库名;
创建数据表
如:
丢弃数据库/数据表
DROP DATABASE 数据库名;
DROP TABLE 数据表名;
一般先判断是否存在数据库,存在先丢弃再创建新的数据库。
修改数据库对象的定义
ALTER
截断表中所有记录
TRUNCATE
插入数据
INSERT INTO 数据表名(字段名) VALUES(数据1);
指定字段插入指定值
INSERT INTO 数据表名 VALUES(数据1),(数据2),(数据3)#.....;
删除数据
DELETE FROM 表名 WHRER 条件;
修改数据
UPDATE 表名 SET 字段名=值,字段名=值,#... WHERE 条件;
数据查询
简单查询
在表中所有的列去查询
SELECT * FROM 表名 WHERE 条件;
查询特定的列
SELECT 字段名 FROM 表名 WHERE 条件;
给列起别名
SELECT 字段名1 AS 别名1,字段名2 AS 别名2,#..... FROM 表名;
AS
关键字其实可以省略
只查询显示不同记录
SELECT DISTINCT 字段名 FROM 表名;
查询时执行计算
查询结果集排序
SELECT * FROM 表名 ORDER BY 字段名1,字段名2#... 排序方式;
排序方式:
ASC
:升序(默认)
DESC
:降序
条件逻辑查询
SELECT * FROM 表名 WHERE 条件;
因为两个NULL
是不等的,因此,
若需查找是否为NULL
的列应使用IS NULL
、IS NOT NULL
;而不是用比较符号=
或!=
同时条件(逻辑与)AND
在两者之间 BETWEEN 值 AND 值
或 OR
在#...之间 IN
模糊条件查询
LIKE %要查的关键字%
%
代表0个或者多个字符
_
代表一个字符
以上两个匹配符使用必须结合LIKE
关键字使用
分页查询
用于定量分页进行查询。
SELECT * FROM emp LIMIT 每页开始查询的值,每页的数据量
注意:开始查询的值是索引下标,是从0开始计的。
每页起始索引 =(当前页码-1) 每页的条数*
每页m个条数,第n页开始索引=(n-1)* m
注意:
①limit后开始查询的值只能写计算结果,不能写计算过程。
②limit后的两个值必须是数值,不能加引号。
复杂查询
聚合查询
用于特殊计算,共有五个聚合函数:MAX()
MIN()
SUM()
COUNT()
AVG()
*注意:利用COUNT
查询个数时,有可能包含NULL
值而造成误差,选择列时应要避免此情况发生
其实在mysql中还有很多函数,例如:
获取日期中的年份
分组查询
根据依据查询指定列
分组一般是使用有共性的数据,比如按性别分组、部门分组等...
SELCET 需要的查询的列1,需要的查询的列2#... FROM 表名 GROUP BY 作为依据的列;
子查询
将一个查询语句嵌套在另外一个查询语句中,把内层语句的查询结果作为外层语句的查询条件继续查询。
内层语句需要使用括号包裹
注意:有时候子查询的时候会出现包含自己的情况
联合查询
创建具有可以联合查询的表(要求联合查询
多表查询
例:查询出所有员工姓名及其部门名称(沿用上面子查询的数据)
如果多个表中出现列名称相同,写列名称的时候,前边带着表名称
内连接
INNER JOIN
只连接相匹配的行,具有排他性,返回表的交集
表名1 INNER JOIN 表名2 ON 表名1
但此时无法查询出没有部门的员工,也不能查询出没有员工的部门。也就是说包含NULL值的都不显示。
要想显示NULL值,应根据选择用以下 左外连接 或者 右外连接 或者 全连接。
左外连接
此时 emp 表中为NULL的值也能显示,但dept表中为NULL的值无法获取
右外连接
此时 dept 表中为NULL的值也能显示,但emp表中为NULL的值无法获取
左外连接和右外连接中可以省略outer
关键字
全连接
mysql不再支持全连接
要使两边的NULL值都显示,应使用 全连接 将左右表NULL值相同部分合并(或不合并)方式并显示出来。
UNION
合并相同的记录
UNION ALL
不合并相同的记录
2|7数据库的编码
默认数据库编码为ASCII
码(美国信息交换标准代码),当填入中文信息时会出现乱码。
ASCII
码仅支持英文等少数字符,除此之外,都会显示乱码;若想支持中文,可以用GBK码,但GBK只是在ASCII上增加中文;所以一般都使用国际通用的UTF8码(万国码)。
解决MySQL中文乱码
①SQL脚本文件另存为
UTF8
格式②设置客户端连接服务器端编码为UTF8
SET NAMES UTF8;
③在数据库创建时,设置存储的编码为UTF8
CHARSET=UTF8;
CMD窗口的编码:右键属性可查看
CMD:Windows下的命令窗口
临时修改CMD窗口编码为utf8:输入命令
chcp 65001
SET collation_server=utf8_general_ci;
显示当前cmd编码
SHOW VARIABLES LIKE '%character%';
2|8约束类型
用于解决列数据重复问题。例如:在开发中,学员的id,是唯一的,就需要进行约束。
列约束的分类
主键约束(常用)
非空约束(常用)
唯一约束(常用)
检查约束
外键约束(常用)
默认值约束(常用)
自增列
主键约束
[PRIMARY] KEY
PRIMARY
关键字可写可不写
声明为主键的列,必须唯一,不能为空NULL,无主键时,数据是无序的,因此主键的好处是可以加快操作速度。
主键值能为表中的内容做唯一标识
表与表之间的关联,也需要使用主键约束
表中所有数据行默认按照主键上的值由小到大排列存储,所以一个表中最多只能有一个列声明为“主键列”;推荐为每个表都设置一个主键列。
声明为主键约束的列在desc 表名
命令的查询时,Key
这一项会显示为PRI
。
一般自增列的数据不需要直接给出。
平时插入数据推荐一条一条的插入,多条插入会出现无视主键约束的情况。
非空约束
NOT NULL
限定指定列上的值不能为NULL
唯一约束
UNIQUE
限定指定列的值不能出现重复值,可为空(NULL),且可出现多个NULL
之所以插入多个NULL
也可以,是因为NULL
不相等,插入的NULL就成了插入空字符串
如果不想为空,则加一个NOT NULL
条件即可
声明为主键约束的列在desc 表名
命令的查询时,Key
这一项会显示为UNI
。
检查约束
mysql不再支持检查约束
检查约束会严重影响数据的插入,平时一般不使用。像用户注册等操作的验证一般在js中完成
CHECK
限定指定列上的值不能为NULL
外键约束
作用:指定本表某个列必须在符合另一个表的规定值,允许使用NULL值
例如:员工表的部门列数据必须是在部门表中有的值,否则报错
FOREIGN KEY 字段名 REFERENCES 外表字段名
*注意:本表外键约束的列 在另一个表中所要求符合的列,必须要声明为主键约束,否则报错
默认值约束
指定当列上未明确指定值时所使用的默认值
DEFAULT
自增列
用于自动增加的序列。
若主键列是整数类型,则同时可以声明此列上的值为“自动增长”——插入数据时未指定值或者指定为NULL值,则默认就会生成一个在当前最大值基础上+1的下一个整数值。
*注意:删除列数据,自增列的序号将不会被回收
*注意:自增列只在最大值上+1
2|9补充
给密码加密
__EOF__

本文链接:https://www.cnblogs.com/myotsuki/p/16773390.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)