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

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

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

//语法格式
//列名  [not] IN (常量1,常量2,常量3......)
//例:
SELECT Sname,Ssex from Student where sdeptIN ('信息系','计算机系','数学系')//查询表中系别为信息系,计算机系或者数学系的学生

View Code

SQL中常用的字符匹配

_ 匹配任意一个字符     %匹配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 这个关键字。例:

//格式: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)。形如:

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       dave2 bl         bl1 bl         dave2 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       dave2 bl         bl1 bl         dave2 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       dave2 bl         bl1 bl         dave2 dave       bl

View Code

外连接:

--以下为模拟数据
SQL> select * from bl;ID NAME
---------- ----------1 dave2 bl3 big bird4 exc9 怀宁
SQL> select * from dave;ID NAME
---------- ----------8 安庆1 dave2 bl1 bl2 dave3 dba4 sf-express5 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 dave1 dave                1 dave2 dave                2 bl2 bl                  2 bl3 dba                 3 big bird4 sf-express          4 exc5 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 dave1 dave                1 dave2 dave                2 bl2 bl                  2 bl3 dba                 3 big bird4 sf-express          4 exc5 dmm8 安庆

View Code

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

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

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

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

View Code

2、多原表视图(建立计算机系选修了‘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

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

由于时间关系,其他的内容放到下篇写吧,希望小伙伴们能够多多包含!谢谢。

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

转载于:https://www.cnblogs.com/xsyblogs/p/3558696.html

经典SQL回顾之晋级篇相关推荐

  1. 30道经典SQL面试题讲解(11-20)

    本篇节选自书籍<对比Excel,轻松学习SQL数据分析>一书,主要讲解数据分析面试中常见的30道SQL面试题.1-10题见:30道经典SQL面试题讲解(1-10) 11 行列互换 现在我们 ...

  2. 经典论文回顾:Decomposing Images into Layers via RGB-space Geometry

    论文:Decomposing Images into Layers via RGB-space Geometry 发表于ACM TOG 2016,是第一个基于RGB凸包的调色板图像编辑算法,我近两年的 ...

  3. SQL 知识点学习汇总,SQL学习这一篇就足够了

    SQL学习知识点汇总 1.SQL是什么? SQL其实是一种编程语言,用于访问和处理数据库的计算机语言 编程语言都有几个特性,有数据类型.可以做运算. 编程语言是为了编程而发明,而程序=数据+算法.所以 ...

  4. 经典查询练手第二篇(不懂装懂,永世饭桶!)

    本文与大家共同讨论与分享ORACLE SQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来.在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出.交流与分享才能 ...

  5. 经典论文回顾:Palette-based Photo Recoloring

    Palette-based Photo Recoloring 是图像重着色领域的经典论文,发表于SIGGRAPH 2015,目前引用量180+.因为跟我目前的工作高度相关,所以今天简要回顾一下这篇论文 ...

  6. 深入浅出SQL Server Replication第一篇:走近Replication(上)

    深入浅出SQL Server Replication第一篇:走近Replication(上) 对于很多的SQL Server DBA而言,Replication不是什么新鲜的事物了,也是大家常常说的& ...

  7. 经典SQL语句大全、50个常用的sql语句

    50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,T ...

  8. 常用经典SQL语句大全完整版--详解+实例 (存)

    常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012  http://blog.sina.com.cn/s/blog_84 ...

  9. 【oracle】oracle经典sql,exception,database link纠错

    [oracle]oracle经典sql,exception,database link纠错 1111-01 oracle经典sql,exception,database link纠错 1.给表tabl ...

最新文章

  1. 第三次作业——结对编程
  2. 一起来学习android自定义控件3——边缘凹凸的View
  3. JAVA——[MySQLNonTransientConnectionException:Could not create connection to database server.]解决方案
  4. Android 使用正则表达式验证邮箱格式是否正确
  5. 2017蓝桥杯省赛---java---B---10(k倍区间)
  6. java 获取oracle表结构_Java导出oracle表结构实例详解
  7. mysql innodb 间隙锁_MySQL中InnoDB的间隙锁问题
  8. FineReport(二)帆软报表图表的
  9. 快速格式化从pdf、caj论文中复制的文本格式(正则替换)
  10. Shiro面试题答案
  11. 计算机处理系统比人工的优势,人工智能技术的优势及其在计算机网络中的应用...
  12. 解锁中智集团30平方米数据中心备受追捧的密码
  13. (转)证券公司私募(PB)整体服务
  14. 戏子推荐伤感个性日志:其实我很脆弱
  15. oracle bround,【案例】Oracle警告 WARNING:inbound connection timed out (ORA-3136)解决办法
  16. java分布式免费开源搜索引擎 Elasticsearch 详细学习笔记
  17. pip安装三方库不成功的解决方法
  18. 新海诚没有参与制作的作品_这种新海诚风的摄影作品是怎么制作的?
  19. 关于一个非常nice的原生UI框架——layerUI
  20. outlook 找不到电子邮件服务器,使用Outlook收取电子邮件并保留邮箱服务器中的邮件的设置方法...

热门文章

  1. 7-1 ATM机类结构设计(一) (100 分)
  2. 求单链表结点的阶乘和
  3. 使用-辗转相除法-求最大公约数
  4. 永恒之塔 java_AionChs
  5. javascript挑战编程技能-第九题:数据结构
  6. 交叉编译Python-2.7.13到ARM(aarch32)平台
  7. POJ 1692 Crossed Matchings dp[][] 比较有意思的dp
  8. AngularJS-liveRoomDirective.js 直播间指令
  9. .NET中的跟踪与调试(TraceDebug)
  10. 分享我的Windows live writer 使用经验