六、用通配符进行过滤

本章介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索

LIKE操作符

  • 百分号(%)通配符
select prod_id,prod_name
from products
where prod_name like 'jet%';

%表示任何字符出现任意次数,也就是0个、1个或者多个字符

%可以在匹配字符的任意位置使用,例如 '%jet'、'%jet%'、'j%t'

  • 下划线(_)通配符
select prod_id,prod_name
from products
where prod_name like '_ ton anvil';

_只匹配单个字符而不是多个字符

  • 使用通配符的技巧

通配符处理比其他搜索花费时间更长,因此不建议过度使用通配符。

不建议将通配符置于搜索模式的开始处,这样搜索起来是最慢的

格外注意通配符的位置

七、用正则表达式进行搜索

本章将学习如何在where子句内使用正则表达式更好的控制数据过滤

  • 基本字符匹配
select prod_name
from products
where prod_name regexp '1000'
order by prod_name;
select prod_name
from products
where prod_name like'1000'
order by prod_name;

注意:LIKE与REGEXP

like不会返回1000这个值,而regexp会返回1000这个值

select prod_name
from products
where prod_name regexp '.000'
order by prod_name;

其中 . 表示匹配任意一个字符

注意:正则表达式匹配不区分大小写,如果想要区分,使用关键字BINARY位于regexp之后

  • 进行OR匹配
select prod_name
from products
where prod_name regexp '1000|2000'
order by prod_name;

其中 | 表示匹配其中一个,相当于使用or操作符

  • 匹配几个字符之一
select prod_name
from products
where prod_name regexp '[123]Ton'
order by prod_name;

其中[123]表示匹配1或2或3

注意:如果不想匹配123,可以使用[^123]来匹配字符1、2、3以外的值

  • 匹配范围

当想要匹配[0123456789]时,可以写成[0-9],就表示匹配0到9中的任意一个

  • 匹配特殊字符

上述使用了 . [] | - 等进行匹配,那么如果想要匹配这些字符呢?

select prod_name
from products
where prod_name regexp '\\.'
order by prod_name;

其中 \\. 匹配 . ,这种处理就是所谓的转义

注意:

为了匹配反斜杠(\)需要使用\\\

  • 匹配字符类

  • 匹配多个实例

*: 0个或者多个匹配

+: 1个或者多个匹配

?: 0个或者1个匹配

{n}: 指定数目的匹配

{n, }: 不少于指定数目的匹配

{n,m}: 匹配数目的范围(m不超过255)

select prod_name
from products
where prod_name regexp '\\([0-9] sticks?\\)'
order by prod_name;

将匹配到 TNT (1 stick) 、 TNT(5 sticks)

  • 定位符

^ : 文本的开始

$ : 文本的结尾

[[:: 词的开始

[[:>:]] 词的结尾

select prod_name
from products
where prod_name regexp '^[0-9\\.]'
order by prod_name;

注意:

^不仅可以指定串的开始,还可以否定该集合

当通过^与$配合使用,可以是regexp与like达到相同的效果,因为like匹配整个串而regexp匹配子串

八、创建计算字段

本章介绍什么是计算字段以及如何创建计算字段

  • 计算字段

与前面各章介绍的列不同,计算字段并不实际存在于数据库表中,而是运行时在select语句内创建的,也就是通过各种函数生产的字段

  • 拼接字段
select Concat(vend_name,'(',vend_country,')')
from vendors
order by vend_name;

于是显示出了数据库中没有的,有Concat()函数生成的新字段,这就是计算字段!

Concat()函数就是将会多个字段拼接起来

select Concat(vend_name,'(',RTrim(vend_country),')')
from vendors
order by vend_name;

还可以使用RTrim()函数进一步处理该计算字段

注意:

RTrim()表示去掉右边的空格

LTrim()表示去掉左边的空格

Trim()表示去掉两边的空格

使用别名

通过as 在表名、列名后即可赋予别名

  • 执行计算字段
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;

其中quantity*item_price AS expanded_price将计算产品的数量×产品的单价并使用别名显示出该产品的总价

注意:

除了*乘法运算,字段之间还可以使用+、-、/等运算

还可以通过Now()函数返回当前日期

九、使用数据处理函数

Upper()、Soundex()、文本处理函数、日期和时间处理函数、数值处理函数

十、汇总数据

聚集函数:AVG()、COUNT()、MAX()、MIN()、SUM()、

注意:

count(*)返回表中行的数目,不管表列中包含的是空值还是非空值

count(column)对指定的列进行计数并返回,会忽略null值

这两章都是介绍一些处理字段的函数,有相关需求时,直接去查表即可

十一、分组数据

本章将介绍如何分组,并介绍GROUP BY 和HAVING如何使用

  • 创建分组
select vend_id,count(*) as num_prods
from products
group by vend_id;

通过vend_id进行分组,并统计每组中有多少条数据

注意:

除聚集函数计算语句外,select语句中的每个列都必须在group by 子句中给出

group by 必须出现在 where 之后,order by 之前

  • 过滤分组
select cust_id,count(*) as orders
from orders
group by cust_id
having count(*)>=2;

通过having子句,可以对分组后的数据进行过滤,一般都是作用于select中的分组函数上

注意:HAVING和WHERE的差别

where在数据分组前进行过滤,having在数据分组后进行过滤

  • 分组和排序

只需要知道order by在group by 之后使用

  • select子句顺序

select->from->where->group by->having->order by->limit

十二、使用子查询

本章介绍什么是子查询以及如何使用它们

  • 利用子查询进行过滤

需求:列出订购物品TNT的所有客户信息

此时有张订单信息表、订货id-客户id表、客户信息表

可以分三步进行查询,先通过订单信息表查询TNT商品的订单id,在通过订单id查询客户id,再通过客户id查询客户信息

将上述三个步骤合为一步:

SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2'));

注意:

实际在使用过程中由于性能限制,不建议嵌套太多的子查询

  • 作为计算字段使用子查询

需求:需要显示customers表中每个客户的订单总数

分两步进行查询,从customers表中检索出客户id,根据客户id去订单表中查询订单并统计数目

select cust_name,cust_state,(select count(*)
from orders
where orders.cust_id=customers.cust_id) as orders
from customers
order by cust_name;

其中orders是一个计算字段,对于从customers表中查询的每个客户都执行依次

也就是在customers表中查询的customers.cust_id去order表中做查询

注意:

where子句中必须使用全限定列名

《MySQL必知必会》知识汇总二的更多相关文章

  1. MySql必知必会实战练习(二)数据检索

    在上篇博客MySql必知必会实战练习(一)表创建和数据添加中完成了各表的创建和数据添加,下面进行数据检索和过滤操作. 1. Select子句使用顺序 select--->DISTINCT---& ...

  2. Elasticsearch必知必会的干货知识二:ES索引操作技巧

    该系列上一篇文章<Elasticsearch必知必会的干货知识一:ES索引文档的CRUD> 讲了如何进行index的增删改查,本篇则侧重讲解说明如何对index进行创建.更改.迁移.查询配 ...

  3. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  4. 《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 ...

  5. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  6. 《mysql 必知必会》 速查指南

    目录 增 添加一整行 插入多行 删 删除指定行 删除所有行 改 查 简单检索 结果筛选 结果排序 结果过滤 创建字段 处理函数 数据分组 其他高级用法 文章内容均出自 <MySQL 必知必会&g ...

  7. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

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

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

  9. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  10. mysql必知必会系列(一)

    mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...

随机推荐

  1. 最强cron解析器

    背景 大家有没有这么一种困境 我现在需要去配置一个定时任务:"每天早上九点执行任务" 若你有一个好的定时任务平台,相信很容易就能配置完成.那若是没有定时任务平台呢?是不是就要自己写 ...

  2. KVM命令参数

    # virt-install --help usage: virt-install --name NAME --memory MB STORAGE INSTALL [options] 从指定安装源创建 ...

  3. Fluentd采集示例

    Fluentd通过读取配置文件来加载各插件,日志经由各插件的处理完成输入到输出的整个路由. 本文通过一个最简单的示例来说明配置文件的结构.td-agent.conf默认位于/etc/td-agent/ ...

  4. 《Deep Feature Extraction and Classification of Hyperspectral Images Based on Convolutional Neural Networks》论文笔记

    论文题目<Deep Feature Extraction and Classification of Hyperspectral Images Based on Convolutional Ne ...

  5. Linux make编译

    安装问题 linux编译流程 linux开发部分 一般来说著名的linux系统基本上分两大类: RedHat系列:Redhat.Centos.Fedora等 Debian系列:Debian.Ubunt ...

  6. Java斗地主(集合综合练习)

    ​ 学完了集合后我们可以开始做一个简易版的 " 斗地主 " 了,但是呢咱们这个斗地主只能实现制造牌,洗牌.发牌.看牌这几个简单的功能,并不是我们玩的 " 真人版斗地主 & ...

  7. scrapy操作mysql/批量下载图片

    1.操作mysql items.py meiju.py 3.piplines.py 4.settings.py -------------------------------------------- ...

  8. 一天五道Java面试题----第六天(1)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.mybatis和hibernate的对比 2 .#{}和${}的区别 3 .mybatis插件运行原理及开发流程 4 ...

  9. 基于YOLO和PSPNet的目标检测与语义分割系统(python)

    基于YOLO和PSPNet的目标检测与语义分割系统 源代码地址 概述 这是我的本科毕业设计 它的主要功能是通过YOLOv5进行目标检测,并使用PSPNet进行语义分割. 本项目YOLOv5部分代码基于 ...

  10. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(30)-Fiddler如何抓取Android7.0以上的Https包-番外篇

    1.简介 通过宏哥前边几篇文章的讲解和介绍想必大家都知道android7.0以上,有android的机制不在信任用户证书,导致https协议无法抓包.除非把证书装在系统信任的证书里,此时手机需要roo ...