sql 创建临时表_《从零学会SQL四-复杂查询》课后练习

练习一、视图

视图存放的是sql查询语句,使用视图时,会运行视图里的sql查询语句,创建出一张临时表。

如何创建视图?创建视图的步骤如下:

1、创建视图的sql语气:create view 视图名称(<视图列名1>,<视图列名2>……)

as <select 查询语句>;

举例如下:

b08d4ce77fc9ef9dbc3670282c73fcbf.png

2、运行视图:只要在from子句中使用视图名称代替表名称就可以

ce17eb9d275f31a186670d176bc7e258.png

3、视图的删除:

94047ab04e5e409a382c026c07b83934.png

右键选中-删除即可

4、使用视图的注意事项:

(1)避免在视图中再插入视图,因为这样会降低sql的使用及效率,

(2)不能往视图里插入数据,因为视图存放的是sql语句,它并不是数据表,且它的结果会跟着原数据表的数据改动而变化。

练习二、子查询

(1)子查询是一次性的视图,就是在SQL查询子句中直接写定义视图的sql查询语句,也就是在一个SQL的查询子句中再嵌套另一个SQL查询语句。例如练习一的视图语句可以写成如下:

77b8dbfefe632a359e90d694ba8dc885.png

这是一个临时表,在SQL运行结束后,它就就会消失。它的运行顺序是先运行子查询,得到一个临时表,再从得到的这个临时表查询出我们想要的结果。

(2)子查询的一些语句:...in(子查询)、...any(子查询)、...all(子查询),这些子查询一般与where 搭配使用。

1ed2a3fc299e0d74d4e241529ab58ae0.png

2e2130d23297c3786ef929209547a64f.png

any 与some 的用法是一样的,如果工作中遇到some,就把它等同于any来使用

152141090d61fa5ebe1dc0900287c66d.png

(3)all子查询的注意事项:

6703fbfeda23a6921ca234c36f18028c.png

7f979d4dbc8395b58166ce17792c0652.png

避免层层嵌套子查询,这样会给系统造成负担,不利于维护数据,也不要省略子查询语句后面那个as 后的别名,这样会给别人看数据时不太好理解。

(4)sql的运行顺序:

496af7edafac52d2886b4df330333058.png

练习三、标量子查询

(1)、标量子查询是必须且只能返回一行一列的查询结果,即标量子查询只能返回一个单一的值。

9fc84f18545a182143754e0a9aaa70b6.png

练习四、关联子查询

(1)子查询中含有关联条件的子查询又叫关联子查询:

21c64465d3883100b1e2c8bd4c9ae157.png

上图不知道何缘故报错,我又重新删了所有语句重写,这次能运行出来了,如下:

f9213b1069ad1322e505cbd2cf11bc68.png

(2)子查询的作用:

119c169f633483e94d5cca2fc305ae5f.png

子查询好比我们平时的用车情况,假设我们只是偶尔需要用车的话,那我们可以直接写一个子查询,一次性查出我们想要的结果就可以,但是如果我们经常需要用车,这样的情况下我们把子查询保存为视图就很方便了。避免每次查询都写一大推SQL语句,节省时间。

(3)如何看懂sql的报错信息:

8221163523edaabcae14a3a50b7cb879.png

当我们的SQL运行报错的时候,我们可以逐一进行排查,首先先选子查询语句然后运行,看看是否是子查询语句有误,子查询语句能运行通过后再运行子查询外面的SQL语句。

练习五、各种函数

1ac6174fbb76644f2258a75d992c5320.png

750984c5c005acf8e19d564e32ac7036.png

8389ded6a35a1e1b627b94a0d7ef88f3.png

55a7f1b5f872a1c167d719aaa311fb86.png

练习六、SQLZOO练习的答案

5f94e579b2b4b58fbb088a0288f1ff30.png

528acd3f41f5c31da4a3a9a8fad90af7.png

573e38b9830fd98d51c700a455b1619e.png

b0351ade3a038f262a14ffd2f099ff16.png

本题知识点:因为是找人口多于加拿大,但是比波兰的少,所以是查找范围值,查找范围需要用到运算符between,因为between是包含边界值的,但是我们题目不包含边界值,所以在加拿大的值上我们需要加1,而在波兰的值上我们需要减1。例如公式:1=<x>=10,为了使我们求出的x值不包含1跟10 ,这个公式我们需要写成:1+1<=X>=(10-1)

2cc7cbd5bb3eb7050c4c2010531aa8f2.png

知识点:本题需要用到标量子查询、字符串连接函数concat、保留小数位数的函数round。结合上图例子去分析每个函数的用法。上图题目其实就是求欧洲每个国家的人口占德国人口的百分比。

257f0351719d3a2bb01ab75fc9d07010.png

a037242eeb39b13dfbdca182ac2b0181.png

知识点:all 的用法、子查询、gdp>0去掉空值

129af55f28c91a352d32fe3f0138aa5f.png

d00d0a19035d2741c29926611d1fcece.png

50b3484b00a319965d38426cebf20a0e.png

6eab6f5573d0ea75ff9d949f8db46ec2.png

本题知识点:all的用法、关联子查询。在关联子查询中:x.name<>y.name意思是因为在同洲中自身是无法跟自身进行比较的,所以把自身的值排除掉。

d1906b430cb35a0bb452cbe24708d5f6.png

总结:SQL解决业务问题的顺序及思路:

1、先把题目翻译成大白话,即翻译成自己能理解的语句。

2、写出解决问题的分析思路

3、写出对应的SQL子句

f356fb5312c8a1b6869a8943fa9fe8ba.png

9686137cb31d96b9bb8e13160528f959.png

04d87efedb72086a4e6fadd9ae7d2b56.png

ccccb7e6250201d9d9443caff7e06f57.png

9686137cb31d96b9bb8e13160528f959.png

5f03db07d996e011546e1d7de6d41ebd.png

b882ba7ba7c571a2f0d4eb800adf0074.png