深入学习、理解select语句、delete语句以及其他SQL语句

深入理解select语句、SQL语句


我们从一个例子出发:删除表中字段的语句:(以mysql5.5数据库为例)

1,delete from user as u where u.userid=6;

2,delete from user u where u.userid=6;

3,delete from user where userid=6;

4,delete u.* from user u where u.userid=6;

5,delete u from user u where u.userid=6;

通过测试可以发现,1和2,都是错误的MySQL语句,而3和4和5是可行的。所以,如果我们想在删除操作中使用别名的话,就要采用第4种方法或者第五种方法。

这是为什么呢?

首先我们要对SQL语句,进行更加深入的了解。

一,SQL语言是一种声明式的语言

    简单的说,SQL语言声明的是结果集的属性,数据库系统会根据SQL声明的内容,从数据库中查询出符合条件的数据。这和传统的编程思维是不一样的,在传统编程中,我们要告诉计算机怎么做。

二,SQL的语法并不按照语法顺序来执行

    SQL语句的执行顺序和语法顺序是不一致的,SQL语句的语法顺序是:

a,select[distinct]
b,from
c,where
d,group by
e,having
f,union
g,order by

上面语句的执行顺序为:

a,from
b,where
c,group by
d,having
e,select
f,distinct
g,union
h,order by

关于SQL语句的执行,有三个值得注意的地方:

1,from才是SQL语句执行的第一步,将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。
2,select是在大部分语句执行之后,才执行的,严格的说是在from和group by 之后执行的。理解这一点是非常重要的,这就是你不能在where中使用select中设定别名的字段作为判断条件的原因。
3,无论在语法上还是在执行顺序上,union 总是排在order by之前。

三,SQL语言的核心是对表的引用  table references

四,灵活引用表能使SQL语句变得更强大


    一个简单的例子就是join的使用。严格来说,join语句并非是select中的一部分,而是一种特殊的表引用语句。

五,SQL语句中推荐使用表连接

    高级SQL程序员也许会给你忠告:尽量不要使用逗号来代替join进行表的连接。使用join可以提高你的SQL语句的可读性,并且可以避免一些错误。

六,SQL 中的派生表可以当做一种变量来看待

    说白了,所谓的派生表,就是在括号之中的子查询。例如:
from (select * from autor)
有时候我们可以给派生表定义一个相关名,也就是大名鼎鼎的别名。例如:
from (select * from autor) a
我们反复强调,SQL语句是对表的引用,而并非对字段的引用。

七,SQL语句中group by是对表的引用进行的操作

    group by 是在表的引用的基础上,对引用进行了操作,将引用转换成另一种新的引用。

语法总是枯燥的,总之,看了这些,你应该明白一个原则:“用别名,先定义”。也就是说,SQL中,在使用一个别名的之前,必须要确保这个别名在之前已经定义了。

OK, 回过头来,我们再来看我们遇到的问题:

1,delete from user as u where u.userid=6;

2,delete from user u where u.userid=6;

3,delete from user where userid=6;

4,delete u.* from user u where u.userid=6;

5,delete u from user u where u.userid=6;

当我们把SQL语句提交以后,数据库是这样操作的:
第一步:执行from user u,也就是扫描user表,并且给user表起了一个别名:u
第二步:执行where u.userid=6 ,也就是找到u引用中,userid=6的字段;
第三步:执行delete u,也就是删除u引用;

好了,我们再看看几个关键点:
第一点:所有的别名是不是在使用之前,已经定义好了;
第二点:执行delete u,就是删除user表引用u,u可以看做是一个引用表,这一步的意思就是删除表u

好了,今天的学习就到这里,改天再叙。





你可能感兴趣的:(数据库,mysql5)