练习一、视图

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

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

1、创建视图的sql语气:create view

as <select

举例如下:




java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表


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


java查询时创建临时表 sql查询时创建一个临时表_sql 创建临时表_02


3、视图的删除:


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围查询_03


右键选中-删除即可

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

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

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

练习二、子查询

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


java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表_04


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

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


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围查询_05


java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表_06


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


java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表_07


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


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_08


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_09


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

(4)sql的运行顺序:


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围_10


练习三、标量子查询

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


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_11


练习四、关联子查询

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


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_12


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


java查询时创建临时表 sql查询时创建一个临时表_sql 创建临时表_13


(2)子查询的作用:


java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表_14


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

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


java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表_15


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

练习五、各种函数


java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表_16


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围_17


java查询时创建临时表 sql查询时创建一个临时表_sql 创建临时表_18


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围查询_19


练习六、SQLZOO练习的答案


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围查询_20


java查询时创建临时表 sql查询时创建一个临时表_sql 创建临时表_21


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_22


java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表_23


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


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围_24


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


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围查询_25


java查询时创建临时表 sql查询时创建一个临时表_sql 创建临时表_26


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


java查询时创建临时表 sql查询时创建一个临时表_sql 创建临时表_27


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围查询_28


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_29


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_30


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


java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表_31


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

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

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

3、写出对应的SQL子句


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_32


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_33


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围_34


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围_35


java查询时创建临时表 sql查询时创建一个临时表_sql 占比_33


java查询时创建临时表 sql查询时创建一个临时表_java查询时创建临时表_37


java查询时创建临时表 sql查询时创建一个临时表_sql 时间范围查询_38