MySQL的子查询、连接查询(内&外)以及分页查询

表和数据

#书本类型表
CREATE TABLE t_book_category(
   cid INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '唯一标识',
   cname VARCHAR(20) NOT NULL COMMENT '书本类型名称'
) COMMENT '书本类型表';

#书本信息表
CREATE TABLE t_book(
   id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '唯一标识',
   bookname VARCHAR(20) NOT NULL COMMENT '书本名称',
   price FLOAT NOT NULL DEFAULT 0 COMMENT '书本价格',
   booktype INT NOT NULL COMMENT '书本类型,外键',
   createdate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时期',
   FOREIGN KEY(booktype) REFERENCES t_book_category(cid)
) COMMENT '书本信息表';

#订单信息表
CREATE TABLE t_order(
   orderid INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '唯一标识',
   orderno VARCHAR(20) NOT NULL COMMENT '订单编号'
) COMMENT '订单信息表';

#订单详情表
CREATE TABLE t_order_item(
   orderid INT NOT NULL COMMENT '订单ID,外键',
   bookid INT NOT NULL COMMENT '书本ID,外键',
   FOREIGN KEY(orderid) REFERENCES t_order(orderid),
   FOREIGN KEY(bookid) REFERENCES t_book(id)
) COMMENT '订单详情表';

#书本类型
INSERT INTO t_book_category(cname) VALUES('玄幻'),
('软件编程'),('文学'),('名著'),('武侠'),('言情');

#书本信息
INSERT INTO t_book(bookname,price,booktype) VALUES
('遮天',120,1),
('凡人修仙传',90,1),
('斗破苍穹',85,1),
('JAVA',200,2),
('西游记',180,4),
('水浒传',180,4),
('红楼梦',180,4),
('三国演义',190,4),
('基督山伯爵',150,4),
('射雕英雄传',100,5),
('唐诗三百首',220,3);

#订单信息
INSERT INTO t_order(orderno) VALUES
('20190401120010'),('20190402131510'),('20190414090430');

#订单详情
INSERT INTO t_order_item(orderid,bookid) VALUES
(1,1),(1,2),(1,4),(1,8),
(2,2),(2,3),(2,7),
(3,9);

1.子查询

子查询可以使用比较运算符(大于(>)、小于(<)、等于(=)、不等于(!=)、大于等于(>=)、小于等于(<=)等)。即子查询的结果做为父查询的条件,而该条件用比较运算符。

#子查询的结果返回多个时使用IN包含。相反则 not in,
SELECT * FROM t_book WHERE booktype IN(SELECT cid FROM t_book_category);

#查找类型为玄幻的cid,返回查出该cid的书
SELECT * FROM t_book WHERE booktype=(SELECT cid FROM t_book_category WHERE cname='玄幻');
# EXISTS表示是否存在,具有判断的意思。子查询的结果返回一条或多条时
# EXISTS子查询返回结果为TRUE;返之为FALSE。[NOT EXISTS]

# cid没有100的,返回false,未执行SELECT * FROM t_book
SELECT * FROM t_book WHERE EXISTS(SELECT cid FROM t_book_category WHERE cid=100);

# cid返回多条,有值返回true,执行SELECT * FROM t_book
SELECT * FROM t_book WHERE EXISTS(SELECT cid FROM t_book_category);

2.联合查询

# 多张表的结构是完全一样的,保存的数据(结构)也是一样的,两个查询相同的结果只会出现一个

create table t_book2  as select * from t_book;

SELECT * FROM t_book WHERE booktype=1
UNION
SELECT * FROM t_book2 WHERE booktype=1;

3.连接查询(内联,左外联,右外联)

3.1 交叉查询(笛卡尔乘积) t_book乘t_book_category,两表数据乘积。

SELECT * FROM t_book_category,t_book;

结果:  

3.2 内连接:先交叉查询,再根据连接条件过滤数据记录。只有完全匹配连接条件,才能显示数据记录。

#第一种
SELECT * FROM t_book b,t_book_category c WHERE b.booktype=c.cid 
SELECT * FROM t_book b,t_book_category c WHERE b.booktype=c.cid AND c.cname='文学'
#第二种
SELECT * FROM t_book b INNER JOIN t_book_category c ON b.booktype=c.cid
SELECT * FROM t_book b INNER JOIN t_book_category c ON b.booktype=c.cid AND c.cname='文学'
SELECT * FROM t_book b INNER JOIN t_book_category c ON b.booktype=c.cid WHERE c.cname='玄幻'

加强:
 1. SELECT * FROM t_book b
    INNER JOIN t_book_category c
    INNER JOIN t_order o
    INNER JOIN t_order_item oi
    ON b.`booktype`=c.`cid` AND b.`id`=oi.`bookid` AND oi.`orderid`=o.`orderid`;

 2. SELECT * FROM t_book b,t_book_category c,t_order o,t_order_item oi 
    WHERE b.`booktype`=c.`cid` AND b.`id`=oi.`bookid` AND oi.`orderid`=o.`orderid`;

3.3 外连接:连接条件不成立时,主表记录永远保留,与null匹配。

#左联(左边表主表t_book_category)
SELECT * FROM t_book_category c LEFT JOIN t_book b ON c.cid=b.booktype

结果:

#右联(右边表主表t_book_category)
SELECT * FROM t_book b RIGHT JOIN t_book_category c ON b.booktype=c.cid

4.分页查询(limit)

#语法:select * from 表名 limit start,pagesize;
#     start:从第几条数据开始
#     pagesize:返回多少条数据

#从0开始取五条
SELECT * FROM t_book LIMIT 0,5;

#从5开始取五条,不包括5在内
SELECT * FROM t_book LIMIT 5,5;

#从第一条开始去五条
SELECT * FROM t_book LIMIT 5;

猜你喜欢

转载自blog.csdn.net/qq_43080036/article/details/89514914