MySQL必知必会学习笔记(详细)
目录
04 检索数据 select, from, distinct, limit, offset
06 过滤数据 where,between and,is null
08 用通配符进行过滤 LIKE %为匹配任意字符,_为匹配一个字符
20 更新和删除 UPDATE,DELETE,TRUNCATE
01 了解SQL
- 数据库、表、列、行、数据类型、主键
02 MySQL简介
- MySQL、Oracle及SQL server等数据库是基于客户机-服务器的数据库
- MySQL命令行,图形交互客户机,navicat
03 使用MySQL
- 连接数据库,选择crashcourse数据库 USE crashcourse; 使用use 打开数据库才能使用其中的数据。
- 查看数据库:SHOW DATABASES;
- 查看数据库中的表:SHOW TABLES; 返回当前数据库内可用的表。
- 查看表列:SHOW COLUMN FROM customers; 快捷方式 DESCRIBE customers;
- SHOW STATUS; 用于显示广泛的服务器状态信息。
- SHOW CREATE DATABASE 和SHOW CREATE TABLE 分别用来显示创建特定数据库和表的MySQL语句。
- SHOW GRANTS; 显示授权用户的安全权限。
- SHOW ERRORS 和 SHOW WARNINGS 用来显示服务器错误或警告信息。
- HELP SHOW; 显示所有允许的SHOW 语句。
04 检索数据 select, from, distinct, limit, offset
# 检索单个列
SELECT prod_name FROM products;
# 检索多个列
SELECT prod_id, prod_name, prod_price FROM products;
# 显示所有列 使用通配符 *
SELECT * FROM product;
# 只返回不同(唯一)的行
SELECT DISTINCT vend_id FROM products;
# 返回不多于5行
SELECT prod_name FROM products LIMIT 5;
# 返回不多于5行,偏移1个数据,表示之前有多少个被忽略(第一行为行0)
SELECT prod_name FROM products LIMIT 1, 5; # 等价于LIMIT 5 OFFSET 1;
05 排序 order by
# order by 放在from子句后面,limit放在最后
SELECT prod_price
FROM products
ORDER BY prod_price DESC
LIMIT 1;
06 过滤数据 where,between and,is null
- where,between a and b,空值检查 IS NULL
- 过滤时选择不具有特定的值时,你不会返回具有NULL值的行,因为NULL是未知具有特殊的含义,数据库不知道是否匹配,在匹配过滤或不匹配过滤时不返回它们。
07 数据过滤 where,and,or,not,in
- 组合where子句 and,or(注意使用括号明确的分组操作符),not,in
SELECT prod_name, prod_price
FROM products
WHERE (ven_id = 1002 OR ven_id = 1003) AND (prod_price >= 10) # 使用括号扩起来各个条件
SELECT prod_name, prod_price
FROM products
WHERE ven_id IN (1002, 1003)
ORDER BY prod_name;
- 使用 IN 的优点,1》在使用长的清单时,更清楚更直观;2》计算次序更容易管理;3》一般比OR执行的快;4》可以包含其他SELECT语句
- NOT 否定WHERER后面的条件,也可以对IN,BETWEEN,EXISTS子句取反
08 用通配符进行过滤 LIKE %为匹配任意字符,_为匹配一个字符
- 尽量不要使用通配符,搜索时间长;
SELECT prod_name, prod_price
FROM products
WHERE prod_name LIKE '%jet%'
09 用正则表达式搜索 REGEXP
- REGEXP,.匹配任意一个字符;正则表达式中的'|'为OR的意思;[abc]匹配几个字符之一;[^abc]否定一个字符集,即匹配除指定字符以外的任何东西;[1-9]匹配范围;匹配特殊字符使用\\(MySQL自己解释一个,正则表达式库解释一个),如【._[]\】以及\\f,换页 \\n,换行 \\r,回车 \\t,制表 \\v纵向制表
- LIKE匹配整个列,REGEXP 匹配正则表达式不是匹配整个列,例如 LIKE ‘1000’ 和REXEXP ‘1000’ 不一样,前者不匹配,后者匹配‘01000’,‘ 1000’等
- 不区分大小写,若区分则在REGEXP后面加BINARY
- 为了更方便的工作,可以使用预定义的字符集。
使用重复元字符控制匹配字符的数量。定位元字符
可以使用SELECT在不使用数据库的情况下测试正则表达式:SELECT ‘hello’ REGEXP ‘[0-9]’
10 创建计算字段 concat()
- concat()拼接串,把多个串拼接在一起;RTrim()去除右侧多余的空格;LTRIM()去掉左边的空格;TRIM()去掉两边的空格
- 别名使用AS
- 可以使用SELECT作为计算测试一些东西,比如SELECT NOW();
11 使用数据处理函数 文本,日期,数值函数
常用的文本处理函数
常用的日期处理函数和数值处理函数
12 聚合函数 avg,count,max,min,sum
- count()可以使用distinct + 列名计算行值不同的数目
13 分组 group by,having
- group by对数据进行分组,having对分组进行过滤
- group by后面跟with rollup 可以得到每个分组以及每个分组的汇总级别
select vend_id count(1) as num_prod
from products
group by vend_id with rollup
使用顺序:select,from,where,group by,having,order by,limit
14 子查询 (嵌套查询)
- 常见于where子句的in操作符中,in后面跟一个select语句
- 也可以添加计算字段使用where连接多表
SELECT c1
FROM tb
WHERE c1 in (SELECT c1 FROM ...)
SELECT c1,
(SELECT count(*) # 添加计算字段
FROM tb2
WHERE tb2.c1=tb1.c1) AS newname
FROM tb1
15 连接表
- from后面跟多个表,在where里面使用两个表的连接条件(等值连接)
16 高级连接
- 自连接:使用表别名使表自身和自身连接
- 自然连接:多个表对于相同列进行连接
- 内连接、外连接:join,left join,right join,full join
17 组合查询 UNION
- UNION可以组合多个SELECT语句,要求字段兼容,几乎完成了WHERE条件相同的工作。会自动去除重复的数据,如果要返回所有匹配行使用UNION ALL。在最后使用ORDER BY排序,对所有结果排序,前面所有实际上是一条语句
18 全文本搜索 MATCH AGAINST
- MyISAM支持全文本搜索,InonDB不支持
- 在创建表时使用FULLTEXT创建索引
SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('rabbit')
SELECT note_text, MATCH(note_text) AGAINST('rabbit') AS rank # 查询所有的
FROM productnotes
SELECT note_text FROM productnotes
WHERE MATCH(note_text) AGAINST('rabbit' WITH QUERY EXPANSION) # 使用查询扩展
SELECT note_text FROM productnotes
WHERE MATCH(note_text) AGAINST('rabbit' IN BOOLEAN MODE) # 使用布尔查询
# 要使用其他布尔查询的操作符
19 插入数据 INSERT INTO
- 要写插入表的列名,SELECT语句后面的列不要带括号
INSERT INTO tb(c1, c2,...) # 根据值插入
VALUES
(C1,C2,...)
INSERT INTO tb(c1, c2,...) # 从SELECT语句插入
SELECT C1,C2,...
20 更新和删除 UPDATE,DELETE,TRUNCATE
没有where条件更新删除所有行,先试用select查询要删除的数据是否是想要删除的数据
UPDATE tb
SET c1 = newValue,
c2 = newValue
WHERE .... # 可以使用子查询,WHERE id IN (SELECT id FROM...)
DELETE FROM tb
WHERE ...
TRUNCATE TABLE tb # 删除所有数据(实际上是删除表然后新建一个表,速度比delete快)
21 创建和操纵表CREATE
- 创建表
CREATE TABLE IF NOT EXISTS tb
( id INT NOT NULL AUTO_INCREMENT, # 自增
name NOT NULL DEFAULT 'AA', # 默认值
address NULL,
PRIMARY KEY (id) # 设置主键约束
)ENGINE=InnoDB
last_insert_id()函数获取最后一个自增AUTO_INCREMENT值
- 更改表
ALTER TABLE tb # 添加列
ADD c1 char(20),
c2 char(20)
ALTER TABLE tb # 删除列
DROP c1,c2
- 删除表:DROP TABLE tb
- 重命名:RENAME tb1 TO tb2,tb3 TO tb4
22 使用视图
视图提供了一种MySQL的select语句层次的封装,可用来简化数据处理,重新格式化基础数据或保护基础数据
## 创建视图
create view as select ...
## 查看创建视图的语句
show create view view_name
## 删除视图
dorp view view_name
## 更新视图
先drop在create
或者
create or replace view
23 使用存储过程
## 调用存储过程
call xxx(@xxx, @xxx);
## 创建存储过程
create procedure xxx()
begin
select...
end;
## 如果使用命令行,需要修改delimiter,因为命令行解析;为结束
开头使用delimiter //重新定义结束符,最后使用end//
## 删除存储过程
dorp procedure xxx;
dorp procedure xxx if exists;
## 使用参数, in out关键字表示输入输出变量,into表示将结果写入变量
#创建
create procedure xxx(out 变量 变量类型, in 变量 变量类型)
begin
使用关键字into写入变量
end;
#调用
call xxx(@p1,@p2...)
## 更复杂的存储过程, 使用declare声明变量类型
declare 变量 变量类型;
if 布尔变量 then
...
elseif 布尔变量 then
...
else
...
end if;
## 显示所有存储过程
show procedure status;
show procedure status like 'xxx'; 限制输出,使用过滤
## 显示创建存储过程的语句
show create procedure xxx;
24 使用游标
## 声明游标
declare xxx cursor for ...
## 打开/关闭游标
open xxx;
close xxx;
## 打开游标后检索当前行
fetch xxx into xxx;
## 打开游标后遍历所有行, 注意:declare必须在任意游标之前定义
declare done boolean default 0;
declare continue handler for sqlstate '02000' set done=1; #定义一个continue handler,在条件出现时被执行,'02000'是未找到条件
repeat
fetch xxx into xxx;
until done end repeat;
25 使用触发器
- 自动执行的一条语句,delete,insert,update
- 创建触发器:唯一的触发器名(表中),关联的表,响应的活动,何时执行
## 创建触发器, 每个表最多支持6个触发器每条insert update delete的之前和之后
create trigger xxx after insert on xxx
for each row select ...;
create trigger xxx after insert on xxx
for each row
begin
...
end;
## 删除触发器, 不能更改或覆盖,必须删除再创建
drop triggle xxx;
## insert触发器
可以引用一个NEW的虚拟表访问被插入的行,NEW中的值也可以被更新
## delete触发器
可以引用一个OLD的虚拟表访问被删除的行,OLD中的值是只读的
## update触发器
可以引用NEW访问更新的值,值也可以更改,OLD访问原来的值,只读
26 管理事务处理
- 事务管理用来管理insert,update,delete语句,不能回退create,drop
## 开始事务,回滚事务,提交事务
start transaction
...
rollback; # 只能在一个事务中使用,
commit;
## 使用保留点, 越多越好,执行rollback或commit后自动释放,release savepoint明确释放
savepoint xxx;
rollback to xxx;
- 更改默认提交,set autocommit=0
27 全球化和本地化
- 查看支持的字符集列表:show character set;
- 查看支持校对的字符集列表:show collation;
- 查看系统或数据库的字符集和校对:show variables like 'character%'; show variables like 'collation%';
- 为某个表或某个列指定字符集和校对,不指定使用数据库默认
create table xxx
(
column1 int,
column2 varchar(10) character set xxx collation xxx;
)
default character set xxx
collation xxx;
## 排序特定的select语句, 或者group by, having,聚合函数,别名等
select xxx order by xxx collate xxx;
28 安全管理
## 创建用户账号, 不指定主机名默认%
create user xxx identified by 'password';
create user xxx identified by password '散列值';
或者使用insert, grant 一般不建议使用insert
## 重命名用户账号
rename user xxx to xxx;
## 删除用户
drop user xxx;
## 创建用户账号后必须分配访问权限,否则只能登录,看不到数据,也无法执行操作
## 查看赋予用户的权限
show grant for xxx;
## 设置权限
grant xxx on dbname.* to xxx; # 针对某个数据库
revoke xxx on dbname.* from xxx; # 撤销权限
## 更改用户密码
set password for xxx = password('new password');
set password = password('new password'); # 更新当前用户的密码
29 数据库维护
- 备份数据
- 数据库维护
## 检查表键是否正确
analyze table xxx;
check table xxx;
- 诊断启动问题,mysqld --help, --safe-mode, --verbose, --version
- 查看日志,data目录
- 错误日志,hostname.err
- 查询日志,hostname.log
- 二进制日志,记录更新过数据的所有语句,hostname-bin
- 缓慢查询日志,记录执行缓慢的任何查询,对数据库需要在何处优化很有用,hostname-slow.log
- flush logs,刷新和重新开始所有日志文件
30 改善性能
- 查看配置:show variables,show status
- 查看活动进程:show processlist,使用kill终结某个特定进程
- 使用explain解析查询语句
- 有的操作支持delayed关键字
MySQL必知必会学习笔记(详细)的更多相关文章
- 《MySQL必知必会》学习笔记——前言
前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...
- 《MySQL必知必会》学习笔记整理
简介 此笔记只包含<MySQL必知必会>中部分章节的整理笔记.这部分章节主要是一些在<SQL必知必会>中并未讲解的独属于 MySQL 数据库的一些特性,如正则表达式.全文本搜索 ...
- MySQL必知必会(第4版)整理笔记
参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...
- 《mysql必知必会》读书笔记--存储过程的使用
以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...
- MySQL必知必会1-20章读书笔记
MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- 读《MySql必知必会》笔记
MySql必知必会 2017-12-21 意义:记录个人不注意的,或不明确的,或不知道的细节方法技巧,此书250页 登陆: mysql -u root-p -h myserver -P 9999 SH ...
- 《SQL必知必会》学习笔记整理
简介 本笔记目前已包含 <SQL必知必会>中的所有章节. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔记即可找到相关知识点.因此在整理笔记 ...
- MySQL必知必会复习笔记(1)
MySQL必知必会笔记(一) MySQL必知必会是一本很优秀的MySQL教程书,并且相当精简,在日常中甚至能当成一本工作手册来查看.本系列笔记记录的是:1.自己记得不够牢的代码:2.自己觉得很重要的代 ...
- mysql学习--mysql必知必会1
例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式 ...
随机推荐
- ipython notebook教程
一.简介 Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含代码.方程式.可视化和文本的文档.它的用途包括:数据清理和转换.数值模拟.统计建模.数据可视化.机器学习等等 ...
- golang中sha256、md5加密,base64encode、base64decode
package tool import ( "crypto/md5" "crypto/sha256" "encoding/base64" & ...
- insert插入日期
7.5.insert插入日期 数字格式化:format select ename,sal from emp: 格式化数字:fromat(数字,'格式') select ename,format(sal ...
- Clang-Format 个人常用配置
Clang-Format 个人常用配置 本文记录 Clang-Format 个人常用配置. 欲了解更多配置选项,可查阅 官方文档. BasedOnStyle: Google AccessModifie ...
- postgresql dba常用sql查询语句
查看帮助命令 DB=# help --总的帮助 DB=# \h --SQL commands级的帮助 DB=# \? --psql commands级的帮助 \dn[S+] [PATTERN],其中[ ...
- 如何加载本地下载下来的BERT模型,pytorch踩坑!!
近期做实验频繁用到BERT,所以想着下载下来使用,结果各种问题,网上一搜也是简单一句:xxx.from_pretrained("改为自己的路径") 我只想说,大坑!!! 废话不多说 ...
- tcp|ip nagle算法
在TCP传输数据流中,存在两种类型的TCP报文段,一种包含成块数据(通常是满长度的,携带一个报文段最多容纳的字节数),另一种则包含交互数据(通常只有携带几个字节数据). 对于成块数据的报文段,TCP采 ...
- 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.7
公告 我们的群共享文件有备份到 IPFS 的计划,具体时间待定. 我们的机器学习群(915394271)正式改名为财务提升群,望悉知. 请关注我们的公众号"ApacheCN",回复 ...
- 【源码】Redis命令处理过程
本文基于社区版Redis 4.0.8 1.命令解析 Redis服务器接收到的命令请求首先存储在客户端对象的querybuf输入缓冲区,然后解析命令请求的各个参数,并存储在客户端对象的argv和ar ...
- tomcat访问所有的资源,都是用Servlet来实现的
感谢大佬:https://www.zhihu.com/question/57400909 tomcat访问所有的资源,都是用Servlet来实现的. 在Tomcat看来,资源分3种 静态资源,如css ...