韩顺平讲mysql 七天速通笔记

MySQL的学习之路!

1.什么是数据库?什么是数据库管理系统?什么是SQL?它们之间的关系是什么?

数据库:DataBase简称DB。按照一定的格式存储数据的一些文件的组合。顾名思义,就是存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。

​ 数据库中最基本的单元是表:table,数据库当中是以表的形式表示数据的。因为表比较直观!任何表都有行和列,其中行(row) 被称作数据/记录,列(column)被称作字段。

​ 每个字段都有字段名、数据类型(字符串,整型等)、约束(类似于用户名不能重复)等属性

数据库管理系统:DataBaseManagement,简称DBMS。数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中数据进行增删改查!

​ 常见的数据库管理系统:MySQL、Oracle、MS等

SQL:结构化查询语言

​ 程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。

三者之间的关系
DBMS-执行->SQL–进行相关操作->DB-存储!


2.数据库部分初始命令:

数据库远程连接登录命令, 不输入IP和prot就是默认
mysql -h 127.0.0.1 -P 3306 -u root -p
开启和关闭数据库服务 
net start mysql
net stop mysql

​ 初始化mysql

mysqld --initialize --console
安装mysql 
mysqld --install

用于卸载MySQL时删除已经安装好的MySQL服务

sc delete mysql

3.数据库实操命令:

	查看mysql配置命令 
show variables like 'char%';
3. 1 查看mysql数据库或表或其他信息
show databases;
SHOW ENGINES;
show tables; # 查看该数据库中的所有表
SHOW CREATE DATABASE NAME; # 查看此数据库的定义信息 
status; -- 列出当前所有信息
mysql自带四个数据库!

在这里插入图片描述
使用指定的数据库

use 数据库名称
3. 2 创建和删除数据库:
create database 数据库名称; 
# COLLATE utf8_general_ci 不区分大小写 utf8_bin区区分大小写
# DROP用的好, 跑路少不了 从入门到跑路
DROP DATABASE NAME; # 删除数据库 默认排列不区分大小写
CREATE DATABASE NAME CHARACTER SET utf8 COLLATE utf8_bin
  1. 3 查询语句:
# SELECT 代表查询 * 表示所有字段 FROM 来自哪个表 WHERE 从哪个字段
SELECT * FROM TABLE WHERE NAME = '';

SELECT ID, NAME FROM STUDUENT; -- 指定字段范围进行查找

select distinct from student; -- 过滤表中重复元素

SELECT NAME, (chinese + english + math) FROM student; -- 计算总分

SELECT NAME AS '名称', (chinese + english + math) as total_score FROM student; -- 计算总分并且取别名 as 可以有也可以没有

SELECT * FROM student WHERE english > 90; -- 查找英语大于90分选手

SELECT id, name, (chinese + english + math) AS total_score FROM student WHERE (chinese + english+ math) > 200 and
 			 math < chinese and name like '赵%';
 			 -- like 是模糊语句
SELECT * FROM student WHERE english BETWEEN 80 AND 90; -- 查询区间

SELECT * FROM student WHERE english in (80, 81, 82, 83) -- 指定集合查找

SELECT * FROM student ORDER BY math; -- 默认通过升序排列数学 ASC

SELECT * FROM student ORDER BY math DESC; -- 通过降序排列数学 DESC

3. 4 创建表单
USE mysql_study;
CREATE TABLE `user`(
	id INT UNSIGNED, # 不加 unsigned 的默认有符号
    `name` VARCHAR(200),
    `password` VARCHAR(32),
    `birthday` DATE,
    `login_time` TIMESTAMP
    			NOT NULL DEFAULT CURRENT_TIMESTAMP
    			ON UPDATE CURRENT_TIMESTAMP
    			-- 如果希望timestamp时间自动更新,就加入该语句
) CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB || MYISAM;

INSERT INTO user VALUES(66, 'dd', 'dd', '2021'); # 插入新数据
INSERT INTO user(id, name) VALUES(1'22'), (2, '44');
3. 5 修改表单 alter
 ALTER TABLE EMP
    ADD `IMAGE` VARCHAR(255) -- 添加一个image列表
    NOT NULL DEFAULT ''  -- 不能为空 并且指定默认值
    AFTER resume; -- 添加在谁的后边
DESC emp; -- 可以查看表的所有字段
ALTER TABLE emp
    MODIFY JOB VARCHAR(60) -- 修改job字段的长度
        NOT NULL DEFAULT '';
ALTER TABLE EMP DROP SEX; -- 删除表单中的行
RENAME TABLE EMP TO EMPLOYEE; -- 修改名字
ALTER TABLE EMPLOYEE CHARACTER SET UTF8; -- 修改表的字符集
DESC EMPLOYEE;
ALTER TABLE EMPLOYEE -- 改变表单中数据名
    CHANGE NAME USER_NAME VARCHAR(255)
        NOT NULL DEFAULT '';
DESC EMPLOYEE;
3. 6 修改数据
UPDATE EMPLOYEE SET salary = 421 -- 将所有薪水都改为421
UPDATE EMPLOYEE SET salary = 222 WHERE user_name = '张三' 
-- 指定修改用户的数据
UPDATE EMPLOYEE SET salary = salary + 100, job = '喜欢😀'
				WHERE user_name = '张三'
-- 修改指定用户的多个字段值
3. 7 删除数据
DELETE FROM EMPLOYEE WHERE user_name = '张三' -- 删除数据
DELETE FROM EMPLOYEE -- 删除表中所有数据
3. 8 将sql文件中的数据导入:
# 备份sql文件 -B 指的是连续几个数据库备份
mysqldump -uroot -p -B mysql_study >  C:\Users\18446\Desktop\dbsrc\study.sql

mysqldump -uroot -p mysql_study 表12 >  C:\Users\18446\Desktop\dbsrc\study.sql

# 导入sql文件
source 文件路径  #备份方法是在dos中实行 导入方法实在dos mysql中执行
# 直接复制后在datagrip中run也可
3. 9函数SQL
SELECT count(*) FROM student; -- 返回有多少行
SELECT count() FROM student; -- 返回有多少行,但是不包括空

SELECT SUM(math) FROM student; -- 统计一个班级的数学总成绩
SELECT AVG(math) FROM student; -- 返回某一列的平均值
SELECT MAX(math), MIN(math) FROM student; -- 返回某一列的最大/小值

// -- 根据部门进行分组
SELECT AVG(sal), MAX(sal), deptno FROM emp GROUP BY deptno

// -- 分组的基础上进行过滤
SELECT AVG(sal), deptno FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SELECT USER() FROM DUAL; -- 查询登录mysql的所有用户以及IP地址
SELECT DATABASE(); -- 查询当前使用数据库的名称
SELECT MD5('root') FROM DUAL;-- MD5加密 32位字符串

INSERT INTO hsp_user VALUES(100, '张三', MD5('zhangsan'));

SELECT * FROM hsp_user WHERE name = '张三' AND pwd = 												MD5('zhangsan');-- 使用MD5进行解密
PASSWORD('') -- 一种mysql默认加密方法
LAST_DAY(NOW()); -- 返回日期所在月份的最后一天
3. 10 流程控制
SELECT IF(TRUE, 'TRUE', 'FALSE') FROM DUAL; -- 三元运算符
SELECT IF(NULL, 'TRUE') FROM DUAL; -- 如果第一个为NULL,就返回第二个
SELECT CASE WHEN expr1 THEN expr2 
			WHEN expr3 THEN expr4
			ELSE expr5 END;
			-- 多重分支结构
SELECT IF(comm IS NULL, 0.0, comm) FROM emp; 
-- 判断空要用IS 判断不为空要用 IS NOT
3.11 mysql SELECT加强AND多表查询
# %表示0 - 任意长度 _表示单个任意字符 order by 排序 Group by 分组
SELECT * FROM EMP ORDER BY deptno ASC, sal DESC;
-- 按照部门升序,部门中薪资降序排列

-- LIMIT START, LENGTH 从什么位置开始,展示多少个
SELECT * FROM EMP ORDER BY id LIMIT 0, 3; 
-- 降序排列,并且分页
SELECT * FROM student ORDER BY ID DESC,
                            name LIMIT 0, 2 ;

-- mysql 多表查询
SELECT * FROM DATABASE1, DATABASE2; -- 默认情况下两表会合并
-- 自连接特点 把同一张表当作两个表来使用
SELECT worker.ename , boss.ename FROM emp worker, emp boss
								WHERE worker.mgr = boss.ename;
-- 子查询 单行子查询
SELECT deptno FROM emp WHERE ename = 'SMITH';-- 查询smith的部门号
SELECT * FROM emp WHERE deptno = (
	SELECT deptno 
 FROM emp 
 WHERE ename = 'SMITH';
); -- 查询到smith所在部门的所有信息
SELECT ename, job, sal, deptno
		FROM emp
		WHERE job IN (
     	SELECT DISTINCT job
         FROM emp
         WHERE deptno = 10
     ) AND deptno <> 10!=-- 查询job在该范围内的情况并且deptno不等于(!=)10
-- 子表作为查询对象
SELECT DISTINCT id, name, math FROM (
 SELECT chinese FROM student WHERE chinese > 60
 ) tmp ,student WHERE math > tmp.chinese
# ALL和 ANY ALL表示全部 ANY表示其中一个
3.12 MYSQL 自我复制
INSERT INTO my_db (id, name, sal, job, deptno)
		SELECT empno, ename, sal, job, deptno FROM emp;
		# 将查到的表插入到自己创建的表中,实现自我复制

> # 如何去除掉表中重复的数据
CREATE TABLE my_tmp LIKE my_db; -- 先创建一个和db一模一样的表
INSERT INTO my_tmp SELECT DISTINCT * FROM my_db; -- 将数据复制进tmp中
DELETE FROM my_db; -- 此时可以将tmp改名为db,删除db中的数据
INSERT INTO my_db SELECT * FROM my_tmp; -- 复制tmp进入db中
DROP TABLE my_tmp; -- 删除临时表tmp
3.13 合并查询与外连接
INSERT ...
UNION ALL -- 将两个查询结果进行合并为一张表,但是不会去重
INSERT ...
UNION -- 将两个查询结果进行合并为一张表,并且

# 左右外连接 即使查询到为null 左右侧也会显示信息
SELECT * FROM TABLE1 LEFT JOIN TABLE2 ON 条件
SELECT * FROM TABLE1 RIGHT JOIN TABLE2 ON 条件
3.14 mysql约束
-- 主键列的值是不能重复的 而且不能为空值
CREATE TABLE T1 (
	id INT PRIMARY KEY,
    name varchar(255),
    email varchar(255)
); -- 表示id列为主键,不能重复id号,id号不能为空
-- 一张表只能有一个主键,但可以使用复合主键
CREATE TABLE T1 (
	id INT,
    name varchar(255),
    email varchar(255),
    PRIMARY KEY (id, name)
); > -- 复合主键, 但是id 或 name可以重复,而 id和name不能同时重复
> NOT NULL(不能为NULLUNIQUE(禁止重复) 一张表可以有多个 UNIQUE
-- 外键约束 将两张表的某个信息进行外键关联 关联的某一字段必须有禁止重复的约束
CREATE TABLE my_test (
    id INT PRIMARY KEY,
    name varchar(32)
);
CREATE TABLE my_tmp (
    id INT PRIMARY KEY,
    address varchar(32),
    class_id INT,
    FOREIGN KEY (class_id) REFERENCES my_test(id)
);
-- check 约束
CREATE TABLE TMP (
	id INT PRIMARY KEY,
    name varchar(32),
    sex varchar(6) CHECK (sex IN(man, woman)),
    sal DOUBLE CHECK (sal > 1000 AND sal < 2000 )
); -- 进行z约束
3.15 MYSQL 自增长
AUTO_INCREMENT = 1 -- 默认自增长值为1,可以进行调整
ALTER TABLE TMP AUTO_INCREMENT = 100
CREATE TABLE TMP (
	id INT PRIMARY KEY AUTO_INCREMENT
);
INSERT TABLE TMP VALUES(NULL); 
SELECT * FROM TMP; -- 1 插入值会随着插入自动增长
-- 如果你赋的值并不为NULL,以分配的值为主
3.16 mysql 索引机制
-- CREATE 索引 索引名称 ON 表名 列; 速度直接翻几个数量级
CREATE INDEX tmp_index ON tmp (ID);
-- 添加普通索引
ALTER TABLE tmp ADD INDEX tmp_index (id);
-- 添加主键索引
ALTER TABLE tmp ADD PRIMARY KEY (id);
-- 删除索引
DROP INDEX id_index ON tmp
-- 删除主键索引
ALTER TABLE tmp DROP PRIMARY KEY -- 一张表只有一个主键,所以不用指定

索引的代价

  1. 索引会占用磁盘
  2. 索引会对dml语句(update delete insert)造成影响
    注:由于select的用法大多都大于udi的用法,所以索引是很有必要的
3.16 .1 索引的类型
  1. 主键索引,主键自动的为主索引 (Primary key)
  2. 唯一索引 UNIQUE
  3. 普通索引 INDEX
  4. 全文索引 FULLTEXT 适用于 MylSAM 一般开发不使用mysql自带的全文索 引,一般都使用 Solr 和 ElasticSearch (ES)这两个全文索引框架
-- 查询是否有索引
SHOW INDEX FROM TMP
SHOW INDEXES FROM TMP
SHOW KEYS FROM TMP
DESC TMP
3.17 mysql事务(transaction)
-- 开启事务
start transaction
set autocommit = off;
-- 保存事务点
savepoint a
-- 回滚事务到事务点a
rollback to a
-- 回滚全部事务
rollback 
-- 提交事务 所有事务全部生效,不能回滚
commit 
 > mysql 事务在 engine = innodb存储引擎下才能使用, 在 myisam 不支持

在这里插入图片描述

事务隔离级别
脏读 就是一方还未提交只是进行更改的代码,你这边受到了影响并且进行了提交。结果对方将日志信息回滚重新更改,造成你提交的部分出现脏读现象!
不可重复读 意思是你正在修改一个值的时候并进行了提交时,另一边进行了查询,造成查询结果有误。
幻读 意思是你这边正在进行表的修改后进行查询,另一方突然插入或者删除一行语句,结果你查询到的其他行都已经修改完毕,而新插入的那一行没有修改,就像发生了幻觉一样。

查看和设置系统隔离级别

查看mysql当前会话隔离级别
SELECT @@transaction_isolation;
查看系统当前隔离级别
SELECT @@global.transaction_isolation;
设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
设置系统当前隔离级别
set global transaction isolation level repeatable read;
mysql默认的事务隔离级别是 repeatable read 

在这里插入图片描述

3.18 mysql表类型和存储引擎

mysql的存储引擎有六大类:

  • CSV (非事务安全型 non- transaction-safe)
  • Memory 存储在内存中,对临时表有用。当关闭mysql服务时表中数据会被清空
  • Innodb (事务安全型,支持事务操作 transaction-safe) 读写慢,占用更多空间
  • Myisam 不支持事务,也不支持外键,但是访问速度快,对事务完整性没有需求
  • ARCHIVE
  • MRG
3.19 mysql管理

在这里插入图片描述

3.19.1 视图和对应的基表的关系
  1. 视图是根据基表来创建的,视图是虚拟的表
  2. 视图也有列,数据来自虚表
  3. 通过视图可以修改基表的数据
  4. 基表的改变也会影响到视图的数据
  5. 视图中也可以再使用视图
-- 创建视图 emp 为视图名称 emp1为表名
CREATE VIEW emp AS SELECT id, name FROM emp1; -- 该视图仅拥有id和name
DESC emp; -- 查看视图
ALTER VIEW emp as SELECT id FROM emp1; -- 更新为新的视图
SHOW CREATE VIEW emp; -- 查看创建视图的指令
update emp set name = '小白' WHERE id = 1; -- 通过视图修改基表数据
DROP VIEW emp; -- 删除视图
3.19.2 用户管理

mysql中的用户都存在于mysql数据库的user库中

user库中存放的密码为password函数加密后的密码,不是明文存放密码

如果创建用户时不指定用户登录限制,则默认为%,表示任意IP都可以登录。

也可以 192.168.% 。表示开头为192.168的IP地址都可以登录

-- 创建用户并且指定用户密码 和 限制登陆地址
CREATE USER 'username'@'localhost' IDENTIFIED BY 'pwd';
-- 删除用户需要写明登陆地址和用户
DROP USER 'username'@'localhost';
-- 修改用户的密码 第一种方法需要权限
set password for username@localhost='你想设置的密码';
set password = password('newpwd');
3.19.3 用户权限

*.* 代表所有数据库的所有对象 库.* 表示这个数据库的所有对象

flush privileges; -- 刷新权限 部分版本需要刷新权限才能够生效
-- 授予某用户对database数据库下table表的查看和插入的权限
GRANT INSERT, SELECT ON database.table TO 'username'@'loaclhost';
-- 回收权限
revoke INSERT, SELECT ON database.table FROM 'username'@'localhost';

4. 关于SQL的列类型(数据类型)

在这里插入图片描述
char为固定长度字符串 最大为255字符 char会造成浪费空间,因为他是固定字符大小

varchar为可变化字符串 最大为 65535字节,也就是21844字符 只有在utf-8编码一个字符占三个字节才是21844字符,unicode编码下一个字符占两个字节,根本达不到最大长度字符数量 varchar会根据你存放的字符长度来变化占用空间

char的查询速度快于varchar 如果说存放md5加密或者邮箱或者手机号等固定长度就可以用char

字符预留3位作为缓冲结束符号 (65535 - 3) / 3 = 21844
在这里插入图片描述

5.关于SQL的分类:

​ SQL语句又分为:

  • DQL(Data Query Language): 数据查询语言(凡是带有select关键字的都是查询语言)select…

  • DML(Data Manipulation Language): 数据操作语言(凡是对表中的数据进行增删改的都是DML) insert delete updata

  • DDL(Data Definition Language): 数据定义语言,凡是带有create、drop、alter的都是DDL。虽然也有增删改的意思,但DDL主要操作的是表的结构(字段)。不是表中的数据。

  • TCL(Transaction Control Language): 事务提交: commit;事务回滚:rollback;

  • DCL(Data Control Language): 数据控制语言。例如授权grant、撤销权限revoke…

学完后感受到的一句话: SQL语句一定要多练习才能掌握

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捶捶自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值