MySQL(五):子查询与连接与比较运算符

模拟实验

将以下命令复制进MySQL:

-- 创建数据表

  CREATE TABLE IF NOT EXISTS tdb_goods(
    goods_id    SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    goods_name  VARCHAR(150) NOT NULL,
    goods_cate  VARCHAR(40)  NOT NULL,
    brand_name  VARCHAR(40)  NOT NULL,
    goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,
    is_show     BOOLEAN NOT NULL DEFAULT 1,
    is_saleoff  BOOLEAN NOT NULL DEFAULT 0
  );

 -- 写入记录

 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Y400N 14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('G150TH 15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X550CC 15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X240(20ALA0EYCD) 12.5英寸超极本','超极本','联想','4999',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('U330P 13.3英寸超极本','超极本','联想','4299',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('SVP13226SCB 13.3英寸触控超极本','超极本','索尼','7999',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad mini MD531CH/A 7.9英寸平板电脑','平板电脑','苹果','1998',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版)','平板电脑','苹果','3388',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版)','平板电脑','苹果','2788',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('IdeaCentre C340 20英寸一体电脑 ','台式机','联想','3499',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Vostro 3800-R1206 台式电脑','台式机','戴尔','2899',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iMac ME086CH/A 21.5英寸一体电脑','台式机','苹果','9188',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux )','台式机','宏碁','3699',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Z220SFF F4F06PA工作站','服务器/工作站','惠普','4288',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('PowerEdge T110 II服务器','服务器/工作站','戴尔','5388',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A 专业级台式电脑','服务器/工作站','苹果','28888',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);

 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);

 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4机架式服务器 2583i14','服务器/工作站','IBM','6888',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('玄龙精英版 笔记本散热器','笔记本配件','九州风神','39',DEFAULT,DEFAULT);

 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);

 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);
 

子查询

子查询的定义:

MySQL(五):子查询与连接与比较运算符_第1张图片

MySQL(五):子查询与连接与比较运算符_第2张图片

增删改查都可以带有子查询。

子查询返回的值会被外部查询语句使用。

查询分类为超极本的商品的价格

再查询价格大于超极本的商品有哪些

这里使用了子查询,但是子查询返回的结果超过一条,所以出现了错误。

如果子查询返回多个结果可以使用比较运算符来对返回结果做处理

 

MySQL(五):子查询与连接与比较运算符_第3张图片

ANY与SOME为符合其中一条就

ALL为必须符合所有返回值

关键字与运算符搭配使用产生的效果

MySQL(五):子查询与连接与比较运算符_第4张图片

其实很好理解,没必要死记,推导一下就可以。

使用例子

大于所有值,也就是不单要大于最小值,也要大于最大值,可以直接理解为,必须大于最大值。

NOT IN 与 != ALL相同

MySQL(五):子查询与连接与比较运算符_第5张图片

!=ALL 结果

NOT IN 结果

 

使用[NOT] EXISTS的子查询

这个关键词不怎么常用

如果子查询返回了非空结果,则返回true 否则返回false,一般用于检查子查询情况。



NOT EXISTS 主要作用是检查某个数据是否存在。

创建一个商品分类表。

比如下面这个创建表的语句中,IF NOT EXISTS 的作用为 检查是否有该名称的表存在。

查询型插入

先查看表的结构

MySQL(五):子查询与连接与比较运算符_第6张图片

插入查询结果

MySQL(五):子查询与连接与比较运算符_第7张图片

语句使用句式:INSERT 表名(列名) SELECT 列名 FROM 表名 GROUP BY 列名;

目前并没有使用外键功能,现在给商品分类表与商品表增加外键关联

将商品分类表设置为父表,商品表为子表。

多表更新

MySQL(五):子查询与连接与比较运算符_第8张图片

使用句式:UPDATE 表的参照关系 SET 列名1={ 表达式 | 值 }列名2...,列名3... WHERE 条件

表的参照关系使用说明:

MySQL(五):子查询与连接与比较运算符_第9张图片

其实上图简化为这样更好理解:

表1  连接类型  表2   更新条件     更新的值

 

 

连接类型

连接类型这里仅介绍有哪几种,后边会再讲每种连接的不同之处。

MySQL(五):子查询与连接与比较运算符_第10张图片

现在以商品表和商品分类表为例子

MySQL(五):子查询与连接与比较运算符_第11张图片

 

命令:MySQL(五):子查询与连接与比较运算符_第12张图片

命令作用: 连接商品表与商品分类表,如果商品表中的商品类型商品分类表中的商品分类名相同,则将商品分类表中的id列的值赋值给商品表中的分类列

命令解析:UPDATE 表1 连接类型  表2  ON  表达式(连接条件 / 更新条件)  SET 更新的值  

MySQL(五):子查询与连接与比较运算符_第13张图片

可以简单理解为先连接表1与表2 ,如果表1中某列的值    与    表2中某列    的值相等,则更新数据。

MySQL(五):子查询与连接与比较运算符_第14张图片

查看修改结果是否符合要求:

MySQL(五):子查询与连接与比较运算符_第15张图片

再用同一个命令建立商品表与品牌表的连接,先查询一下商品表中有哪些品牌

MySQL(五):子查询与连接与比较运算符_第16张图片

使用插入查询语句来建立品牌表:

SELECT brand_name FROM tdb_goods GROUP BY brand_name;

  CREATE TABLE tdb_goods_brands (

    brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

    brand_name VARCHAR(40) NOT NULL;

查看一下,建立完成!

MySQL(五):子查询与连接与比较运算符_第17张图片

然后再进行内连接(AS 为别名,前面写过,或直接使用表名.列名也可以)

但这时候商品表中的品牌列和分类列数据类型依旧是文本,做数据库要尽量减少数据占用的空间

所以要将其修改为数值类型,同时修改一下列名

MySQL(五):子查询与连接与比较运算符_第18张图片

内连接的缺陷:

我们再给品牌表和分类表再添加几个数据

分类表:

品牌表:

再分别查看一下分类表和品牌表:

品牌表:                                                                                    分类表:

   MySQL(五):子查询与连接与比较运算符_第19张图片                               MySQL(五):子查询与连接与比较运算符_第20张图片

再到商品表中随便插入一条数据:

插入成功,但是一般来说不应该插入成功的:

第一个是商品名。第二个是分类ID  ,第三个是品牌ID,品牌ID目前最高只有13,第四个是价格,插入商品表的第二个数据却填12,可是分类ID最高只有10,问题就在这,说明这种连接是不检查插入的数据是否正确。

另一个问题,我们的记录查找出来呈现给浏览者看时,应该让浏览者更好理解。

这时需要几张表来一起协作,用连接来实现。

MySQL在查询,多表更新,多表删除中都支持join操作

多表删除将UPDATE改为DELETE就可以

连接条件,当使用UPDATE时可以理解为更新条件,DELETE时为删除条件。

 

讲一下连接类型

内连接:JNNER JOIN                            JOIN  ,  CROSS  JOIN  与 INNER JOIN 是等价的
左外连接:LEFT[OUTER] JOIN
右外连接:RIGHT [OUTER]  JOIN

内连接:

MySQL(五):子查询与连接与比较运算符_第21张图片

内连接主要作用为求两张表的交集。

例子:利用内连接查询两个表中相同的数据

MySQL(五):子查询与连接与比较运算符_第22张图片

总共有23条记录,这里只查询出22条,有一条没显示出来是因为tdb_goods中的cate_id是随意填的,所以不相等,不符合条件。

左外连接:

MySQL(五):子查询与连接与比较运算符_第23张图片

例子:利用左外连接查询两个表中的左表全部数据以及右表部分符合条件的数据

MySQL(五):子查询与连接与比较运算符_第24张图片

注意图中的右下角商品分类名中为空,因为第23条在左表(商品表)中填写的cate_id为12,但在右表(商品分类表)中并没有相应的id,所以为空。

右外连接:RIGHT [OUTER]  JOIN

MySQL(五):子查询与连接与比较运算符_第25张图片

 

例子:利用右外连接查询两个表中的右表全部数据以及左表部分符合条件的数据

MySQL(五):子查询与连接与比较运算符_第26张图片

之所以为空是因为,虽然在右表(商品分类表)中已有该分类: cate_id,但在左表(商品表)中并没有对应的商品:cate_id,所以为空。

再看一次(左表)商品表与(右表)商品分类表。

MySQL(五):子查询与连接与比较运算符_第27张图片

MySQL(五):子查询与连接与比较运算符_第28张图片

使用最多的还是内连接。

 

多表连接

例子:使用内连接进行多表查询

MySQL(五):子查询与连接与比较运算符_第29张图片

外连接的一些说明

MySQL(五):子查询与连接与比较运算符_第30张图片

 

MySQL(五):子查询与连接与比较运算符_第31张图片

上图有错字,找到符合连接条件的记录后

 

无限分类设计表:

理论上可以设计无限的表,但实际上不可能无限设置表。

看图,让表中的字段互相产生联系:

MySQL(五):子查询与连接与比较运算符_第32张图片

parent_id翻译为父类_id。

家用电器电脑、办公顶级分类所以parent_id为0,大家电生活电器的父类为家用电器所以parent_id为1,下面的以此类推。

但是如果要做查找,就必须得让它们在数据库里产生联系,这时可以用自身连接来实现。

连接后的效果

MySQL(五):子查询与连接与比较运算符_第33张图片

连接语句:SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p   ON s.parent_id = p.type_id;

 

首先连接句子和普通的左连接一样先决定好显示的字段名称:类型_编号   子类型_名字   父类型_名字,

然后选定左表(s代表子表,p代表父表),再选定右表,

再写筛选条件,

可以发现语句中对同一个表分别起了两次别名,也就是,左表和右表可以为同一个表,但调用时需要不同的表名。

以上为子表参照父表,父表参照子表是一样的,改一下AS就行。

 

如果要只显示一个父类,则在ON 条件后面加GROUP BY p.type_id 以下为结果:

如果要再让结果按照id排序,继续在ON 条件后面加ORDER BY  s.type_id  以下为结果:

MySQL(五):子查询与连接与比较运算符_第34张图片

统计子类的出现次数 在SELECT 后加上count函数   如 count (p.type_name.) 以下为结果:

MySQL(五):子查询与连接与比较运算符_第35张图片

其实这些链接说简单点,只是条件查询。

 

 

过滤查询,也就是条件查询

按照条件对查询结果做过滤

 

MySQL(五):子查询与连接与比较运算符_第36张图片

 

条件中使用的比较运算符:

 

MySQL(五):子查询与连接与比较运算符_第37张图片

区分值的大小写:在WHERE后面加 BINARY

字符串和日期类型要用单引号括起来!!

查询语句的执行先后:

MySQL(五):子查询与连接与比较运算符_第38张图片

逻辑运算符:

MySQL(五):子查询与连接与比较运算符_第39张图片

使用方法在条件之间用运算符隔开

使用括号中的符号也可以运行命令,写过java的应该会喜欢的

取反值有两种方法,例子:不等于40的值的命令

命令1:x!=40    命令2: NOT X=40;

运算符的优先级:

MySQL(五):子查询与连接与比较运算符_第40张图片

特殊运算符:

1.LEAST运算符 
语法格式为:LEAST(值 1,值 2, …值n),返回其中值最小的一个

2.GREATEST运算符 
语法格式为:GREATEST(值 1,值 2, …值n),返回其中值最大的一个(任意个NULL,返回NULL)

语句  LIKE(用于模糊查询)

就这样了~一个实例都没写会不会很不厚道..

你可能感兴趣的:(MySQL,MySQL(慕课))