经典SQL回顾之晋级篇

     上篇博文在说SQL基础的时候,有一个地方有点误导你们,文中说到SQL 中的substring()和C#中的substring()相同,这有点歧义。基本原理虽然相同,可是有一点很不同,就是C#中索引是从0开始的,而SQL中索引是从1开始的,因此在截取的时候须要稍微注意一下,在这里也感谢给我指出来的那位朋友。其实咱们不少时候在阅读别人文章的时候,若是发现其中不妥的地方,耐心的,并且清楚的指出来,不但对本身是一种提升,对做者也是一种鼓励。由于不少时候,本身能明白是一回事儿,但要描述清楚,让别人明白又是另一回事儿。好了,开头说了几句题外话,如今切入正题。面试

      索引-->Index,能够对常常须要查询的字段添加索引,从而增长访问速率,提升检索速度。若是说索引不太好理解,我们换个说法,书的目录你们都知道,通俗的说,索引跟目录挺类似的。有了目录,咱们能够很方便,快捷的查询书中的内容,这比一页一页翻效率要高的多。可是,书中的内容一发生变化,咱们要想目录还有效的话,就得及时的更改目录。索引也同样,虽然不少时候能够提升效率,可是若是库中的数据频繁变化的话,用不用索引就得论证一下了。另外索引占空间,并且添加,更新,删除数据时也须要同步更新,所以下降了Insert,Update,Delete的速度,因此只在常常检索的字段上建立索引。还有一个地方要注意的就是,为了不全表扫描,尽可能别在索引里用like之类的模糊查询。数据库

      IN,逻辑运算符,用来查找值属于指定结婚的元组,格式用法:express

//语法格式
//列名  [not] IN (常量1,常量2,常量3......)
//例:
SELECT Sname,Ssex from Student where sdept

IN ('信息系','计算机系','数学系')

//查询表中系别为信息系,计算机系或者数学系的学生
View Code

      SQL中经常使用的字符匹配ide

      _ 匹配任意一个字符     %匹配0或多个字符     [] 匹配 []中的任意一个字符    [^ ]不匹配[]中的任意一个字符函数

     请看示例:     学习

SELECT ......Sname like '张%'  --查姓张的学生信息
SELECT ......Sname like '[张李刘]%' --查姓张,姓刘,或者姓李的学生信息
SELECT ......Sname like '_[小大]%'--查名字中第二个字为大或者小的学生
SELECT ......Sname not like '刘%' --查全部不姓刘的学生信息
SELECT ......Sno like '%[^235]' --查学号最后一位不是2,3,5的学生信息
View Code

     链接查询:咱们在作SQL设计时,不可能将全部的信息都放入一个表,因此在查询信息的时候常常须要联合几个表来查询。不论是什么数据库,Oracle,MS SQL,DB2或者是Sybase,获取信息时链接查询都不可避免。本文将简单的说一下几个不一样的链接,包括:内链接,自链接和外链接。测试

      内链接:Inner join逻辑运算符返回知足第一个(顶端)输入与第二个(底端)输入联接的每一行。这个和用select查询多表是同样的效果,因此内链接用的比较少。还有一点要说明的就是Join 默认就是inner join。 因此咱们在写内链接的时候能够省略inner 这个关键字。例:     spa

//格式:select xxxx from 表1 join 表2 on 条件
select student.sno,sname......from student join sc
on student.sno=sc.sno
View Code

      自链接:相互链接的表在物理上为同一张表,但在逻辑上能够分为两张。使用自链接时必须为两个表取别名。如:查询与范冰冰在同一系学习的学生姓名和所在系。咱们能够按这个思路来:先找到范冰冰在哪一个系学习,在学生表中将这个表称为s1,而后找出此系全部学生,在student表中将这个表称为s2,s1和s2链接的条件就是两个表的系别相同。设计

select s2.sname,s2.sdept from student s2 join student s1
on s1.sdept=s2.sdept where s1.name='范冰冰'
and s2.name!='范冰冰'
View Code

      外链接:外链接又分左(外)链接,右(外)链接,全(外)链接。左外链接和右外链接时都会以一张表为基表,该表的内容会所有显示,而后加上两张表匹配的内容。 若是基表的数据在另外一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。形如:3d

      from 表1 left|right join 表2 on 条件   左链接的含义是限制表2中的数据必须知足链接条件,而无论表1中的数据是否知足链接条件,均会输出表1中的内容。右链接则正好相反。说了这么多链接可能仍是有点迷糊,我也看过其余一些写SQL链接的文章,有一篇还真不错,这里借鉴一些:

      关于内链接:

//1.2.1 先建立2张测试表并插入数据:
SQL> select * from dave;
ID  NAME
---------- ----------
1  dave
2  bl
1  bl
2  dave
SQL> select * from bl;
ID  NAME
---------- ----------
1  dave
2  bl
//1.2.3 用内连接进行查询:
SQL> Select a.id,a.name,b.name from dave a inner join bl b on a.id=b.id;   -- 标准写法
        ID NAME       NAME
---------- ---------- ----------
         1 dave       dave
         2 bl         bl
         1 bl         dave
         2 dave       bl
SQL> Select a.id,a.name,b.name from dave a join bl b on a.id=b.id;  -- 这里省略了inner 关键字
        ID NAME       NAME
---------- ---------- ----------
         1 dave       dave
         2 bl         bl
         1 bl         dave
         2 dave       bl
SQL> Select a.id,a.name,b.name from dave a,bl b where a.id=b.id;  -- select 多表查询
        ID NAME       NAME
---------- ---------- ----------
         1 dave       dave
         2 bl         bl
         1 bl         dave
         2 dave       bl
View Code

      外链接:

--如下为模拟数据
SQL> select * from bl;
        ID NAME
---------- ----------
         1 dave
         2 bl
         3 big bird
         4 exc
         9 怀宁
SQL> select * from dave;
        ID NAME
---------- ----------
         8 安庆
         1 dave
         2 bl
         1 bl
         2 dave
         3 dba
         4 sf-express
         5 dmm
View Code

    左外链接(Left outer join/ left join)

    left join是以表的记录为基础的,示例中Dave能够当作左表,BL能够当作右表,它的结果集是Dave表中的数据,在加上Dave表和BL表匹配的数据。换句话说,左表(Dave)的记录将会所有表示出来,而右表(BL)只会显示符合搜索条件的记录BL表记录不足的地方均为NULL.右外链接的结果和左外链接相反,就不举例了。

示例:
SQL> select * from dave a left join bl b on a.id = b.id;
       ID NAME               ID NAME
--------- ---------- ---------- ----------
        1 bl                  1 dave
        1 dave                1 dave
        2 dave                2 bl
        2 bl                  2 bl
        3 dba                 3 big bird
        4 sf-express          4 exc
        5 dmm                             -- 此处B表为null,由于没有匹配到
        8 安庆                             -- 此处B表为null,由于没有匹配到
SQL> select * from dave a left outer join bl b on a.id = b.id;
        ID NAME               ID NAME
---------- ---------- ---------- ----------
         1 bl                  1 dave
         1 dave                1 dave
         2 dave                2 bl
         2 bl                  2 bl
         3 dba                 3 big bird
         4 sf-express          4 exc
         5 dmm
         8 安庆
View Code

    如下这张图-1很好的表示了各链接的关系。

 

    视图: 从数据库的基本表中选取出来的数据组成的逻辑窗口,数据库中只存放视图的定义,而不包含数据,其数据仍放在原表中。

    一、单原表视图,顾名思义,从一个表中查询出来的数据,如:    

create view is_student
as
select sno,sname,sage
from student where sdept='计算机系'
View Code

    二、多原表视图(创建计算机系选修了‘c01’的视图)

create view v_s1(sno,sname,grade)
as
select student.sno,sname,grade
from student join sc on student.sno=sc.sno
where sdept='计算机系' and sc.cno='c01'
View Code

     三、在已有的视图上定义新的视图。相似于2,删除视图:drop view<viewname>

     因为时间关系,其余的内容放到下篇写吧,但愿小伙伴们可以多多包含!谢谢。

     下篇会介绍一下存储过程,事务和函数,以及我的以前在面试的时候遇到的几个经典的SQL问题,还有我的用的几个比较高效的SQL写法。

相关文章
相关标签/搜索