跟我一起学Oracle 11g【7】----SQL 基础学习
2012-08-14 18:12 随风浪迹天涯 阅读(3369) 评论(4) 编辑 收藏 举报前言
数据的作业不仅仅是存放数据,它的更重要的作用是根据用户的需求(也就是条件)来显示用户所需要的数据。
本章详细介绍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)
课程表:Course(Cno,Cname,Cpno(先行课),Ccredit(学分))
这里需要解释一下,什么叫先行课:就是比如你要学C#,那么你需要一定的计算机基础的知识,那么这个计算机知识就是先行课。
学生选课表:SC(Sno,Cno,Grade)
三。数据查询-----单表查询
顾名思义就是在一个表中查询。这个是最简单的查询咯!
3.1选择表中的若干列
①查询指定列
【例子1】从student表中查出所有学生姓名和学号
②查询所有的列值
【例子2】从course表中查出所有的课程信息
③查询经过计算的值
【例子3】从student表中查出学生的姓名和生日日期
<列名>不仅可以是算数表达式,还可以是字符串常量、函数等。
【例子4】我现在要找出全体学生的姓名、出生年份以及院系,但要求院系都要小写!如下:
用户可以通过指定别名来改变查询结果的列标题,例子如下:
3.2选择表中的若干元组
①消除取值重复的行
需要记住的关键字是:distinct
【例子5】使用distinct
②查询满足条件的元组
我们都知道查询满足指定条件是可以通过Where字句来实现的,where字句常用的查询条件如下:
查询条件 | 谓词 |
比较大小 | =,<,>>=,<=,!=,<>.... |
确定范围 | between and,not between and |
确定集合 | In,not in |
字符匹配 | Like,not like |
空值 | is null, is not null |
多重条件(逻辑运算) | and ,or ,not |
(1)比较大小
【例子6】查询计算机系全体学生的名单
【例子7】查询年龄在20岁以下的学生
(2)确定范围
【例子8】查询年龄在20~25(包括20 和25)岁之间的学生名字、系别和年龄。
同理,如果不在这个范围,则使用not between关键字。
(3)确定集合
谓词in可以用来查找属性属于指定集合的元组
【例子9】查找计算机系(CS)、数学系(MA)的学生姓名和性别。
与in相对应的谓词是not in,用于查找不在这个范围的值。
(4)字符匹配
用like可以进行字符串的匹配,语法如下:
[not] like '<匹配串>' [escape '<换码字符>']
其含义是找出指定的属性列值与匹配串的结果。匹配串可以是字符串,也可以是通配符%和_,含义如下:
%(百分号):代表任意长度。比如a%b,则表示aeweb,或者ab
_(下划线):代表任意个字符。比如a_b则代表,a开头,b结尾的3个字符串。
【例子10】找出名字中以 Hong结尾的名字
很明显,找出不在字符串中的匹配是not like。
【例子11】找出学生名字xiao后面只有2个字符的名字:
得到的结果是XiaoLi,因为上面图的缘故,所以只能看到一条下划线,其实有2个。
NOTE:如果用户要查询的字符串本身就包含通配符%或_中,那怎么办呢?在上面的语法中,我们提到。这个时候,我们就需要使用escape ‘换码字符’ 这个知识了,对通配符进行转义了。
啥意思呢?就是在escape ‘换码字符’后面的字符串是正常的字符串。
【例子12】找出课程名DB_开头,并且倒数第三个字符为i的课程的详细信息。
这个怎么看呢?escape '\' 表示 '\'为换码字符。这样匹配串中紧跟在“\”后面的字符串“_”不在具有匹配符的含义,和普通字符一样。所以,第一个“_”被转义为普通字符,第二和第三个的前面没有换吗码字符,所以依然是匹配符。
(5)涉及空值的查询
【例子13】查询缺少成绩的学生号和课程号,因为有些学生没有参加课也很正常。
OK,可能有些园子的朋友会觉得 这里的is 用“=”代替,可以吗?结果如下:
得出的结果是不可以的,所以在判断为空的时候用is,而不是“=”
(6)多重条件查询
逻辑运算符 and和or可以用来连接多个查询条件。and的优先级高于or的哦。亲。
【例子14】查询年龄在20岁以下且是计算机系的学生
【例子15】在例子9中,我们使用了in,其实,我们也可以用or来代替找出在学生的系在CS和MA的学生。
啊
3.3Order by 字句
用户可以使用order by语句来进行对查询结构的列进行升序(ASC)或者降序(DESC)
【例子16】从course表中,查找出课程号2及其的学生成绩,结果按分数降序 排列。
对于空值,若按升序排列,含空值的元组会最后显示。若降序排列,空值的元组会最先显示。
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表中的学生数
【例子18】计算选择1号课程的平均成绩
在聚集函数遇到空值的时候,除了count(*),都跳过空值而只是处理非空值。注意where字句中是不能聚集函数作为条件表达式的。
【例子19】求学号为4选修课的总学分数:
3.5 Group by
group by字句将查询结果按某一列或多列的值分组,值相等的为一组。对查询结果分组是为了细化聚集函数的作用。
【例子20】求每个课程号及相应的的选课人数
该语句对查询结果按Cno的值分组,所以具有相同Cno值的元组都为一组,然后对每一组进行统计个数。
如果分组后还需要按照一定的条件对这些组进行刷选,则可以使用having短语指定刷选条件。
【例子21】
这里选用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表中的所有成绩按照降序排列
当然,你的排列不紧可以是一列,也可以是多列。比如上面,我们先按grade降序排列,然后 接着在按sno降序排列,如下:
OK.
后记
出处:http://www.cnblogs.com/damonlan
Q Q:*********
E_mail:Damon_lan@163.com or Dongcai.lan@hp.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。