MySQL学习笔记
本来学过的,结果太久没用就忘了
由于是做前端的,所这个就学个大概,笔记相对基础一点
变量名别太离谱就行,变量值是mysql的bin文件的上级目录
接下来找到这个,点击编辑
然后点击新建
然后输入bin文件路径
win + r进入cmd窗口,进行如图所示操作
其中-u后紧跟的是用户名,-p紧跟的是密码,这些在mysql下载安装时有配置,我这里设置的是root和root
看到这一幕,说明MySQL的变量配置成功了,可以正常运行了
退出是exit指令
bin文件:存储命令文件
lib文件:存储库文件
include文件:存储头文件
Share文件:存储字符集、语言等信息
mysql.ini文件(隐藏文件):mysql的配置文件
了解即可,配置那些后面用可视化工具操作方便得多
这一部分,可以暂时先跳过
(当然这个标题并不是很严谨,只是大部分都是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
使用某个数据库
数据都在数据库里面,我们之前一直都在外面对众多数据库进行增删改查,还没有进去访问过
假如你不知道你正在使用哪个数据库,你就可以这么写
正在使用mydatabase1
如果没有使用任何数据库,那么结果是NULL
那么这里我就突发奇想,数据库名字能叫NULL吗
果然不行。而且哪怕可以如此,数据库名字统一为小写,null仍能与NULL区分
==========================================================
接下来的DDI语句内容可以先暂时跳过,后面看完了可视化数据库工具再折回来看
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,就可以在下方的区域看到执行结果
(注意创建新的库之后要刷新一下才能显示)
hmmmmm查数据至少得先有数据吧…
那这里先用鼠标手动添加数据,或者也可以直接先去看后面的DML数据操作语言的内容
操作数据之前我们先做一点前置准备:
鼠标创建一张表
名字是t_persons
然后打开表继续鼠标添加数据
SELECT FROM
最简单的查询
注意name是一个关键字,这里需要使用反引号(就是tab上面那个)屏蔽一下
另外,* 是所有的意思,这样写也可以
(不过这样写的话,底层还有一个展开的过程,所以执行速度会相对减慢)
诶等等,之前不是录入了四组数据吗,某本伟怎么不见了!
看了看才发现我没保存…不过不影响…
另外,查询语句是可以进行运算的
这里就要提到一个概念:虚拟表
通过查询手段得到的新表是一个 处理过的 节选的 原表 副本,即虚拟表
所以在查询的时候对数据进行操作并不会影响到原表
AS
用来给出别称的
ORDER BY
给查询结果排个序
WHERE
AND和OR和NOT
<,> , <, >=, <=, !=, <>
最后一个<>
也是不等于的意思,和!=一样
另外还需要提一下的就只有
区间依旧需要分开写,然后用逻辑连接词链接
NULL
空值
对于NULL值,判定不能用=或者!=以及<>
而需要用到
IS
IN
LIKE
模糊查询
第一种是有限个数字符模糊,比如一个 张某
每模糊一个字符,都要在相应的位置加上一个 _
CASE END
就是一个分支结构,when这里翻译为 当…时
注意别漏掉CASE前面的逗号
这部分内容比较多,就不一一用代码演示了
以下几张图片都来自于视频截图
图片来源
GROUP BY
SELECT `name`,COUNT(sex)
FROM t_persons
GROUP BY sex
LIMIT
其实也就是套娃
需要注意的就是注意 子查询结果 参与比较的时候 的数据类型
别用int和char比,不然只能稀里糊涂地改半天bug
1.子查询的结果是单行单列
2.子查询的结果是单行多列
记得开枚举,不然你怎么用单个数据去和整个返回内容比较呢
3.如果结果是多行单列
ALL
与ANY
其实就是字面意思
另外,这里的sex用0,1表示的
4.子查询的结果是多行多列(一张表)
注意as的作用是将整个临时的子查询结果(一张表里的数据)看做一个整体(一张表),不能少
UNION (ALL)
合并指的是把 查询结果 合并,并不合并原表
再改一点数据
合并的前提是,列数得相同
说白了就是把后者硬塞进前者
这是UNION
完全重复的内容直接没了
这是UNION ALL
哪怕完全一样都还是保留
JOIN ON
合并查询 是 合并 查询的结果,是个动宾短语
但是表连接查询中的“表连接”是一个定语后置的倒装,
作为一个偏正短语的定语修饰省略的中心词查询(结果)…啊吧啊吧
好吧扯远了…
表连接查询是指的,先把表(暂时)合并再查询
先新建一个表叫做t_myfriends
叔叔我啊,最喜欢交朋友了
我们先来观察一下
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的左/右决定)
鼠标操作虽好,但总不能只会鼠标操作吧
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;
举个例子,当你要在全国范围内找到具体的某个人,用哪条信息找最准确呢?
如果是名字,那么重名的有很多,这样一来查询结果就不唯一。
如果用身份证号查找,那么就是唯一的。
这其实和一维数组类似,这里所说的主键类似于数组的下标。
主键约束不能为空,也不能重复,
可以联想数组下标,不能重复也不能为空
这个是主键约束的附属物
只能用于主键约束
其实也是数组下标的模式,自动地依次递增
就是不能重复
比如驾驶证号,这个重复了那还得了?
当然也不是每个人都有驾驶证,所以可以为NULL
这里多加一条
…过亿这种毕竟是少数,如果给你十三亿的数据量,给个默认值肯定会减少工作量
(但是不知道为什么感觉有点悲伤…)
直接用其他表里有的数据,不用手动重复地执行添加操作
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 t_personsInfo
AS
SELECT `name`, age FROM t_persons;
有了这个视图,当下次你要查询name和age的时候,就不需要select写那么多字了
直接一句
select * from t_personsInfo;
顾名思义是创建或者修改视图,总结就是 覆盖
CREATE OR REPLACE VIEW t_personsInfo
AS
SELECT `名字` age FROM t_persons;
当然这也还有其他修改方式
这个依旧是覆盖
#修改视图2
ALTER VIEW t_personsInfo
AS
SELECT `名字` age FROM t_persons;
DROP VIEW t_personsInfo;
删除也没什么好说的
形式上与表一样,主要区别在于 增 删 改,
表的增删改比较自由,但是视图只能通过整体覆盖的形式来进行增删改
视图常作为表的节选内容的副本存在,方便用户查找数据
但是并不会从查询速率上优化,只是单纯地减少代码量
另外,如果视图包含有 由 聚合函数、DISTINCT、GROUP BY、HAVIG UNION等语句处理过 的结果,那么视图不可更新