表和数据
#书本类型表
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;