二、连接查询,子查询,组合查询

连接查询:将两个或者两个以上的表按照某个条件连接起来,从中选取需要的数据

建表语句及测试数据:

CREATE TABLE `t_book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bookName` varchar(20) DEFAULT NULL,
  `price` decimal(6,2) DEFAULT NULL,
  `author` varchar(20) DEFAULT NULL,
  `bookTypeId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

insert  into `t_book`(`id`,`bookName`,`price`,`author`,`bookTypeId`) values

(1,'Java编程思想','100.00','埃史尔',1),

(2,'Java从入门到精通','80.00','李钟尉',1),

(3,'三剑客','70.00','大仲马',2),

(4,'生理学(第二版)','24.00','刘先国',4);

 

CREATE TABLE `t_booktype` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bookTypeName` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

insert  into `t_booktype`(`id`,`bookTypeName`) values

(1,'计算机类'),

(2,'文学类'),

(3,'教育类');

1.内连接查询:内连接查询是一种最常用的连接查询,内连接查询可以查询两个或者两个以上的表

  //查询出图书的信息及图书的类别名称:
  
  SELECT * FROM t_book,t_bookType WHERE t_book.bookTypeId = t_booktype.id;
  
  SELECT bookName,author,bookTypeName FROM t_book,t_bookType WHERE t_book.bookTypeId = t_booktype.id;

  SELECT t1.bookName,t1.author,t2.bookTypeName FROM t_book t1,t_bookType t2 WHERE t1.bookTypeId = t2.id;

2.外连接查询:外连接查询可以查出某一张表的所有信息

  SELECT 属性列表 FROM 表名1 LEFT|RIGHT JOIN 表名2 ON 表名1.属性名 =  表名2.属性名
  
  
  左连接查询:
  
  可以查询出表名1的所有记录,而表名2中,只能查询出匹配的记录。(左边表全显示)

  
  SELECT * FROM t_book t1 LEFT JOIN t_booktype t2 ON t1.bookTypeId = t2.id;
  
  
  右连接查询:
   
  可以查询出表名2的所有记录,而表名1中,只能查询出匹配的记录。(右边表全显示)
  

  SELECT * FROM t_book t1 RIGHT JOIN t_booktype t2 ON t1.bookTypeId = t2.id;

多条件查询:
  SELECT bookName,author,bookTypeName FROM t_book,t_bookType                                                                                  WHERE t_book.bookTypeId = t_booktype.id AND t_book.price>70;

子查询:把查询结果作为一个结合作为判断操作

建表语句和测试数据:

CREATE TABLE `t_pricelevel` (
    `id` INT ,
    `priceLevel` INT ,
    `price` FLOAT ,
    `description` VARCHAR (300)
); 
INSERT INTO `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) VALUES('1','1','80.00','价格贵的书');
INSERT INTO `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) VALUES('2','2','60.00','价格适中的书');
INSERT INTO `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) VALUES('3','3','40.00','价格便宜的书');

带IN(NOT IN)关键字的子查询:
一个查询语句的条件可能落在另一个SELECT语句的查询结果中

//查询有图书类别信息的图书(图书的类别id在图书类别表中应该存在)

思路:先写子查询语句查询图书的类别id >>> select id from t_booktype;然后在左边重新写select查询语句,把刚刚查询出来的信息当作条件去查询。

SELECT * FROM t_book WHERE bookTypeId IN (SELECT id FROM t_booktype);

SELECT * FROM t_book WHERE bookTypeId NOT IN (SELECT id FROM t_booktype);

带比较运算符的子查询:
子查询可以使用比较运算符

//查询价格贵的书

思路:最后的查询条件肯定是 price >= “贵的价格” 算贵的书,

所以我们先查出价格 >>>   SELECT price FROM t_pricelevel WHERE priceLevel=1

最后:SELECT * FROM t_book WHERE price >=(SELECT price FROM t_pricelevel WHERE priceLevel=1) 即可

带EXISTS关键字的子查询:
假如子查询查到记录,则进行外层查询,否则,不执行外层查询

//如果t_booktype 为空,就不查t_book,如果t_booktype不为空,就查t_book


SELECT * FROM t_booktype
SELECT * FROM t_book WHERE EXISTS (SELECT * FROM t_booktype)

NOT EXISTS 相反,如果有值就不查外层,如果没有值就查外层

SELECT * FROM t_book WHERE NOT EXISTS (SELECT * FROM t_booktype)

带ANY关键字的子查询:
ANY关键字表示满足其中任意一个条件


//查询图书价格满足价格便宜,适中或贵的任意一项的图书信息


SELECT price FROM t_pricelevel
SELECT * FROM t_book WHERE price>= ANY(SELECT price FROM t_pricelevel)

注意:当子查询的结果是集合时 不能直接>=


带ALL关键字的子查询:
ALL关键字表示满足其中所有条件

//查询图书价格满足价格便宜,适中或贵的三项条件的图书信息:

SELECT * FROM t_book WHERE price >= ALL(SELECT price FROM t_pricelevel)

 

组合查询:

UNION:使用UNION关键字是,数据库系统会将所有的查询结果合并到一起,然后去除相同的记录。


//将图书表Id 和 图书类别表Id 合并到一起:

SELECT id FROM t_book UNION SELECT id FROM t_booktype

 

UNION ALL:使用UNION ALL 不会去除掉系统的记录:

SELECT id FROM t_book UNION ALL SELECT id FROM t_booktype

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值