SQL入门教程2
前面介绍了SQL基础部分,现在介绍SQL其他部分:子查询、写操作.
子查询
子查询是能潜入在大型查询之中,有三种子查询类型,这是基于它们的返回不同划分的。
二维表
这个查询返回超过一列以上,比如查询Robin Sharma编写所有书籍的库存,使用子查询如下:
SELECT*
FROM
(SELECT
author,
sum(stock)
FROM
books
GROUP
BY
author)
AS
results
WHERE
author='Robin Sharma';
结果:
author | sum |
---|---|
Robin Sharma | 4 |
之前聚合group by结果是作为另外一个表,用在 FROM中。
一维数组
查询返回为单列的多行,能被作为数组,也用作二维表。案例中,我们获得被一个作者编写的所有书籍的标题和id,条件是这些书的库存大等于3,我们分两步:
1.获得库存大等于3的书籍的作者列表,基于前面结果:
SELECTauthor
FROM
(SELECT
author,
sum(stock)
FROM
books
GROUP
BY
author)
AS
results
WHERE
sum
>
3;
得出结果:
author |
---|
Robin Sharma |
Dan Brown |
也可写成:['Robin Sharma', 'Dan Brown']
2.我们然后在下一个查询使用这个结果:
SELECTtitle,
bookid
FROM
books
WHERE
author
IN
(SELECT
author
FROM
(SELECT
author,
sum(stock)
FROM
books
GROUP
BY
author)
AS
results
WHERE
sum
>
3);
得出结果:
title | bookid |
---|---|
The Lost Symbol | 2 |
Who Will Cry When You Die? | 3 |
Inferno | 4 |
这等同于编写:
SELECTtitle,
bookid
FROM
books
WHERE
author
IN
('Robin Sharma',
'Dan Brown');
单值
这是查询结果有一行和一列,能看成是常量值,能作为一个值用在任何地方,比如比较操作,它们能用像二维表一样使用,也可以看成是只有一个元素的数组。
让我们实现查询所有库存超过目前平均库存以上的书籍,平均库存使用:
select avg(stock) from books;
得出结果:
avg |
---|
3.000 |
这个值可以看成是数值3的常量值。现在我们完成查询:
SELECT*
FROM
books
WHERE
stock>(SELECT
avg(stock)
FROM
books);
等同于编写:
SELECT*
FROM
books
WHERE
stock>3.000
得出结果:
bookid | title | author | published | stock |
---|---|---|---|---|
3 | Who Will Cry When You Die? | Robin Sharma | 2006-06-15 00:00:00 | 4 |
前面介绍都是查询读操作,下面介绍写操作
写操作
更新操作:类似读查询,不同的是使用SET对列进行修改,如果我们突然丢失了Dan Brown编写的所有书籍,我们需要更新库存:
UPDATEbooks
SET
stock=0
WHERE
author='Dan Brown';
WHERE还是一样功能,不同是不是使用SELECT读取,而是使用SET修改到新值。
删除操作:比SELECT或UPDATE更简单:
DELETE FROM books WHERE author='Dan Brown';
插入操作:不同于其他类型操作的可能只有INSERT了:
INSERT INTO x (a,b,c) VALUES (x, y, z);
这里 a b c是列名, x y z是插入这些列的值,顺序是一致的。插入书籍资料:
INSERTINTO
books
(bookid,title,author,published,stock)
VALUES
(1,'Scion of Ikshvaku','Amish Tripathi','06-22-2015',2),
(2,'The Lost Symbol','Dan Brown','07-22-2010',3),
(3,'Who Will Cry When You Die?','Robin Sharma','06-15-2006',4),
(4,'Inferno','Dan Brown','05-05-2014',3),
(5,'The Fault in our Stars','John Green','01-03-2015',3);