连接查询:将两个或者两个以上的表按照某个条件连接起来,从中选取需要的数据
建表语句及测试数据:
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