MySQL -- 表联结
创建联结:(使用WHERE联结)SELECTvend_name,prod_name,prod_priceFROMvendors,productsWHEREvendors.vend_id=products.vend_idORDERBYvend_name,prod_name;(保证所有联结都有WHERE子句,不然查询到的结果是两个表的笛卡
联结:
一种机制,用来在一条SELECT语句中关联表,因此称之为联结。它在数据库中不存在。联结由MySQL根据需要建立,它存在于查询的执行过程中。
创建联结:(使用WHERE联结)
SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;
(保证所有联结都有WHERE子句,不然查询到的结果是两个表的笛卡尔积(第一个表的行乘以第二个表的行))
(使用INNER JOIN ... ON ...联结)
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;
MySQL可以联结多个表,但是联结处理有可能非常耗费资源,因此不要联结不必要的表,联结的表越多,性能下降越厉害。
使用表的别名:别名除了可以用于列名和计算字段外还可以用于给表起别名。例如:
SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = 0.order_num
AND prod_id = 'TNT2';
表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户机。
自联结:在一张表内部使用联结,自联结比子查询要快。例如完成如下功能:查询商品ID为DTNTR的供应商生产的其他商品。
子查询方式:
SELECT prod_id, prod_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';
这里的自联结使用了表的别名,看起来有点赘余,实际上这里的别名是必须要用的,倒不全是因为看起来清晰,更重要的是不让所写的SQL语句产生二义性,所有的计算机技术中最忌讳的东西就是二义性。如果这里使用了表的名字而没有使用别名的话SQL在解释的时候就无法确定到底哪个products语句对应的是哪个products实例化对象。
自然联结:无论什么时候进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结返回所有的数据,甚至相同的列多次出现。自然联结排除多次出现,每个列只返回一次。
外联结:外部联结并不要求联结的两个表的每一条记录在对方表中都有一条匹配的记录(甚至这条记录没有匹配的记录也要保留)
如下SQL语句查询所有客户及其订单:
SELECT customers.cust_id, orders.order_num
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id
(返回的结果中没有NULL的值)
如下SQL语句查询所有的客户及其订单(包含NULL的列):
SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customer.cust_id = orders.cust_id
(返回的结果中包含NULL的值)
外联结的语法和内联结的语法很像,只是将INNER JOIN换成了[LEFT,RIGHT]OUTER JOIN。LEFT代表从左边的表中选择所有行,RIGHT表示从右边的表中选择所有行,在MySQL中外联结必须在OUTER JOIN之前使用LIFT或者RIGHT。(注意:MySQL不支持全外联结[左外来凝结和右外联结的并集],但是可以通过左右外联结的病机来模拟实现。)左外联结和右外联结可以通过颠倒FROM和WHERE子句中表的顺序相互转换,两种类型的外部联结究竟使用哪一种纯粹是根据方便而定。
带聚集函数的联结:聚集函数是用来汇总数据的,也可以和联结一起使用。比如现在要查询所有客户及每个客户所下的订单数,使用联结和COUNT()函数就可以完成此项任务。
SELECT customers.cust_id, custormers.cust_name, COUNT(orders.order_num) AS order_count
FROM custormer INNER JOIN orders
ON custormer.cust_id = orders.cust_id
GROUP BY custormer.cust_id;
上述SQL语句中的customers.cust_id中的customers不能省略,如果省略则会产生二义性。
SELECT customer.cust_name, customers.cust_id, COUNT(orders.order_num) AS order_count
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;
使用联结和联结条件1、注意所使用的联结类型。一般我们使用内部联结,但使用外部联结也是有效的。
2、保证使用正确的联结条件,否则将返回不正确的数据。
3、应该总是提供联结条件,否则会得出笛卡尔积。
4、在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做合法,一般也很有用,但应该在一起测试他们前,分别测试每个联结。这将使故障排除更为简单。
组合查询:MySQL允许执行多个查询,并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询。使用组合查询的两个基本情况是:
1、在单个查询中从不同的表返回类似结构的数据。
2、对单个表执行多个查询,按单个查询返回数据。
任何具有多个WHERE子句的单条查询完成的工作与具有多个WHERE子句的SELECT语句都可以作为一个组合查询给出。
组合查询的重复行:组合查询的默认行为是自动从结果集中去除重复行,如果想要返回所有的行则可以使用UNION ALL。对组合查询的结果排序:在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后,对于结果集,不存在用一种方式排序一部分,而又使用另一种方式排序另一部分。因此不允许使用多条ORDER BY子句。
全文本搜索:MySQL支持集中几本的数据库引擎。并非所有的引擎都支持全文本搜索。两个最为常见的引擎为MyISAM和InnoDB,前者支持全文本搜索,而后者不支持。
为了使用全文本搜索必须索引被搜索的列,而且要随着数据的改变不断地对表进行适当的设计后,MySQL会自动进行所有的索引和重新索引。在索引之后,SELECT可与Match()和Against()一起使用以实际执行搜索。
进行全文本搜索:在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()制定被搜索的列,Against()制定要使用的搜索表达式。例如:
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');
传递给Match的值必须与FULLTEXT中的值相同,如果有多个值则必须按照正确次序列出来。
全文本搜索的重要部分就是对结果进行排序。具有较高等级的行先返回(因为这些行很可能是你真正想要的行)。因为数据时索引的,所以全文搜索是相当快的。
布尔全文搜索:MySQL支持全文搜索的另外一种形式,称为布尔方式。以布尔方式,可以提供如下内容的细节:
1、要匹配的词
2、要排斥的词
3、排列提示
4、表达式分组
5、另外一些内容。
布尔方式不同于迄今为止使用的全文搜索语法的地方在于,即使没有定义FULLTEXT索引,也可以使用它,但这是一种非常缓慢的操作(其性能将随着数据量的增加而降低)。
全文本布尔操作符:MySQL学习笔记----子查询、联结表、组合查询、全文本搜索_MySQL
在布尔方式中,不按等级值降序排序返回的行。全文本搜索的使用说明:1、在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数字可以更改)。
2、MySQL带有一个内建的非用词列表,这些词在索引全文数据时总是被忽略。如果需要,可以覆盖这个表。
3、许多词出现的频率很高,搜索它们没有用处(返回太多结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用与IN BOOLEAN MODE。
4、如果表中的行数少于3行,则全文本搜索则不返回结果(因为每个词或者出现或者不出现,或者至少出现在50%的行中)。
5、忽略词中的单引号。
6、不具有词分隔符的语言不能恰当地返回全文本搜索结果。
7、如前所述,仅在MyISAM数据库引擎中支持全文搜索。
MySQL -- 表联结的更多相关文章
- mysql 表联结,内部联结
mysql> select * from user; +------+----------+-----------+ | id | name | address | +------+------ ...
- MySQL的联结(Join)语法
MySQL的联结(Join)语法 1.内联结.外联结.左联结.右联结的含义及区别: 在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如 ...
- MySQL表的四种分区类型
MySQL表的四种分区类型 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...
- MySQL表名和数据库关键字相同解决办法
今天改他们的代码的时候,遇到了MySQL表名和数据库关键字的问题. 由于表名是关键字,导致增删改查都报错. Hibernate: select leave0_.id as id22_, leave0_ ...
- MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- 清除mysql表中数据
delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内 ...
- Python将MySQL表数据写入excel
背景:将mysql表查询结果写入excel. 1.使用sqlyog工具将查询结果导出到Excel.xml中,用excel打开发现:因为text字段中有回车换行操作,显示结果行是乱的. 2.用mysql ...
- mysql表名忽略大小写问题记录
问题描述:一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下: mysql> show tables; +--- ...
- 查看mysql表结构和表创建语句的方法(转)
查看mysql表结构的方法有三种:1.desc tablename;例如:要查看jos_modules表结构的命令:desc jos_modules;查看结果:mysql> desc jos_m ...
随机推荐
- YOLOv4没交棒,但YOLOv5来了!
YOLOv4没交棒,但YOLOv5来了! 前言 4月24日,YOLOv4来了! 5月30日,"YOLOv5"来了! 这里的 "YOLOv5" 是带有引号的,因为 ...
- 编写HSA内核
编写HSA内核 介绍 HSA提供类似于OpenCL的执行模型.指令由一组硬件线程并行执行.在某种程度上,这类似于 单指令多数据(SIMD)模型,但具有这样的便利:细粒度调度对于程序员而言是隐藏的,而不 ...
- Fine-Tuning微调原理
Fine-Tuning微调原理 如何在只有60000张图片的Fashion-MNIST训练数据集中训练模型.ImageNet,这是学术界使用最广泛的大型图像数据集,它拥有1000多万幅图像和1000多 ...
- Vue项目开发环境搭建
初步学习vue.js相关知识,下面是我搭建环境中一些经验总结,希望可以帮到有需要的同学.首选先安装好以下的工具和环境. 一.软件安装 1.WebStorm官网下载地址:https://www.jetb ...
- springmvc——CharacterEncodingFilter过滤器要放在所有过滤器前面
CharacterEncodingFilter的拦截顺序必须是第一个,否则还是会出现乱码问题.这是因为 request对象的parameter并不是一开始就解析的,它是等你第一次调用getParame ...
- docker 自定义部署Springboot——依赖与代码分离部署
第一步:执行mvn package 命令打出jar包,然后解压jar包,把lib放到服务器合适的目录下面 第二步:打出不带jar包的SpringBoot工程 首先配置pom.xml文件 <bui ...
- 题解 P3233 [HNOI2014]世界树
题目传送门 解题思路 正解当然是虚树了. 首先对于原树以及虚树各开一个结构体存边,这个不用多说. 然后我们先 DFS 一遍,求出各个节点的时间戳,子树大小,深度以及父亲节点,并初始化倍增 LCA . ...
- NOIP模拟测试8「寿司」
考试时打的类似$n^2$暴力,然后炸了只有10分 后来验证我的算法伪了. 题解 显然你有一种解法,假设你要在一个B点断开将R分别移向最左 最右,这样只用分别计算B点右面蓝色数量左面蓝色数量就得到了一个 ...
- WEB安全新玩法 [3] 防护交易数据篡改
在任何涉及交易的系统中,客户与商家之间的交易数据具有核心作用,如购买商品的价格.数量.型号和优惠券等.在客户挑选商品的过程中,这些交易数据逐渐形成:待客户提交订单时,交易数据被商家接收,形成双方认可的 ...
- 通过Cloudflare API进行CDN刷新
1.Cloudflare CDN刷新说明 1.Cloudfalre同Akamai一样,只有刷新,没有预热的概念. 2.通过Cloudflare API进行刷新,需要用到登录用户的[邮箱][api密钥] ...