代码改变世界

跟我一起学Oracle 11g【7】----SQL 基础学习

2012-08-14 18:12  随风浪迹天涯  阅读(3341)  评论(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.

后记

SQL语句的编写规范