设为首页 收藏本站
查看: 1247|回复: 0

[经验分享] Oracle 11g系列—7—SQL 基础学习

[复制链接]

尚未签到

发表于 2016-8-11 07:06:14 | 显示全部楼层 |阅读模式
前言
  数据的作业不仅仅是存放数据,它的更重要的作用是根据用户的需求(也就是条件)来显示用户所需要的数据。
  本章详细介绍select语句、DMT语句、事物控制等等知识。
一。SQL语言概述
  SQL(Structured Query Language,结构化查询语言),用来实现关系运算中的查询、选择等操作,是一个综合的、功能极强同时也是一种简单易学的语音。
1.1 SQL 语言的特点

  • SQL语言采用集合操作方式,对数据的处理是成组进行的
  • 执行SQL语句时,每次只能发送并处理一条语句
  • 执行SQL语句时,用户只需要知道逻辑含义,无需关心SQL的具体执行
1.2 SQL语言分类
  ①查询语言
  比如select
  ②数据操纵语言(Data Manipulation Lanuage,DMT)

  • Insert
  • Update
  • Delete
  • Merge(合并 插入 修改)
  ③数据定义语言(Data Definition Language,DDL)

  • Create
  • Drop
  • Rename
  • Truncate(删除表的全部内容)
  ④事物控制(Transaction Control ,TC)语句

  • Commit 永久性的保存对行所做的修改
  • Rollback 取消对行所做的修改
  • Savepoint 设置一个“保存点”,可以将对行的修改回滚到此处
  ⑤数据控制语言(Data Control Language,DCL)

  • Grant 授予其他用户对数据库结构的访问权限
  • Revoke 收回用户数据库结构的权限
1.3 SQL语句的编写规则

  • SQL关键字不区分大小写,也就是大小写不敏感
  • 对象名和列名不区分大小写
  • 字符值和日期值区分大小写
  具体一些 看后记中的参考文献
二。数据查询语法
  Select [All|Distinct] <列名> [,<列名> ]...
  from <表名或试图名>
  [where <条件表达式>]
  [Group by <列名1> [Having <条件表达式>]]
  [Order by <列名2> [ASC|DESC]]
  OK,上面就是查询语句的语法。这个怎么看呢?很简单。。貌似以前也说过。就是方括号([])中的内容是可选的,尖括号(<>)是一定要选择的。
  测试数据
  我新建了3个表,如下
  学生表:Student(Sno,Sname,Ssex,Sage,Ddept)
DSC0000.png
  课程表:Course(Cno,Cname,Cpno(先行课),Ccredit(学分))
DSC0001.png
  这里需要解释一下,什么叫先行课:就是比如你要学C#,那么你需要一定的计算机基础的知识,那么这个计算机知识就是先行课。
  学生选课表:SC(Sno,Cno,Grade)
DSC0002.png
三。数据查询-----单表查询
  顾名思义就是在一个表中查询。这个是最简单的查询咯!
3.1选择表中的若干列
  ①查询指定列
  【例子1】从student表中查出所有学生姓名和学号
DSC0003.png
  ②查询所有的列值
  【例子2】从course表中查出所有的课程信息
DSC0004.png
  ③查询经过计算的值
  【例子3】从student表中查出学生的姓名和生日日期
DSC0005.png
  <列名>不仅可以是算数表达式,还可以是字符串常量、函数等。
  【例子4】我现在要找出全体学生的姓名、出生年份以及院系,但要求院系都要小写!如下:
DSC0006.png
  用户可以通过指定别名来改变查询结果的列标题,例子如下:
DSC0007.png
3.2选择表中的若干元组
  ①消除取值重复的行
  需要记住的关键字是:distinct
  【例子5】使用distinct
DSC0008.png
  ②查询满足条件的元组
  我们都知道查询满足指定条件是可以通过Where字句来实现的,where字句常用的查询条件如下:
查询条件谓词
比较大小=,<,>>=,<=,!=,<>....
确定范围between and,not between and
确定集合In,not in
字符匹配Like,not like
空值is null, is not null
多重条件(逻辑运算)and ,or ,not
  
  (1)比较大小
  【例子6】查询计算机系全体学生的名单
DSC0009.png
  【例子7】查询年龄在20岁以下的学生
DSC00010.png
  (2)确定范围
  【例子8】查询年龄在20~25(包括20 和25)岁之间的学生名字、系别和年龄。
DSC00011.png
  同理,如果不在这个范围,则使用not between关键字。
  (3)确定集合
  谓词in可以用来查找属性属于指定集合的元组
  【例子9】查找计算机系(CS)、数学系(MA)的学生姓名和性别。
DSC00012.png
  与in相对应的谓词是not in,用于查找不在这个范围的值。
  (4)字符匹配
  用like可以进行字符串的匹配,语法如下:
  [not] like '<匹配串>' [escape '<换码字符>']
  其含义是找出指定的属性列值与匹配串的结果。匹配串可以是字符串,也可以是通配符%和_,含义如下:
  %(百分号):代表任意长度。比如a%b,则表示aeweb,或者ab
  _(下划线):代表任意个字符。比如a_b则代表,a开头,b结尾的3个字符串。
  【例子10】找出名字中以 Hong结尾的名字
DSC00013.png
  很明显,找出不在字符串中的匹配是not like。
  【例子11】找出学生名字xiao后面只有2个字符的名字:
DSC00014.png
  得到的结果是XiaoLi,因为上面图的缘故,所以只能看到一条下划线,其实有2个。
  NOTE:如果用户要查询的字符串本身就包含通配符%或_中,那怎么办呢?在上面的语法中,我们提到。这个时候,我们就需要使用escape ‘换码字符’ 这个知识了,对通配符进行转义了。
  啥意思呢?就是在escape ‘换码字符’后面的字符串是正常的字符串。

  【例子12】找出课程名DB_开头,并且倒数第三个字符为i的课程的详细信息。
DSC00015.png
  这个怎么看呢?escape '\' 表示 '\'为换码字符。这样匹配串中紧跟在“\”后面的字符串“_”不在具有匹配符的含义,和普通字符一样。所以,第一个“_”被转义为普通字符,第二和第三个的前面没有换吗码字符,所以依然是匹配符。
  (5)涉及空值的查询
  【例子13】查询缺少成绩的学生号和课程号,因为有些学生没有参加课也很正常。
DSC00016.png
  OK,可能有些园子的朋友会觉得 这里的is 用“=”代替,可以吗?结果如下:
DSC00017.png
  得出的结果是不可以的,所以在判断为空的时候用is,而不是“=”
  (6)多重条件查询
  逻辑运算符 and和or可以用来连接多个查询条件。and的优先级高于or的哦。亲。
  【例子14】查询年龄在20岁以下且是计算机系的学生
  
DSC00018.png
  【例子15】在例子9中,我们使用了in,其实,我们也可以用or来代替找出在学生的系在CS和MA的学生。

DSC00019.png
3.3Order by 字句
  用户可以使用order by语句来进行对查询结构的列进行升序(ASC)或者降序(DESC)
  【例子16】从course表中,查找出课程号2及其的学生成绩,结果按分数降序 排列。
DSC00020.png
  对于空值,若按升序排列,含空值的元组会最后显示。若降序排列,空值的元组会最先显示。
3.4 集合函数(Aggregate function)
  SQL 提供了许多的集合函数,主要有:
  Count([Distinct|All]*) 统计元组个数
  Count([Distinct|All]* <列名>) 统计一列中值的个数
  Sum([Distinct|All]* <列名>)计算一列值的综合
  Avg([Distinct|All]* <列名>) 计算一列值的平均值
  Max([Distinct|All]* <列名>) 求一列值中最大值
  Min([Distinct|All]* <列名>) 求一列值最小值
  【例子17】求student表中的学生数
DSC00021.png
  【例子18】计算选择1号课程的平均成绩
DSC00022.png
  在聚集函数遇到空值的时候,除了count(*),都跳过空值而只是处理非空值。注意where字句中是不能聚集函数作为条件表达式的。
  【例子19】求学号为4选修课的总学分数:
DSC00023.png
3.5 Group by
  group by字句将查询结果按某一列或多列的值分组,值相等的为一组。对查询结果分组是为了细化聚集函数的作用。
  【例子20】求每个课程号及相应的的选课人数
DSC00024.png
  该语句对查询结果按Cno的值分组,所以具有相同Cno值的元组都为一组,然后对每一组进行统计个数。
  如果分组后还需要按照一定的条件对这些组进行刷选,则可以使用having短语指定刷选条件。
  【例子21】
DSC00025.png
  这里选用group by字句按照sno进行分组,在用聚合函数count对每一组进行统计,having给出了条件,只有满足条件的组才会显示出来。因为Sno=3的课程人数只有1人,所以没有显示出来。
  where和having的区别是:where字句作用于基本表或视图;而having作于元组中(就像我们这里一样)。
3.6 Order By 排序
  Order By主要是对一列或多列进行排序。
  语法格式如下:
  Order by 列名1 [,列名2 。。] [ASC | DESC]
  ASC:升序排列(默认方式)
  DESC:降序排列
  【例22】找出sc表中的所有成绩按照降序排列
DSC00026.png
  当然,你的排列不紧可以是一列,也可以是多列。比如上面,我们先按grade降序排列,然后 接着在按sno降序排列,如下:
DSC00027.png
  OK.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256045-1-1.html 上篇帖子: 用oracle分析函数优化自连接 下篇帖子: Oracle 中查看比较大的排序进程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表