《MYSQL必知必会》读书笔记2

news2024/12/28 18:49:33

哈夫曼树的学习:

http://t.csdn.cn/XJhUI

创建计算字段

字段:基本上与列的意思相同(数据库列一般称为列,而字段通常用于计算字段连接上)

拼接字段

拼接:将值联结到一起构成单个值

把两个结拼接起来,在MYSQL的SELECT语句中,可以用Concat()函数来拼接

SELECT Concat(vend_name,'(',vend_country,')') FROM vendors ORDER BY vend_name;

可以检索到:ACME (USA)等

删除数据右端多余的空格,可以使用MYSQL的RTrim()函数来完成

LTrim()是去掉串左边的空格

Trim()是去掉串两边的空格

SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')' FROM vendors ORDER BY vend_name;

使用别名

拼接后,新计算的名字是不知道是什么,在客户机查看结果时,一个未命名的列不能用于客户机中,此时可以使用别名。

SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') AS vend_title

FROM vendors ORDER BY vend_name;

别名也叫导出列,别名的另一个作用:在实际的表列名中包含不符合规定的字符(如空格)是重新命名他,在原来的名字混淆或者容易误解是扩充它。

执行算术计算

SELECT prod_id,quantity,item_price FROM orderitems WHERE order_num=200005;

这个SQL语句是检索每项物品的单价

SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price

FROM orderitems WHERE order_num=200005;

这条语句的输出显示expanded_price列,是计算的quantity*item_price

测试计算:

可以用SELECT Trim('abc');返回abc;

SELECT 3*2;返回6;

SELECT Now();返回当前日期和时间。

使用数据处理函数

c7f8ee17e0cb4097b34f311f9fc55170.png

68b3b9bda58c426bb36129a564dc5cbd.png

Soundex()函数的解释:

如果customers表中有一个顾客是Coyote Inc,其联系名是Y.Lee。但如果这个是输入错误,此联系名实际应该是Y.Lie。

SELECT cust_name,cust_contact FROM customers WHERE cust_contact='Y.Lie';

这个检索查不到数据,因为输入错误,但是用Soundex()函数进行检索,他匹配所有发音类似于Y.Lie,所以可以搜索到Y.Lee

SELECT cust_name,cust_contact FROM customers WHERE Soundex(cust_contact)=Soundex('Y.Lie');

日期和时间处理函数

feabc325d61848ce8afcd503c03018e1.png

SELECT cust_id,order_num FROM orders WHERE order_date='2005-09-01';

order_data数据类型为datatime,检索出订单中“2005-09-01”,但是如果订单中这一列包含日期和时间,“2005-09-01 11:30:05”,则该条件会检索失败

解决的办法是:仅将给出的日期与列中的日期部分进行比较,而不是将给出的日期与整个列值进行比较,此时用到Date(order_date)指示提取列的日期部分:

SELECT cust_id,order_num FROM orders WHERE Date(order_date)BETWEEN '2005-09-01' AND '2005-09-30';

可以匹配到从一个日期范围。

 数值处理函数

e54fef5ccf0b48bf8ba2c7be568a839a.png

汇总数据

聚集函数:

运行在行组上,计算和返回单个值的函数。

检索数据,以便分析和报表生成。

  • 确定表中的函数(或满足某个条件或包含某个特定值的行数)
  • 获得表中行组的和
  • 找出表列(或所有行或特定的行)的最大值、最小值和平均值

5d04cd7aafba40209507ed341c5a5604.png

AVG()函数

AVG()函数通过对表中行数奇数并计算特定列值之和,求得改列的平均值,也可以用来返回特定列或行的平均值。

SELECT AVG(prod_price) AS avg_price FROM products;

返回值是avg_price,包含products表中的所有产品的平均价格。(avg_price是一个别名)

SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id=1003;

返回特定类的平均价格。

  • AVG()只能用来确定单个列的平均值,列名不想作为函数参数给出,为了获得多个列的平均值,不行使用多个AVG()函数。
  • AVG()函数忽略列值为NULL的行 。

COUNT()函数

COUNT函数进行计数,两种使用方式:

  • 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是不是空值(NULL)

SELECT COUNT(*) AS num_cust FROM customers;

对所有行进行计数,不管列中有什么值

  • 使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值 

SELCT COUNT(cust_email) AS num_cust FROM customers;

对cust_email列中有值的所有行进行计数(不包括NULL)

MAX()函数

MAX()返回指定列中的最大值,MAX()要求指定列名。

SLECT MAX(prod_price) AS max_price FROM products;

对非数值数字使用MAX() ,一般用来找到最大的数值或日期值

用在文本数据时,如果数据按相应的列排序,则MAX()返回最后一行

MIN()函数

MIN()返回指定列中的最小值,要求列名

使用方法与MAX()函数相似

SUM()函数

SUM() 函数用来返回指定列值的和

SELECT SUM(quantity) AS items_ordered FROM orderitems WHERE orderitems WHERE order_num=20005;

返回订单中所有order_num=200005的物品数量之和

 可以在多个列中进行计算,进行计算时忽略NULL的行。

聚焦不同值

以上的聚集函数都可以使用:

  • 对所有的行执行计算,指定ALL参数或不给参数(因为ALL是默认行为)
  • 只包含不同的值,指定DISTINCT参数

SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id=1003;

返回的是特定供应商提供的产品的平均价格(平均值只考虑各个不同的价格)

注意:

  • DISTINCT必须使用列名,不能用于计算或表达式。
  • 将DISTINCT用于MIN()和MAX()没有价值。

组合聚集函数

SELECT COUNT(*) AS num_items,

                                MIN(prod_price) AS price_min,

                                MAX(prod_price)AS price_max,

                                AVG(prod_price)AS price_avg

FROM products;

用单条SELECT语句执行了四个聚集计算,返回四个值。

分组数据

创建分组

SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id;

注意:

  • GROUP BY子句可以包含任意数目的列,使得能对分组进行嵌套,为数据分组提供更细致的控制
  • 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总,(建立分组时,指定的所有列都一起计算,不能从个别的列取数据)
  • GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(不能是聚集函数),如果在SELECT中使用表达式,必须在GROUP BY子句中指定相同的表达式,不能使用别名
  • 出聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出
  • 如果分组列中具有NULL值,则NULL作为一个分组返回,如果列中有多行NULL值,他们将分为一组
  • GROUP BY子句不行出现在WHERE子句之后,ORDER BY子句之前

使用ROLLUP关键字,可以得到每个分组以及每个分组汇总级别的值:

SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP  BY vend_id WITH ROLLUP;

过滤分组

除了能用GROUP BY分组数据之外,还允许过滤分组,规定包括哪些分组,排除哪些分组,例如:列出至少两个订单的所有顾客,为得到这种数据,必须基于完整的分组而不是个别的行进行过滤。

WHERE过滤行,而HAVING过滤分组

SELECT cust_id,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >=2;

分组后添加了HAVING子句,过滤了COUNT(*)>=2的那些分组

注意:

WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

分组和排序

GROUP BY和ORDER BY是非常不同的:

ae3d0f22410c470d826cd0cd12548110.png

 一般在使用GROUP BY子句时,应该也给出ORDER BY子句,这是保证正确排序的唯一方法。

SELECT子句的顺序

76ba6ed8dc984a09862d0a44ce1c5134.png

7598317e037e44b8b48740bf0cd2a103.png

使用子查询

以下两条语句可以合并为一句:

SELECT order_num FROM orderitems WHERE prod_id='TNT2';

用查询到结果:20005,20007

SELECT cust_id FROM orders WHERE order_num IN (20005,20007);

 

SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2');

在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列。

作为计算字段使用子查询

从customers表中检索客户列表

对于检索出的每个客户,统计其在orders表中的行进行计数,并通过一条WHERE子句来过滤某个特定的客户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;

联结表

相同数据多次出现不是好事,此因素是关系数据库设计的基础,关系表的设计就是要保证把信息分解成多个表,一类数据一个表,,各表通过某些常用的值(关系)互相关联。

例子:products表只存储产品信息,它除了存储供应商ID(vendors表的主键)外不存储其他供应商信息,vendors表的主键有叫做products的外键,将vendors表语products表关联,可以用供应商ID从vendors表中找出相应供应商的详细信息。

外键:是某个表的一列,包含另一个表的主键值,定义了两个表之间的关系:

好处: 

  • 供应商信息不重复,不浪费时间空间
  • 如果供应商信息变动,可以只更新一个表中的记录

SELECT vend_name,prod_name,prod_price 
FROM vendors,products 
WHERE vendors.vend_id=products.vend_id 
ORDER BY vend_name,prod_name;

完全限定列名:用一个点分隔的表名和列名

WHERE子句的重要性:在联结两个表时,要将第一个表中的每一行与第二个表的每一行配对,WHERE子句作为过滤条件,它只包含哪些匹配给定条件的行。
没有WHERE子句,第一个表中的每个行将与第二个表中的每个行配对,而不管逻辑上是否可以配在一起。

内部联结

两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定,在使用这种语法时联结条件用特定的ON子句而不是WHERE子句给出,传递给ON的实际条件与传递给WHERE的相同

SELECT vend_name,prod_name,prod_price 
FROM vendors 
INNER JOIN products ON vendors.vend_id=products.vend_id;

联结多个表

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

 

SELECT cust_name,cust_contact 
FROM customers,orders,orderitems 
WHERE customers.cust_id=orders.cust_id 
AND orderitems.order_num=orders.order_num 
AND prod_id='TNT2;

创建高级联结

使用表别名
SLECT Concat(RTrim(vend_name),'(',RTrim(vend_countru),')') AS vend_title 
FROM vendors 
ORDER BY vend_name;

别名除了用于列名和计算字段外,SQL还要允许给表起别名:缩短SQL语句、运行在单条SELECT语句中多次使用相同的表

SELECT cust_name,cust_contact 
FROM customers AS c,orders AS o,orderitems AS oi 
WHERE c.cust_id=cust_id 
AND oi.order_num=o.order_num 
AND prod_id='TNT2';

FROM子句中3个表全都具有别名,表别名值用于WHERE子句,但是表别名不仅挪用于WHERE子句,还可以用于szelect的列表,ORDER BY子句已经其他部分。

使用不同类型的联结:自联结,自然联结和外部联结

自联结:

如果一个商品存在问题,想知道生产该物品的供应商生成的其他物品是否也存在这些问题,此查询要求首先找到生成I为DTNTR的物品的供应商,然后找到该供应商生产的其他物品。

子查询的方法:

SELECT prod_id,prid_name 
FROM products 
WHERE vend_id=(SELECT vend_id FROM products WHERE prod_id='DTNTR');

 

自联结:

SELECT p1.prod_id,p1.prod_name 
FROM products AS p1,products AS p2 WHERE p1.vend_id =p2.vend_id AND p2.prod_id='DTNTR';

此查询中需要的两个表实际上是相同的表,因此products表在FROM子句中出现了两次。但对于products的引用具有二义性。为了解决该问题,使用了表别名。

使用自联结而不用子查询,有时候处理联结远比处理子查询快得多。 

自然联结:

无论何时对表进行连接,应该至少有一个列出现在不止一个表中(被连接的列)。标准的联结(内部联结)返回所有数据,甚至相同的列会多次出现。

自然联结排除多次出现,使每个列只返回一次。

SELECT c.*,o.order_date,oi.prod_id,oi.quantity,OI.item_price

FROM customers AS c,orders AS o,orderitems AS oi 

WHERE c.cust_id=o.cust_id

AND oi.order_num=o.order_num

AND prod_id='FB';

通配符只对第一个表使用,所有其他列明确列出,所以没有重复的列被检索出来

外部联结:

很多连接将一个表中的行与另一个表中的行相关联,但有时候会需要包含没有关联行的那些行。

  • 对每个客户下了多少订单进行计数,包括尚未下单的客户
  • 列出所有产品以及订购数量,包括没有人订购的产品
  • 计算平均销售规模,包括至今尚未下单的客户

内部联结:

SELECT customers.cust_id,orders.order_num

FROM customers INNER JOIN orders ON customers.cust_id=orders.cust_id;

 

外部联结:

SELECT customers.cust_id,orders.order_num

FROM customers LEFT OUTER JOIN orders ON customers.cust_id=orders ON customers.cust_id=orders.cust_id;

使用了OUTER JOIN来指定联结类型(而不是在WHERE子句中指定),在使用OUTER JOIN语法时,必须使用RIGHT或LRFT关键字指定包括其所有行的表(RIGHT支持的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)

上面的例子使用LEFT OUTER JOIN从FROM子句左边表(customers表)中选择所有行。为了从右边的表中选择所有行,应该使用RIGHT OUTER JOIN。

使用带聚集函数的联结

SELECT customers.cust_name,

customers.cust_id,

COUNT(orders.order_num) AS num_ord

FROM customers INNER JOIN orders ON customers.cust_id=orders.cust_id GROUP BY customers.cust_id;

使用左外部联结来包含所有客户,甚至包含哪些没有任何下订单的客户,结果显示也包含了有零个订单的客户。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/599915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2023最叼教程】Appium自动化环境搭建保姆级教程

APP自动化测试运行环境比较复杂,稍微不注意安装就会失败。我见过不少朋友,装了1个星期,Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作,但是 Appium 安装过程中确实存在不少隐藏的比较深的坑,如果…

编程(38)----------计算机的部分原理

本篇主要总结一些计算机的理论部分. 计算机在发展历程中,无论是最早的巨无霸机器,还是现在小到可以拿在手中的掌机.只要其本质上是计算机,在最基础的结构上,都是以冯诺依曼体系所构建的. 冯诺依曼体系大致将计算机分为几个最重要的部分:输入,输出,中央处理器,存储设备.也就是…

Meta Quest 3发布:超越虚拟现实全新境界

2023年6月2日凌晨,全球领先的虚拟现实技术公司Meta隆重推出了Meta Quest 3无线头戴式显示器。这款全新设计的头戴设备从内到外焕然一新,为用户提供了全方位的体验。 借助全新一代骁龙芯片,Meta Quest 3拥有比Quest 2更高两倍的GPU处理能力&am…

VanillaNet详解:极简的网络模型

VanillaNet详解:极简的网络模型 0. 引言1. 网络结构2. 如何提高简单网络的非线性2.1 深度训练策略2.2 基于级数启发的激活函数3. 实验4. 代码解析总结 0. 引言 深度学习模型架构越复杂越好吗? 自过去的几十年里,人工神经网络取得了显著的进…

chatgpt赋能python:Python在硬件开发中的作用

Python在硬件开发中的作用 随着物联网的快速发展,越来越多的硬件设备需要与互联网连接。Python在硬件开发过程中扮演着重要的角色。 Python的优势 作为一种高级编程语言,Python有以下几个优势: 简单易学:Python的语法简洁清晰…

chatgpt赋能python:Python做网页可以直接访问吗?

Python做网页可以直接访问吗? Python作为一门功能强大的编程语言,近年来在Web开发中也越来越受欢迎。很多人或企业都采用Python来开发网站和网页,那么问题来了,Python做的网页能否直接被搜索引擎访问和索引呢? Pytho…

MySQL5-事务隔离级别和锁机制

❤️ 个人主页:程序员句号 🚀 支持水滴:点赞👍 收藏⭐ 留言💬关注 🌸 订阅专栏:MySQL性能调优 原创博文、基础知识点讲解、有一定指导意义的中高级实践文章。 认真或有趣的技术分享。 该专栏陆…

【数据结构】数据结构与算法基础 课程笔记 第七章 查找

🚀Write In Front🚀 📝个人主页:令夏二十三 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:【数据结构】 💬总结:希望你看完之后,…

Emacs之解决gtags -i --single-update占用率100%卡死问题(一百零六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

python --自动化测试UiAutomator2

安装adb 安装adb后使用命令 adb devices 出现下图即可; 安装python依赖(uiautomator2,weditor) pip install uiautomator22.16.23 weditor0.6.8 -i https://pypi.doubanio.com/simple# 在手机上安装 atx-agent 应用 # 安装apk服务到手机上 python -m uiautomator2 init脚本…

基于 Docker 部署 Mysql8.0.27_单机_主从复制

文章目录 单机部署集群部署master 部署slave 部署错误记录 单机部署 通过 dockerhub 或 docker search 查找镜像。拉取 mysql 镜像。 docker pull mysql:8.0.27创建挂载目录,并赋予权限。 mkdir -p /var/docker_data/mysql/data mkdir -p /var/docker_data/mysql/co…

一些关于c++的琐碎知识点

目录 bool强转 const构成重载:const修饰*p 移动构造 new int (10)所做的四件事 this指针---为什么函数里面需要this指针? .和->的区别 new创建对象 仿函数 new和malloc的区别 c系统自动给出的函数有 delete和delete[ ]区别何在 检查有没有析构函数 e…

六一,用前端做个小游戏回味童年

#【六一】让代码创造童话,共建快乐世界# 文章目录 📋前言🎯简简单单的弹球游戏🎯代码实现📝最后 📋前言 六一儿童节。这是属于孩子们的节日,也是属于我们大人的节日(过期儿童&…

chatgpt赋能python:**Python免费编辑器:提高开发效率和便捷性**

Python 免费编辑器:提高开发效率和便捷性 Python 编程语言已经成为了越来越多开发者的首选。这是因为 Python 语言非常直观易懂,同时也拥有庞大的第三方开源库,方便开发人员快速实现项目功能。Python 编程之所以如此受欢迎,除了这…

Java基础编程

Java入门 1. JDK的安装目录介绍 目录名称说明bin该路径下存放了JDK的各种工具命令。javac和java就放在这个目录。conf该路径下存放了JDK的相关配置文件。include该路径下存放了一些平台特定的头文件。jmods该路径下存放了JDK的各种模块。legal该路径下存放了JDK各模块的授权文…

使用kettle进行数据统计

1.使用kettle设计一个能生成100个取值范围为0到100随机整数的转换。 为了完成该转换,需要使用生成记录控件、生成随机数控件、计算器控件及字段选择控件。控件布局如下图所示 生成记录控件可以在限制框内指定生成记录的个数,具体配置如图所示 生成随机数…

chatgpt赋能python:Python免费教学:让编程更便捷

Python免费教学:让编程更便捷 Python是一门广泛应用于机器学习、数据分析、网络编程和自动化测试等领域的高级编程语言。随着人工智能和大数据分析的兴起,Python的应用广泛受到了各个行业的欢迎,越来越多的人开始学习Python。在这篇文章中&a…

STM32之任务的创建与删除

目录 1. 什么是任务? 2. 任务创建与删除相关函数 任务动态创建与静态创建的区别: xTaskCreate 函数原型 官方案例: vTaskDelete 函数原型 3. 实操 1. 什么是任务? 任务可以理解为进程 / 线程,创建一个任务&#…

【生物力学】《人体骨肌系统生物力学》- 王成焘老师 - 第2章 - 人体几何学测量与仿真建模

第1章回到目录第3章 文章目录 2.1 概论2.2 人体几何学测量2.2.1 人体外部几何形态2.2.2 人体尺寸测量与统计处理2.2.3 中国人体尺寸标准统计测量数据2.2.4 人体各部位比例及人体间尺寸换算2.2.5 人体活动范围测量 2.3 人体骨肌系统三维几何建模的数据来源2.3.1 冷冻切片数字摄像…

“微商城”项目(2准备工作)

一.安装Node.js 本项目使用Vue.js前端框架进行开发,在创建项目之前需要先下载Node.js环境。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它可以让JavaScript运行在服务器端。接下来对Node.js的下载和安装进行详细讲解。 打开Node.js官方网站&a…