文章内容均出自 《MySQL 必知必会》,目的在于做出简单梳理,方便查找。

对于数据库的操作,最经典的应用场景就是 CRUD,即所谓的增Create、删Delete、改Update、查Read

其中,又以查Read最为重要,相关功能操作也是最多。因为你可能不会频繁地对数据库进行变动,而更多是对数据的应用。

约定

mysql 中不区分大小写,因此 SELECT field_name FROM table_name 等价于 select field_name from table_name

为了保持可读性,通常将其关键字用大写表示。

使用 INSERT INTO 关键字。

添加一整行

-- 方式1:给出所有字段
INSERT INTO table_name--表名
VALUES(
-- 对表中每一列必须提供一个值,且次序与表定义的顺序一致
-- 自动增量列也需赋值 NULL
); -- 方法2:指定需插入的字段列名,在值中对应给出
-- 更加灵活。可省略部分可以为 NULL 的列。
INSERT INTO table_name(
field1,
field2
)--表名
VALUES(
value1,
value2
);

插入多行

sql 中,一条 sql 语句就是对数据库的一次操作。

假如需要插入 1000 行,就是 1000sql 操作。效率比较慢,更有效率的方式是把需要插入的数据拼接字符串,使用一次 sql 操作即可。

INSERT INTO table_name(
field1,
field2
)--表名
VALUES(
value1,
value2
),(
value1,
value2
),(
-- ...
);

使用 DELETE FROM 关键字。

删除指定行

DELETE FROM table_name
WHERE ;-- 筛选出指定行

删除所有行

这里只删除表中所有数据,而不删除表本身。

-- 方式一
DELETE FROM table_name -- 方式二
TRUNCATE table_name
-- 该方法实际上是删除原表,并重新创建一个新表,而不是逐行删除

使用 UPDATE SET 关键字。

UPDATE table_name
SET field1 = 'value1',
field2 = 'value2'
-- 添加 where 子句,可更新指定行;
-- 否则更新所有行
WHERE ;-- 删选条件

使用 SELETE FROM 关键字。

对数据库进行查询应该是最经常使用的操作,而其中的语法和注意事项也是最繁多的。

对于同样一种需求,可以使用多种不同的写法来达到目的。

应当在能够达成任务的基础上,积极寻求更有效率的实现方式。

简单检索

-- 检索单列
SELECT field
FROM table_name; -- 检索多列
SELECT field1, field2 --...
FROM table_name; -- 检索所有列
SELECT * --通配符
FROM table_name;

结果筛选

只检索出值不同的行

-- 单列
SELECT DISTINCT field
FROM table_name; -- 多列也适用
SELECT DISTINCT field1, field2 --...
FROM table_name;

DISTINCT 关键字应用于所有列,而不是在它之后的一个字段。

当有多列时,只有当两行的每个列都相同时才会被筛掉。

检索出指定数量的行

-- 检出前5行
SELECT DISTINCT field
FROM table_name
LIMIT 5 ; -- 检出从第 4 行开始的 5行
SELECT DISTINCT field
FROM table_name
LIMIT 5, 4 -- 从 行 4 开始的 5 行
-- 另一种 更语义化的写法
LIMIT 5 OFFSET 4;

结果排序

使用 order by 子句指定排序字段,使用 desc 字段定义排序方式。

SELECT field_name
FROM table_name
ORDER BY field_name; -- 也可以是表中的其它字段 -- order by 默认升序排序,可改为降序
ORDER BY field_name DESC; -- 多列排序
-- 当 field1 字段值相同时,再按 field2 排序
ORDER BY field1, field2, ... -- 多列排序 + desc 关键字
-- desc 只作用位于其前的字段
ORDER BY field1 DESC, field2, field3 DESC, ...

结果过滤

使用 where 子句指定过滤条件。

SELECT field_name
FROM table_name
WHERE field1 = value1, -- 等于
field1 <> value1, -- 不等于
field1 != value1, -- 不相等
field1 < value1, -- 小于
field1 <= value1, -- 相等
field1 BETWEEN value1 AND value2, -- 在指定两值之间
field1 IS NULL -- 空值

and 、 or 关键字

where 子句也可以用 and 和 or 关键字来组合使用。

SELECT field_name
FROM table_name
-- AND 关键字
WHERE field1 = value1 AND field2 <> value2; -- OR 关键字
WHERE field1 = value1 OR field2 <> value2; -- 组合使用
-- 计算次序中,and 优先级高于 or
WHERE field1 = value1 AND field2 <> value2 OR field3 IS NULL;
-- 避免歧义,可用 () 包裹
WHERE (field1 = value1 AND field2 <> value2) OR field3 IS NULL; -- IN 关键字
WHERE field1 IN (v2, v3)
-- 等价于
WHERE field1 = v2 OR field1 = v3; -- NOT 关键字,取反其后的条件
WHERE field1 NOT IN (v2, v3)

LIKE + 通配符

_ 通配符匹配任何单个字符。

% 表示任何字符出现任意次数。

SELECT f1, f2
FROM table_name
WHERE f1 LIKE 'jet%';
-- 匹配 jet123、jet、Jet 、...
WHERE f1 LIKE 'jet_';
-- 匹配 jet1, jetc, 不会匹配 jet123.

注意:通配符的使用会降低搜索效率,如无必要,尽量少用。

mysql 也支持使用正则表达式来进行结果匹配。

SELECT f1, f2
FROM table_name
WHERE f1 REGEXP '[123]ton';
-- 匹配 1ton,2ton, 3ton

创建字段

select 语法不仅可以查询表中现有的字段列,还可以通过数据组合,返回基于现有字段数据,再生成的新字段数据,并通过别名方式AS生成新字段名。而这个新字段对于客户端来说,与直接请求的原生字段行为完全一致。

计算字段

SELECT field1 * field2 AS new_field
FROM table_name

如上方式,会返回一个 new_field 字段,是字段1和字段2 的值相乘的结果,它的值是 v1*v2

使用计算字段还可以进行字符串拼接,这涉及到 mysql 中的函数使用,将在后面提到。

处理函数

mysql 支持使用函数来对原始数据进行处理后返回,主要包括文本函数数值函数时间函数系统函数

文本函数

-- 将文本转换为大写
SELECT
Upper(field) -- 将文本转换为大写
Trim(field) -- 去除文本两边空格
RTrim(field) -- 去除文本右边空格
LTrim(field) -- 去除文本左边空格
AS new_field
FROM table_name

时间函数

数值函数

汇总函数

对表中原始数据进行汇总,然后返回汇总值,而不必直接返回原始数据。

SELECT
COUNT(field) -- 对指定列中的行数进行汇总(忽略 NULL 值)
AS new_field
FROM table_name
函数名 功能 忽略 NULL
AVG(field) 字段平均值
COUNT(*) 计算表中所有行数 ×
COUNT(field) 计算表中指定字段行数
MAX(field) 字段最大值
MIN(field) 字段最小值
SUM(field) 字段最小值

数据分组

sql 允许对原始数据分组。通过将数据分成多个逻辑组,可以对每个组进行聚集计算。

通过 GROUP BY 子句构建分组。

-- 对 field 字段进行分组,然后对每个分组进行计数
-- 返回每个分组的行数。
SELECT COUNT(*) AS new_field
FROM table_name
GROUP BY field;

上例的意思是,对 field 字段进行分组,然后对每个分组进行计数,并返回每个分组的行数。

过滤分组

分组也可以进行过滤,其关键字 HAVING 类似 WHERE 语法,只不过 WHERE 指定过滤行,而 HAVING 指定过滤分组。

对于分组的过滤条件,通常使用聚集函数的结果来限定。

-- 对 field 字段进行分组,然后对每个分组进行计数
-- 返回行数大于 2 的分组的行数。
SELECT COUNT(*) AS new_field
FROM table_name
GROUP BY field
HAVING COUNT(*) > 2

分组排序

为保证分组字段的输出顺序是正确的,一般应提供明确的 ORDER BY 子句。

-- 对 field 字段进行分组,然后对每个分组进行计数
-- 返回行数大于 2 的分组的行数
-- 返回值按照其行数进行升序排列
SELECT COUNT(*) AS new_field
FROM table_name
GROUP BY field
HAVING COUNT(*) > 2
ORDER BY new_field

其他高级用法

MySQL 中,除了以上基础的增删改查,还有一些更加高级的用法。

比如,在更新语句中嵌套子查询;为多个相互关联的表创建联结;对多个表执行同一种查询,并返回查询结果集;对特定表创建索引,进行全文本模糊检索;将一些常用查询操作封装成视图,客户端直接向视图查询预处理后的原始数据;通过事务管理来实现分步的原子操作;对于用户权限的管理;操作性能的优化;数据库的日常维护等等。

本文不再进行详细梳理,更多请直接查看 《MySQL 必知必会》

《mysql 必知必会》 速查指南的更多相关文章

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

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

  2. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  3. mysql 必知必会总结

    以前 mysql 用的不是很多, 2 天看了一遍 mysql 必知必会又复习了一下基础.  200 页的书,很快就能看完, 大部分知识比较基础, 但还是了解了一些以前不知道的知识点.自己做一个备份,随 ...

  4. 读《MySQL必知必会》我学到了什么?

    前言 最近在写项目的时候发现自己的SQL基本功有些薄弱,遂上知乎查询MYSQL关键字,期望得到某些高赞答案的指点,于是乎发现了 https://www.zhihu.com/question/34840 ...

  5. MySQL必知必会-官方数据库表及SQL脚本导入生成

    最近在复习SQL语句,看的是MySQL必知必会这本书,但是发现附录中只有表设计,没有表的具体数据.所以在学习相应的语句中体验不是很好,去网上查了数据库的内容,自己慢慢导入到了数据库中.把表放出来作为参 ...

  6. django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询

    from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...

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

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

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

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

  9. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

随机推荐

  1. MySQL记录操作(单表查询)

    单表查询的语法及关键字执行的优先级 单表查询语法 SELECT DISTINCT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER ...

  2. Vue2.0 【第一季】第4节 v-text & v-html

    目录 Vue2.0 [第一季]第4节 v-text & v-html 第四节 v-text & v-html Vue2.0 [第一季]第4节 v-text & v-html 第 ...

  3. Maven pom.xml 添加本地jar包依赖以及打包方法

    Maven项目打包时,如果遇到需要添加本地jar包依赖的时候,可以选择两种方法: 1. 安装到本地仓库 第一种方法比较常规,适用于需要添加的jar包也是由maven项目导出,含有pom文件的时候.只需 ...

  4. react 给选中的li添加样式(转载)

    路:使用事件委托,关键:获取到的index必须转为数字,因为它是字符串 handleClick = (e) => { const nodeName = e.target.nodeName.toU ...

  5. 使用 Pandas 的 to_excel() 方法来将多个 csv 文件合并到一个 xlsx 的不同 sheets 内

    这几天在用 Python3 研究一个爬虫,最后一个需求是把爬下来的20+个csv文件整合到一个excel表里的不同sheets. 初版的核心代码如下: while year <= 2018: c ...

  6. java学习笔记(1)——有关接口

    接口: interface intf0{ public void doSomething(); } interface intf1{ public void doAnything(); } class ...

  7. STM32 初学不知道外设对应的APB1还是APB2

    STM32参考手册搜索“系统架构”或者“系统结构”,即可查看外设挂在哪个时钟下,也就知道开启哪个时钟了.

  8. Springboot使用Undertow

    Springboot使用Undertow Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器 Undertow的特点: 轻量级:它是一个 Web 服务器,但不像传统的 ...

  9. Cesium 源码笔记[1] Viewer模块实例化的大致过程

    我原本想写日记的,但是不太现实. 源码下载 源码可以从源码包和发行包中的Source目录中获取. Cesium的模块化机制从1.63版本开始,由原来的RequireJs变为ES6.但有可能是原先设计耦 ...

  10. 阿里云服务器Ubuntu系统搭建LNMP环境

    目录 一.Nginx 安装 二.MySQL安装 三.PHP安装 四.配置Nginx 五.环境测试 六.服务器常用路径 一.Nginx 安装 更新软件源 sudo apt-get update 安装 N ...