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的书籍的作者列表,基于前面结果:

SELECT author 
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.我们然后在下一个查询使用这个结果:

SELECT title, 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

这等同于编写:

SELECT title, 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编写的所有书籍,我们需要更新库存:

UPDATE books 
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是插入这些列的值,顺序是一致的。插入书籍资料:

INSERT INTO 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); 

 

JDBC基础教程

数据库事务专题

NoSQL专题