zoukankan      html  css  js  c++  java
  • 跟我一起学Oracle 11g【7】SQL 基础学习

    前言

    数据的作业不仅仅是存放数据,它的更重要的作用是根据用户的需求(也就是条件)来显示用户所需要的数据。

    本章详细介绍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语句的编写规范

  • 相关阅读:
    《J2EE的智能小区物业管理系统设计与实现》论文笔记(五)
    《基于.net的智能小区物业管理系统设计与实现》论文笔记(四)
    《基于SSH的小区物业管理系统设计与实现》论文笔记(三)
    《智能住宅小区物业管理系统设计与实现》论文笔记(二)
    《智能小区物业管理系统设计与实现》论文笔记(一)
    《轻量级响应式框架Vue.js应用分析》文献阅读(十)
    《Web2.0的研究与应用综述》文献阅读(九)
    《浅谈HTML5在中国的发展》文献阅读(八)
    《基于MVVM模式的WEB前端框架的研究》文献笔记(七)
    《Web新兴前端框架与模式研究》论文阅读(六)
  • 原文地址:https://www.cnblogs.com/damonlan/p/2629521.html
Copyright © 2011-2022 走看看