Mysql:SQL复习

Mysql:SQL复习

 

本文是周末在家为了复习SQL总结而写。

SQL语法如果经常使用的话不会是问题,但是如果你是使用客户端的话例外。我现在操作SQL都是直接使用mysql连接,而不是使用可视化客户端。对于开发人员来说,熟练能够手写CRUD操作是个基本的能力。本文最后会附上MySql的中文翻译文档,如果对文档有疑问的地方,可以直接查询官网: http://dev.mysql.com/doc/refman/5.6/en/,对于基本操作来说,Mysql所有版本都支持。

 

我们先看下select的用法:

Mysql:SQL复习
     这种表示方式确实很有意思,但是看起来还是有点乱。将其中主要的部分摘出来,能够更清晰的理解:

select select_expr [, select_expr] from tbl
where where_condition
group by col_name asc [, col_name desc]
having where_condition
order by col_name asc [, col_name desc]
limit offset

 这个是比较完整的select语法,当然根据上图还有更细致的语法,不过那些用法比较高级。如果不是DBA的话,比较少用到,这里暂时不讨论。

我们使用一个完整的SQL来解释一下:

select author,book,count(*) count from purchase
where state='active' and living in ('dead','live')
group by author, book
having count > 10000
order by count desc
limit 10

查询在售最畅销的作家和书籍前十名。其中group by把author和book的数量统计出来,having过滤数量超过10k的作家,按照出版数目降序排列;我们只是关心畅销前十名。Ok,这个SQL有了基本SQL的全部元素,并且功能很清楚。在写SQL时,最重要的是SQL的where条件后面的部分,不管是Delete、Query还是Select,where后面的条件就决定了SQL功能的复杂程度,所以,熟练掌握SQL where后面的内容是很重要的。

 

注意这个查询结果是个临时表,但是既然是表,当然可以将查询结果作为临时表继续迭代查询:

select u.userid,u.username,u.loan,a.address from user u,
(select userid,address from address) a
where u.userid = a.userid

注意其中的address表,就是作为临时表,为最后的查询结果提供支持。

 

如果查询多个表的话,通常的做法是将各个表重新命名,并且在查询结果列中点明这一列的来源,即这一列来自于哪个表的这个字段。

如user表和address表中都有useid字段,我们在最后的结果集合中点明是user表中useid。如果没有点明是来自于哪个表中,列名唯一则能正确查询,列名有重复的话,SQL将不知道你最终的结果集是哪个表中的列。一般来说,只要牵扯到多个表连接查询的话,重命名表名和精确定义结果集是通常的做法,至少我一直是这么做的。

 

看select完整的语法中有个distinct字段,这个表示将查询出来的结果去重:

select distinct book, author from purchase;

where后面的语法不受影响,注意distinct后面支持多个列,表示这些列的数据唯一。

 

 

下面我们学习下插入insert的用法,插入形式有多个表示形式:

Mysql:SQL复习

其中最常见的是前两种插入操作,示例如下:

insert into tbl(col1,col2) values("gw","wtf");
insert into tbl set col1="gw",col2="wtf";

最后一种insert操作实际是是将数据从其它的表中导入到当前表:

insert into tbl(col1,col2.col3)
select col1,col2,col3 from tbl2;

后面的select语句未必是将从单个表中取数据,这个select是符合select语法的;也可以从多个表中获取。

提到insert操作,就不能不提下replace操作,这个replace操作可能会有人不是特别熟悉: 

replace操作和insert操作的语法一致。Replace操作和Insert操作不一致的地方有:

1:Replace是SQL标准的扩展;

2:Replace操作有两种形式:或者insert,或者delete后insert;

解释下第二个不同点。如果你插入的数据列里,有主键(primary key)或者唯一索引(unique index),使用replace时会先检查主键数据是否存在,如果不存在就插入;如果存在就更新主键唯一标识的这条数据。如果你插入的数据里没有主键或者唯一索引,SQL引擎无法判断这条数据是不是唯一,所以在这种情况下,replace等同于insert。

 

 

下面我们学习删除delete语法,delete算是比较简单,根据where条件选中满足行,直接删除:

Mysql:SQL复习
      我们看下得了delete操作:

delete from user where 1 <> 2;

 对于delete删除语句,也支持多表操作,同时从多张表中删除数据:

Mysql:SQL复习
       使用multi-delete时,可以使用下面两种格式:

delete t1,t2 from t1,t2,t3 where t1.id=t2.id and t1.id=t3.id
delete t1,t2 using t1,t2,t3 where t1.id=t2.id and t1.id=t3.id

 从多个表(t1,t2,t3)查询结果中,删除固定表(t1,t2)中的数据,这个比较容易理解,两者的功能一样。

如果你不带where条件,想清除整张表的数据的话,可以使用truncate语句

truncate tbl

 truncate语法比delete语法更快,效率更高;注意是在想清除整张表数据的情况下。如果有where语句的话,不能使用truncate语法。

 

 

下面我们看下更新Update操作:

Mysql:SQL复习
       对于单表操作,更新操作比较简单,图片描述的是全的update SQL。

对于多表操作的更新,我以前也没有注意过,关键是很少这样更新,这次也算是多学习了点:

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

 在进行多表更新操作时,不能有order by和limit限制,只能按照上面图片中多表更新里面的语法。

更新操作时,如果想同时更新某一列的值,可以这么做:

update t set id = id + 1 where id > 10;

 

本节SQL的复习内容就到这里,重点是上面提到的那几张图,完整的语法全部在几张图里。如果想深入学习SQL的话,这几张图是必须要深入理解的。

相关推荐