这是大一下暑假的时候写的,以前放在csdn上,现在搬迁到自己的博客了
前言
本来学过的,结果太久没用就忘了
由于是做前端的,所这个就学个大概,笔记相对基础一点
环境配置
变量名别太离谱就行,变量值是mysql的bin文件的上级目录
接下来找到这个,点击编辑
然后点击新建
然后输入bin文件路径
登录MySQL
win + r进入cmd窗口,进行如图所示操作
其中-u后紧跟的是用户名,-p紧跟的是密码,这些在mysql下载安装时有配置,我这里设置的是root和root
看到这一幕,说明MySQL的变量配置成功了,可以正常运行了
另外,你可以这样输入密码
退出是exit指令
MySQL核心文件
bin文件:存储命令文件
lib文件:存储库文件
include文件:存储头文件
Share文件:存储字符集、语言等信息
mysql.ini文件(隐藏文件):mysql的配置文件
了解即可,配置那些后面用可视化工具操作方便得多
数据类型
这一部分,可以暂时先跳过
数值类型
日期类型
字符串类型
DDl:数据定义语言
(当然这个标题并不是很严谨,只是大部分都是DDI的内容)
SQL是Structured Query Language结构化查询语言
而DDL是Data Definition Language,能对数据库进行操作
(注意:
1.使用SQL语句时,记得结尾加;
2.使用SQL命令之前确保数据库已经开启
3.mysql几乎不区分大小写,大部分内容最后都会统一转为小写
)
显示所有数据库SHOW DATABASES
显示所有的数据库
这几个是系统自带的数据库,具体情况由安装的版本决定,但无论如何,不要随便去动这几个
创建数据库CREATE DATABASE
创建数据库,规范是这里要大写名字,但是实际上mysql会把名字统一转化为小写
(毕竟命令都是大写,名称又都是大写实在是不方便阅读)
这里创建了一个名字叫myDataBase1的数据库,并且设置它的字符集是国标码 gbk
(当然后面的CHARACTER SET gbk可以省略)
再用SHOW DATABASES查询一下
(这里我漏加了;不过会提示让你补上的)
另外,如果你不确定某个数据库是否已经存在,可以这样写
显示数据库的创建信息SHOW CREATE DATABASE
展示创建某个数据库时的相关信息
修改数据库ALTER DATABASE
修改某个数据库的某个信息
修改mydatabase1的字符集为utf8
注意mysql中是utf8而不是utf-8
删除数据库DROP DATABASE
删除某个数据库
使用数据库USE
使用某个数据库
数据都在数据库里面,我们之前一直都在外面对众多数据库进行增删改查,还没有进去访问过
查看当前数据库SELECT DATABASE()
假如你不知道你正在使用哪个数据库,你就可以这么写
正在使用mydatabase1
如果没有使用任何数据库,那么结果是NULL
那么这里我就突发奇想,数据库名字能叫NULL吗
果然不行。而且哪怕可以如此,数据库名字统一为小写,null仍能与NULL区分
==========================================================
接下来的DDI语句内容可以先暂时跳过,后面看完了可视化数据库工具再折回来看
创建表CREATE TABLE
CREATE TABLE `subject`(
subjectId INT,
`课序号` INT,
subjectName VARCHAR(20),
subjectHours INT
)CHARSET = utf8;
以上代码运行的创建结果如图所示
修改表ALERT TABLE
ADD
ALTER TABLE `subject` ADD gradeID INT;
DROP
每次只能删除一列
ALTER TABLE `subject` DROP gradeID;
MODIFY
修改该列的属性(不包括名称)
ALTER TABLE `subject` MODIFY subjectName VARCHAR(5) ;
修改前:
修改后:
CHANGE
修改列的名称
RENAME
表重命名
可视化数据库工具
cmd 太丑了 数据显示不是那么直观
所以诞生了许多可视化数据库工具
比如Navicate,SQLyog,SQL_Front,HeidiSQL,DBite for SQLite等等,根据自身情况随便选一个就行
我们这里采用SQL_yog
首先新建一个链接,名字随意取
然后输入 用户名 和 密码 进入
好耶,这可不比cmd香得多?而且更棒的是还支持鼠标操作
有了大小写自动转化,而且还有了TAB补全!
甚至只执行单条语句都不用加分号
选中一条语句,然后按下F9,就可以在下方的区域看到执行结果
(注意创建新的库之后要刷新一下才能显示)
并且现在可以通过#创建注释了
DQL:数据查询语言
hmmmmm查数据至少得先有数据吧….
那这里先用鼠标手动添加数据,或者也可以直接先去看后面的DML数据操作语言的内容
前置准备
操作数据之前我们先做一点前置准备:
鼠标创建一张表
名字是t_persons
然后打开表继续鼠标添加数据
查询SELECT FROM
最简单的查询
注意name是一个关键字,这里需要使用反引号(就是tab上面那个)屏蔽一下
另外,* 是所有的意思,这样写也可以
(不过这样写的话,底层还有一个展开的过程,所以执行速度会相对减慢)
诶等等,之前不是录入了四组数据吗,某本伟怎么不见了!
看了看才发现我没保存….不过不影响…
另外,查询语句是可以进行运算的
这里就要提到一个概念:虚拟表
通过查询手段得到的新表是一个 处理过的 节选的 原表 副本,即虚拟表
所以在查询的时候对数据进行操作并不会影响到原表
重命名AS
用来给出别称的
有序查询ORDER BY
给查询结果排个序
ASC(可省略,默认值)升序
DESC降序
条件查询WHERE
条件筛选
逻辑AND和OR和NOT
逻辑 且 或 非
(这里就演示一下OR,其他依葫芦画瓢)
不等式
<,> , <, >=, <=, !=, <>
最后一个<>
也是不等于的意思,和!=一样
另外还需要提一下的就只有
区间依旧需要分开写,然后用逻辑连接词链接
NULL
空值
对于NULL值,判定不能用=或者!=以及<>
而需要用到
IS
枚举IN
枚举
选出id为1或2的
模糊查询LIKE
模糊查询
第一种是有限个数字符模糊,比如一个 张某
每模糊一个字符,都要在相应的位置加上一个 _
第二种是任意个数字符模糊
CASE END
就是一个分支结构,when这里翻译为 当…时
注意别漏掉CASE前面的逗号
时间类函数
这部分内容比较多,就不一一用代码演示了
以下几张图片都来自于视频截图
图片来源
字符类函数
同上
聚合函数
同上
分组查询GROUP BY
首先给表增加一点东西
SELECT `name`,COUNT(sex)
FROM t_persons
GROUP BY sex
下表中的1,2代表1男2女
限定查询LIMIT
0,2代表是从0行开始 查询2行数据(下标从0开始)
子查询
其实也就是套娃
需要注意的就是注意 子查询结果 参与比较的时候 的数据类型
别用int和char比,不然只能稀里糊涂地改半天bug
1.子查询的结果是单行单列
2.子查询的结果是单行多列
记得开枚举,不然你怎么用单个数据去和整个返回内容比较呢
3.如果结果是多行单列
任意与存在:ALL
与ANY
其实就是字面意思
另外,这里的sex用0,1表示的
4.子查询的结果是多行多列(一张表)
注意as的作用是将整个临时的子查询结果(一张表里的数据)看做一个整体(一张表),不能少
合并查询UNION (ALL)
合并指的是把 查询结果 合并,并不合并原表
再改一点数据
合并的前提是,列数得相同
说白了就是把后者硬塞进前者
这是UNION
完全重复的内容直接没了
这是UNION ALL
哪怕完全一样都还是保留
表连接查询JOIN ON
合并查询 是 合并 查询的结果,是个动宾短语
但是表连接查询中的“表连接”是一个定语后置的倒装,
作为一个偏正短语的定语修饰省略的中心词查询(结果)….啊吧啊吧
好吧扯远了….
表连接查询是指的,先把表(暂时)合并再查询
先新建一个表叫做t_myfriends叔叔我啊,最喜欢交朋友了
1.内连接
我们先来观察一下
SELECT * FROM t_persons INNER JOIN t_myfriends;
SELECT * FROM t_myfriends INNER JOIN t_persons
唔,在不加ON的情况下,表的行数变成了2 * 3 = 6(布尔积)行,我们可以发觉,两张表合并的时候的一些规律了,
那就是取二者行数的最小公倍数作为新的行数,并且均匀复制数据到新的表中
另外,INNER JOIN 语句左边的表,就是新合成的表的左部分,语句右边的便是新表的右部分。
我们再来观察一下
SELECT * FROM t_persons
INNER JOIN t_myfriends
ON t_persons.`id` = t_myfriends.`id`;
SELECT * FROM t_myfriends
INNER JOIN t_persons
ON t_persons.`id` = t_myfriends.`id`;
所以ON其实就是加上了一个条件
只有两个表的id相等的数据才被放入新表,并且按照id相匹配
而且左右分布依旧遵循上文所述规则
外连接
SELECT * FROM t_persons
LEFT JOIN t_myfriends
ON t_persons.`id` = t_myfriends.`id`;
以左边的t_persons为主表,即t_persons的左外连接
可以看出,右边的表会适应左边的表,
SELECT * FROM t_persons
RIGHT JOIN t_myfriends
ON t_persons.`id` = t_myfriends.`id`;
SELECT * FROM t_myfriends
RIGHT JOIN t_persons
ON t_persons.`id` = t_Myfriends.`id`;
以右边的表为主表,即右外连接
(在左/右 还是由 在right join的左/右决定)
DML:数据操纵语言
鼠标操作虽好,但总不能只会鼠标操作吧
增INSERT INTO VALUES
INSERT INTO t_persons(id,`名字`,`name`,`性别`,sex,age)
VALUES(4,'杨掉坑','Yang Diodio','男',1,18);
也就是类似于形参实参的写法
删DELETE
DELETE FROM t_myfriends
WHERE `name` = 'Cherry';
改UPDATE
UPDATE t_persons
SET age = 3
WHERE `name` = 'Yang Diodio';
清空TRUNCATE
清空整张表
TRUNCATE TABLE t_myfriends;
DELETE FROM t_myfriends;
也可以达到类似的效果,
不过truncate是销毁整张表之后重新创建一个同样格式的空表
DELETE是清空表的数据
约束
这里只介绍三种常用的约束
CREATE TABLE `全国人民身份信息`(
`身份证号` INT PRIMARY KEY AUTO_INCREMENT,
`名字` VARCHAR(20),
`驾照证件号` INT UNIQUE,
`年龄` INT
)CHARSET = utf8;
主键约束PRIMARY KEY
举个例子,当你要在全国范围内找到具体的某个人,用哪条信息找最准确呢?
如果是名字,那么重名的有很多,这样一来查询结果就不唯一。
如果用身份证号查找,那么就是唯一的。
这其实和一维数组类似,这里所说的主键类似于数组的下标。
主键约束不能为空,也不能重复,
可以联想数组下标,不能重复也不能为空
自增AUTO_INCREMENT
这个是主键约束的附属物
只能用于主键约束
其实也是数组下标的模式,自动地依次递增
唯一约束UNIQUE
就是不能重复
比如驾驶证号,这个重复了那还得了?
当然也不是每个人都有驾驶证,所以可以为NULL
非空约束NOT NULL
一个人总有年龄和名字吧
默认约束DEFAULT
这里多加一条
…过亿这种毕竟是少数,如果给你十三亿的数据量,给个默认值肯定会减少工作量
(但是不知道为什么感觉有点悲伤….)
引用约束CONSTRAINT FOREIN KEY REFERENCES
直接用其他表里有的数据,不用手动重复地执行添加操作
CONSTRAINT fk_t_persons_sex
FOREIGN KEY(`性别`)
REFERENCES t_persons(sex)
也就是当前表的里 性别 这个数据
是从t_persons这张表的sex里面引用来的,而这个引用关系我们命名为fk_t_persons_sex
其余的约束相对来说不是特别常用,所以这里就不介绍了
事务
事务就是“整体化”,就是如果其中有一条语句失败,事务内所有语句失效
相关命令
#开启事务
#事务就是“整体化”,就是如果其中有一条语句失败,事务内所有语句失效
START TRANSACTION;
#模拟借钱
#(更新id = 1的用户的账户
UPDATE account
SET money = money - 1000
WHERE id = 1;
#(更新id = 2的用户的账户
UPDATE account SET money = money + 1000 WHERE id = 2;
#全部成功就提交(COMMIT)
COMMIT;
#出现失败就取消,
#然后重置到执行前的状态,
#这就叫回滚(ROLLBACK)
ROLLBACK;
如果用户1借1000块钱给用户2
第一步:用户1的账户上先减少1000
第二步:用户2的账户上再增加1000
如果第一步成功,第二步失败,用户1就会凭空少1000块,这合理吗???
但好在我们开始了事务,这使得这个事件是一个整体,一步失败则回滚事件开始之前
性质
原子性:
即不可分割,是一个整体,要么全部成功,要么全部失败
一致性:
一旦失败,操作涉及到的所有数据回会回滚到与操作前一致
隔离性:
事务开始前的状态和完成后的状态相隔离,不存在中间状态
持久性:
持久性事务完成之后,它对整个系统的影响是永久的
管理权限
相关命令
就是谁能用这个数据库,并且能用哪些操作
#创建用户
CREATE USER `Serio`
IDENTIFIED BY '123';
#授权
GRANT ALL ON companydb.*
TO `Serio`;
#撤销权限(和授权一样,在账户重新连接客户端后生效)
REMOVE ALL ON companydb.*
FROM `Serio`;
#删除用户
DROP USER `Serio`;
需要注意的是,撤销权限后,需要重启一次客户端才可以生效
视图
视图就是一种可以保存下来的虚拟表,说白了就有点像你把某张节选某张表的数据形成一张新的表再打印下来,打印下来这个就是视图.
可以运用在保存查询结果等方面,
然后达到简化查询的目的
创建视图CREATE VIEW
CREATE VIEW t_personsInfo
AS
SELECT `name`, age FROM t_persons;
有了这个视图,当下次你要查询name和age的时候,就不需要select写那么多字了
直接一句
select * from t_personsInfo;
修改视图CREATE OR REPLACE VIEW
顾名思义是创建或者修改视图,总结就是 覆盖
CREATE OR REPLACE VIEW t_personsInfo
AS
SELECT `名字` age FROM t_persons;
当然这也还有其他修改方式
修改视图ALTER VIEW
这个依旧是覆盖
#修改视图2
ALTER VIEW t_personsInfo
AS
SELECT `名字` age FROM t_persons;
删除视图DROP VIEW
DROP VIEW t_personsInfo;
删除也没什么好说的
视图的性质总结
形式上与表一样,主要区别在于 增 删 改,
表的增删改比较自由,但是视图只能通过整体覆盖的形式来进行增删改
视图常作为表的节选内容的副本存在,方便用户查找数据
但是并不会从查询速率上优化,只是单纯地减少代码量
另外,如果视图包含有 由 聚合函数、DISTINCT、GROUP BY、HAVIG UNION等语句处理过 的结果,那么视图不可更新