第三章 SQL

    SQL最早版本是由IBM开发的,最初叫做Sequel。20世纪70年代早期是作为System R项目的一部分。

3.1 SQL查询语言概览

  • 数据定义语言
  • 数据操纵语言
  • 完整性
  • 视图定义
  • 事务控制
  • 嵌入式SQL和动态SQL
  • 授权

3.2 SQL数据定义

    3.2.1 基本类型

  • char(n):固定长度
  • varchar(n):可变长度
  • int:整数
  • smallint:小整数
  • numeric(p, d):定点数,共有p位数字,d位在右边,如numeric(3,1)可存储44.5
  • realdouble precision:浮点数与双精度浮点数
  • float(n):精度至少n位的浮点数

3.2.2 基本模式定义

    create table命令定义SQL关系。

create table(A1, D1,A2, D2,...,An, Dn,<完整性约束>,...,<完整性约束>); 
  • primary key:主码属性必须非空且唯一
  • foreign key(A1, A2, .....An)references s:声明表示关系中任意元组在属性(A1, A2, .....An)上的取值必须对应于关系s中某元组在主码属性上的取值。
  • noy null:表示不允许空值

    SQL禁止破坏完整性约束的任何数据库更新。

    3.3 SQL查询的基本结构

        SQL查询的基本结构由三个子句构成:selectfromwherefrom->where->select

    3.3.1 关系查询

        在关系模型的形式化数学定义中,关系是一个集合。

        如:

select distinct name
from instructor
where dept_name = 'Comp.Sci.' and salary > 7000; 

        distinct强行删除重复,select子句中还可以含+、-、*、/运算符的算术表达式。

    3.3.2 自然连接

        自然连接(natural join)运算作用于两个关系,并产生一个关系作为结果。它只考虑那些在两个关系模式中都出现的属性上取值相同的元组对。

select name, title
from instructor natural join teaches, course
where teaches.course_id = course.course_id


        SQL还提供了一种自然连接的构造形式, join...using

select name, title
from (instructor natural join teaches) join course using (course_id);

3.4 附加的基本运算

    3.4.1 更名运算

        as子句既可以出现在select子句中,也可以出现在from子句中。

select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = 'Biology';

    3.4.2 字符串运算

        SQL使用一对单引号来标示字符串,如‘Computer’。在字符串中表示单引号时用两个单引号。如‘it‘’s right’。

        SQL在字符串比较大小上是大小写敏感的,但如MySQL和SQL Server,在匹配字符串时并不区分大小写。

        SQL允许字符串函数操作,如lower(s), upper(s), trim(s)去掉字符串后面的空格。

        在字符串上可以使用like操作符来实现模式匹配。两个特殊字符来描述模式:%:匹配任意子串; _:匹配任意一个字符。

        在like比较运算符中使用escape关键词来定义转义字符。如:like 'ab\%cd%' eacape '\' 匹配所有“ab%cd”开头的字符串。

        SQL允许使用not like比较运算符搜素不匹配项。在SQL1999中海提供similar to操作,具备比like运算更强大的模式匹配能力。

    3.4.3 select子句中的属性说明

        select*select子句表示from子句结果关系的所有属性都被选中,‘*’表示所有属性。

    3.4.4 排列元组的显示次序

        order by子句默认升序。可以用desc表示降序,asc表示降序。

selectfrom instructor
order by salary desc, name asc;

    3.4.5 where子句谓词

        between...and比较运算符来说明一个值是小于或等于某个值,同时大于或等于另一个值的。

select name
from instructor
where salary between 90000 and 100000;

        还可以使用not between比较运算符。

3.5 集合运算

    union:U  intersect:∩  except:-。三个集合运算都会自动去除重复,它们的对象都是select-from-where。

    except中,如果我们想保留重复,可以用except all代替except

3.6 空值

    SQL将1涉及空值的任何比较运算的结果视为unknownandornot也被扩展到可以处理unknown值。

    and:true and unknown为unknown,false and unknown为false,unknown and unknown为unknown。

    or:true or unknown为true,false or unknown为unknown,unknown or unknown为unknown。

    notnot unknown为unknown。

    如果where子句谓词对一个元组计算出falseunknown,那么该元组不能被加入到结果集中。

    SQL在谓词中使用特殊的关键词null测试空值。也有谓词is not nullnull = null会返回unknown,而不是true

3.7 聚集函数

    聚集函数是以值得一个集合(集或多重集)为输入、返回单个值的函数。

    五个固有的聚集函数:平均值:avg。最小值:min。最大值:max。总和:sum。计数:count

    count中使用distinct时,表示为:countdistinct ID)。

    分组聚集可以使用group by。在group by子句中的所以属性上取值相同的元组将被分在一个组中。

    当SQL查询使用分组时,保证出现在select语句中但没有被聚集的属性只能是出现在group by子句中的那些属性。

/*error*/
select dept_name, ID, avg(salary)
from instructor
group by dept_name;

    有时候,对分组限定条件比元组限定条件更有用。having并不针对单个元组,而是针对group by子句构成的分组。having子句中的谓词在形成分组后才起作用,因此可以使用聚集函数。与select类似,任何出现在having中,但没有被聚集的属性必须出现在group by子句中。

    from->where->group by->having->select;

3.8 嵌套子查询

    3.8.1 集合成员资格

        in测试元组是否是集合中的成员,集合是由select子句产生的一组构成的。连接词not in则测试元组是否不是集合中的成员。

select distinct course_id
from section
where semester = 'Fall' and year = 2009 andcourse_id in (select course_idfrom sectionwhere semester = 'Spring' and year = 2010);

    3.8.2 集合的比较

        “至少比某一个要大”在SQL中用>some。=some等价于in,然而<>some并不等价于not in

        >all对应于词组“比所有的都大”。<>all等价于not in,但=all并不等价于in

select dept_name
from instructor
group by dept_name
having avg(salary) >= all(select avg(salary)from instructorgroup by dept_name)

    3.8.3 空关系测试

        exists结构在作为参数的子查询非空时返回true值。

        not exists结构测试子查询结果集中是否不存在元组。“关系A包含关系B”写成“not exists(B except A)”。

select S.ID, S.name
from student as S
where not exists((select course_idfrom coursewhere dept_name = 'Biology')except(select T.course_idfrom takes as Twhere S.ID = T.ID));

    3.8.4 重复元组存在性测试

        如果作为参数的子查询结果中没有重复的元组,unique结构将返回true值。

        not unique结构测试在一个子查询结果中是否存在重复元组。。

select T.course_id
from course as T
where not unique(select R.course_idfrom section as Rwhere T.course_id = R.course_id andR.year = 2009);

    3.8.5 from子句中的子查询

        from子句中嵌套一个select-from-where结构等。

        SQL2003允许from子句中的子查询用关键词lateral作为前缀,以便访问from子句中在它前面的表或者子查询中的属性。

select name, salary, arg_salary
from instructor I1, lateral(select avg(salary) as avg_salaryfrom instructor I2where I2, dept_name = I1.dept_name);

    3.8.6 with子句

        with子句提供定义临时关系的方法。实在SQL1999中引入的。

with max_budget (value) as(select max(budget)from department)
select budget
from department. max_budget
where department, budget = max_budget.value;

    3.8.7 标量子查询

        SQL允许子查询出现在返回单个值的表达式能够出现的任何地方(selectwherehaving),只要该子查询只返回包含单个属性的单个元组。该子查询称为标量子查询。

3.9 数据库的修改

    删除:delete语句首先从r中找出所以是P(t)为真的元组,然后把他们从r中删除。

delete from r
where P;

    插入:考虑到可能不知道关系属性的排列顺序,SQL允许insert语句中指定属性。

insert into course(course_id, title, dept_name, credits)values('CS-437', 'Database System', 'Comp.Sci', 4);

    更新:SQL提供case结构,可以利用它在一条update语句中防止某些问题发生。

update instructor
set aslary = casewhen salary <= 100000 then salary * 1.05else salary * 1.03end

    set:不支持同时对多个变量同时复制,当表达式返回多个值时将出错,当表达式未返回值时,变量将被赋为null

    select:支持同时对多个变量同时复制,当表达式返回多个值时将返回的最后一个值赋给变量,当表达式未返回值时,变量保持原值

转载于:https://www.cnblogs.com/clairvoyant/p/5465778.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS code常用插件推荐(总结整理篇)

简介 vscode是微软开发的的一款代码编辑器,就如官网上说的一样,vscode重新定义(redefined)了代码编辑器。当前市面上常用的轻型代码编辑器主要是:sublime,notepad++,editplus,atom这几种。比起notepad++、editplus,vscode集成了许多IDE才具有的功能,比起它们更像一个…

appengine_Google Appengine登台服务器操作方法

appengineGoogle的App Engine开箱即用&#xff0c;支持版本化部署。 您可以非常轻松地在各修订版之间来回切换&#xff0c;这是在上线之前正确测试应用程序的一项很棒的功能。 有一个主要问题&#xff1a;应用程序的所有版本共享同一数据存储。 因此&#xff0c;如果要迁移数据…

Python全栈开发之3、数据类型set补充、深浅拷贝与函数

转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5466082.html 一、基本数据类型补充 set是一个无序而且不重复的集合&#xff0c;有些类似于数学中的集合&#xff0c;也可以求交集&#xff0c;求并集等&#xff0c;下面从代码里来看一下set的用法,如果对这些用法不太熟悉的话…

拿着5家offer的Java,对面试官做了什么?

大家好&#xff0c;我是孙叫兽。本期分享内容从Java初级开始说起&#xff0c;来讲一下要想拿到offer&#xff0c;你必须要做哪些充足准备&#xff01; 先从初级Java开始&#xff0c;当你还是一个初级Java的时候&#xff0c;要想拿到offer&#xff0c;首先要关注自己的简历&…

Spring综合课程总结

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

进程与线程的一个简单解释

进程&#xff08;process&#xff09;和线程&#xff08;thread&#xff09;是操作系统的基本概念&#xff0c;但是它们比较抽象&#xff0c;不容易掌握。 最近&#xff0c;我读到一篇材料&#xff0c;发现有一个很好的类比&#xff0c;可以把它们解释地清晰易懂。 1. 计算机的…

1003 阶乘后面0的数量

1003 阶乘后面0的数量 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KBn的阶乘后面有多少个0&#xff1f; 6的阶乘 1*2*3*4*5*6 720&#xff0c;720后面有1个0。Input一个数N(1 < N < 10^9) Output输出0的数量 Input示例5 Output示例1 //统计2和5个数就好…

《HarmonyOS实战——前端开发华为鸿蒙系统应用 OpenHarmony JS》

《HarmonyOS实战——前端开发华为鸿蒙系统应用 OpenHarmony JS》

(转)数组循环右移

设计一个算法&#xff0c;把一个含有N个元素的数组循环右移K位&#xff0c;要求时间复杂度为O&#xff08;N&#xff09;&#xff0c;且只允许使用两个附加变量。 不合题意的解法如下&#xff1a; 我们先试验简单的办法&#xff0c;可以每次将数组中的元素右移一位&#xff0c;…

Redis命令–使用Redis命令行

本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成班。 您将学习如何安装Redis并启动服务器。 此外&#xff0c;您将在Redis命令行中乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c;同时还介绍了…

前端面试官常问javaScript编程题,隔壁王大爷看了都会了

目录 1.数组排序。 2.数组元素的去重&#xff1b; 3.用递归的方法求数组的求和&#xff1b; 4.防抖节流的思路。 5.深拷贝、浅拷贝&#xff1b; 6.做一个10秒的倒计时&#xff1b; 7.setTimeout()和setInterval()的使用以及区别 导读&#xff1a;一些常见的前端面试官会让…

(五)Struts2 标签

所有的学习我们必须先搭建好Struts2的环境&#xff08;1、导入对应的jar包&#xff0c;2、web.xml&#xff0c;3、struts.xml&#xff09; 第一节&#xff1a;Struts2 标签简介 Struts2 自己封装了一套标签&#xff0c;比JSTL 强大&#xff0c;而且与Struts2 中的其他功能无缝结…

HarmonyOS常见问题解答

学习资源主要分享 一、解答学习者的担心:手机/生态设备数量 、应用数量

thinkphp3.2自定义success及error跳转页面

thinkphp3.2自定义success及error跳转页面 默认的thinkphp success及error的默认模板不是很好看&#xff0c;下面分享如何自定义success及error页面&#xff0c;这里用的是thinkphp 3.2.2版本 默认的thinkphp success及error的默认模板不是很好看&#xff0c;下面分享大家如何自…

推荐几十本投资书籍、互联网书籍及热门查看流量的工具

工欲善其事必先利其器,今天孙叫兽给大家分享一下互联网运营的书籍、投资的书籍及一些查看抖音、微信公众号等后台数据的工具,个人感觉还是很实用的,内容有点多,不知道的可以根据图中的文字进行搜索。 互联网运行推荐阅书籍 投资理财的书籍 这里仅仅提供书籍的名称,根据书名…

Java Swing模型视图适配器介体

通常&#xff0c;我基于Spring Framework构建Java应用程序。 但是&#xff0c;最近有人要求我使用与语言无关的MVC框架PureMVC为客户端实现Java桌面应用程序&#xff0c;因此以下是我在Java Swing中为PureMVC进行员工管理展示的演示实现。 如果您想继续&#xff0c;可以在GitHu…

jquery.cookie.js操作cookie实现“记住密码”

//初始化页面时验证是否记住了密码 $(document).ready(function() {if ($.cookie("rmbUser") "true") {$("#rmbUser").attr("checked", true);$("#user").val($.cookie("userName"));$("#pass").val($…

程序员跳槽指南

找工作是件非常重要的事情,它直接影响你1~2年,间接影响你3~5年的人生。⼀个潜在的机会会让你少奋斗很多年,而一次冲动的离职,会让你和千万财富错失交臂。 忘掉那些随地乱扔的小广告,还有从几十个样本做出来的所谓调查报告,换工作不是⼀场说走就走的旅行,而是⼀个深思熟虑…

NSDictionary NSArray 转中文输出

// // NSDictionaryDescribetionDictionary.m // fengzi // // Created by 谢泽锋 on 16/5/10. // Copyright © 2016年 xiezefeng. All rights reserved. //#import <Foundation/Foundation.h> //数据字典数字打印中文显示implementation NSDictionary (Describ…

vue学习经验分享,在这个大前端时代,你再不会vue就out啦

主要为大家大致的介绍Vue的介绍、环境搭建要求、如何开发等经验分享 目录 vue介绍 Vue的MVVM模式介绍 Vue之HelloWorld Vue的生命周期 从Vue到页面