目录

01 了解SQL

02 MySQL简介

03 使用MySQL

04 检索数据 select, from, distinct, limit, offset

05 排序 order by

06 过滤数据 where,between and,is null

07 数据过滤 where,and,or,not,in

08 用通配符进行过滤 LIKE %为匹配任意字符,_为匹配一个字符

09 用正则表达式搜索 REGEXP

10 创建计算字段 concat()

11 使用数据处理函数 文本,日期,数值函数

12 聚合函数 avg,count,max,min,sum

13 分组 group by,having

14 子查询 (嵌套查询)

15 连接表

16 高级连接

17 组合查询 UNION

18 全文本搜索 MATCH AGAINST

19 插入数据 INSERT INTO

20 更新和删除 UPDATE,DELETE,TRUNCATE

21 创建和操纵表CREATE

22 使用视图

23 使用存储过程

24 使用游标

25 使用触发器

26 管理事务处理

27 全球化和本地化

28 安全管理

29 数据库维护

30 改善性能


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必知必会学习笔记(详细)的更多相关文章

  1. 《MySQL必知必会》学习笔记——前言

    前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...

  2. 《MySQL必知必会》学习笔记整理

    简介 此笔记只包含<MySQL必知必会>中部分章节的整理笔记.这部分章节主要是一些在<SQL必知必会>中并未讲解的独属于 MySQL 数据库的一些特性,如正则表达式.全文本搜索 ...

  3. MySQL必知必会(第4版)整理笔记

    参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...

  4. 《mysql必知必会》读书笔记--存储过程的使用

    以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...

  5. MySQL必知必会1-20章读书笔记

    MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...

  6. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  7. 读《MySql必知必会》笔记

    MySql必知必会 2017-12-21 意义:记录个人不注意的,或不明确的,或不知道的细节方法技巧,此书250页 登陆: mysql -u root-p -h myserver -P 9999 SH ...

  8. 《SQL必知必会》学习笔记整理

    简介 本笔记目前已包含 <SQL必知必会>中的所有章节. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔记即可找到相关知识点.因此在整理笔记 ...

  9. MySQL必知必会复习笔记(1)

    MySQL必知必会笔记(一) MySQL必知必会是一本很优秀的MySQL教程书,并且相当精简,在日常中甚至能当成一本工作手册来查看.本系列笔记记录的是:1.自己记得不够牢的代码:2.自己觉得很重要的代 ...

  10. mysql学习--mysql必知必会1

     例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式 ...

随机推荐

  1. ipython notebook教程

    一.简介 Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含代码.方程式.可视化和文本的文档.它的用途包括:数据清理和转换.数值模拟.统计建模.数据可视化.机器学习等等 ...

  2. golang中sha256、md5加密,base64encode、base64decode

    package tool import ( "crypto/md5" "crypto/sha256" "encoding/base64" & ...

  3. insert插入日期

    7.5.insert插入日期 数字格式化:format select ename,sal from emp: 格式化数字:fromat(数字,'格式') select ename,format(sal ...

  4. Clang-Format 个人常用配置

    Clang-Format 个人常用配置 本文记录 Clang-Format 个人常用配置. 欲了解更多配置选项,可查阅 官方文档. BasedOnStyle: Google AccessModifie ...

  5. postgresql dba常用sql查询语句

    查看帮助命令 DB=# help --总的帮助 DB=# \h --SQL commands级的帮助 DB=# \? --psql commands级的帮助 \dn[S+] [PATTERN],其中[ ...

  6. 如何加载本地下载下来的BERT模型,pytorch踩坑!!

    近期做实验频繁用到BERT,所以想着下载下来使用,结果各种问题,网上一搜也是简单一句:xxx.from_pretrained("改为自己的路径") 我只想说,大坑!!! 废话不多说 ...

  7. tcp|ip nagle算法

    在TCP传输数据流中,存在两种类型的TCP报文段,一种包含成块数据(通常是满长度的,携带一个报文段最多容纳的字节数),另一种则包含交互数据(通常只有携带几个字节数据). 对于成块数据的报文段,TCP采 ...

  8. 布客&#183;ApacheCN 编程/后端/大数据/人工智能学习资源 2020.7

    公告 我们的群共享文件有备份到 IPFS 的计划,具体时间待定. 我们的机器学习群(915394271)正式改名为财务提升群,望悉知. 请关注我们的公众号"ApacheCN",回复 ...

  9. 【源码】Redis命令处理过程

    本文基于社区版Redis 4.0.8   1.命令解析 Redis服务器接收到的命令请求首先存储在客户端对象的querybuf输入缓冲区,然后解析命令请求的各个参数,并存储在客户端对象的argv和ar ...

  10. tomcat访问所有的资源,都是用Servlet来实现的

    感谢大佬:https://www.zhihu.com/question/57400909 tomcat访问所有的资源,都是用Servlet来实现的. 在Tomcat看来,资源分3种 静态资源,如css ...