而增大操作是对一些基本发挥的简化,SQL DDL包含定义完整性约束的授命

d)外连接Outer join
外接连是接连运算的增添,能够用来拍卖缺点和失误的新闻,既自然连接中丢掉的未匹配行;在那之中left
outer join ⟕、right outer join ⟖、full outer join ⟗
分别保存左手、右边、全体的未相称行。
left outer join 的等价表明式为:
(r⋈s) ∪(r-ΠR(r⋈s))×{(null,…null)}
里头{(null,…null)}的情势是S-君越后的schema

Gcount-distinct(ID)(σsemester=”spring”∧year=2010(teaches))

3.SQL语法

a)交集(Set-Intersection Operation)
混合运算符为∩,用于寻觅多少个汇集共有的数目,比如在二零零六凉秋和20十青春都开课的课程
(semester = “Fall” ∧ year=2009 (section)

(semester = “Spring” ∧ year=2010 (section))
掺杂的等价表明式为:r ∩ s = r – (r – s)

不管是(instructor⋈teaches)⋈course照旧instructor⋈(teaches⋈course),运算结果不受连接的次第的熏陶

3.5空值

  SQL涉及空值的别样相比较运算的结果都是为unknown
         布尔类型:true false unknown
              and :  * and unknown = unknown
              or  :  true or unknown = true   false or unknown =
unknown   unknown or  unknown = unknown
              not : not unknown = unknown
      测试是或不是是空值:salary is null         salary is not null

b)Natural-Join Operation
在笛卡儿积的底蕴上,选取共有字段相等的元祖,并去除了重新的元祖。重回结果集中字段的来得顺序为:共有字段->左边境海关系的字段->右边关系的字段
查询全数老师的名称及其授课新闻的ID表明式为:
Πname, course_id (instructor⋈teaches)
接连的等价表明式为:
r⋈s = R ∪ S (r.A1 = s.A1 ∧r.A2 = s.A2 ∧ … ∧r.An = s.An (R × S))
要是LX570和S未有值同样的属性,则r⋈s = r × s.
比方要查询全体物理系助教名称及教学课程的称号则为:
Πname,title (dept_name = “Comp. Sci.” (instructor⋈teaches⋈course))
任由是(instructor⋈teaches)⋈course依旧instructor⋈(teaches⋈course),运算结果不受连接的逐条的熏陶

r⋈s = R ∪ S (r.A1 = s.A1 ∧r.A2 = s.A2 ∧ … ∧r.An = s.An (R × S))

3.3.1 内连接          

    from instructor natural join teaches  
:instructor和teaches中一样属性上值同样的元组组成的涉嫌
       from instructor join teaches using(ID) 
:instructor和teaches中壹致属性中ID属性上值同样的元组组成的涉嫌
       from student join takes on student.ID = tekes.ID
:instructor和teaches中一样属性中ID属性上值同样的元组组成的涉嫌
       eg:
              *instructor和teaches中有同等属性ID和name,
                  那么natural join
就是由ID和name都一样元组组成的关系;
                  那么join…using(ID)
正是不管name,由ID一样元组组成的涉嫌(括号里面能够带五个属性用,隔离);
              * on条件能够象征其他SQL谓词

学习资料:Database System Concepts, by 亚伯拉罕 Silberschatz, Henry
F.Korth, S.Sudarshan

left outer join 的等价表明式为:

1.SQL语言

  》数据定义语言(DDL):定义关系格局、删除关系、修改关系形式
    》数据垄断(monopoly)语言(DML):查询音讯、插入元组、删除元组、修改元组
    》完整性:SQL DDL包罗定义完整性约束的授命
    》视图定义:SQL DDL包含定义视图的命令
    》事务调整:SQL蕴涵定义事务的初阶和了结的授命
  
 》嵌入式SQL和动态SQL:定义SQL语句怎么着安置到通用编制程序语言,如C、C++、JAVA中
    》授权:SQL DDL包含定义对关乎和视图的造访权限的吩咐

聚集(aggregation)
汇集包涵min、max、average、count等操作,聚集运算的输入为值的联谊,输出为单1的值。教授的平均薪金能够象征为:
Gsum(salary)(instructor)。正确的G应该是calligraphic字体。
计算20十年阳节的执教老师数量时,必要去重:
Gcount-distinct(ID)(σsemester=”spring”∧year=2010(teaches))
总括各机关的薪水平均值时,需求按单位分组,写为:
dept_name G averge(salary)(instructor)

混合运算符为∩,用于寻觅多少个汇集共有的数量,比如在二零零六秋日和20拾青春都开课的科目

3.2查询

  单关系查询:

    eg:
                select ID ,distinct name,salary*1.1 from instructor as
inst
                where inst.dept_name =”” and salary > 7000;
            
            》distinct:去除重复,all:保留重复,暗许是保留重复;
            》子句能够涵盖+、-、*、/运算符的算术表明式;
            》where子句:and、or、not 
、<、<=、>、>=、=和<>

  多关系查询:

    eg:
                select name,instructor.dept_name,building from
instructor , department
                where instructor.dept_name = department.dept_name

c)赋值运算Assignment Operation
标识为←,与别的程序语言的赋值运算一样,←能够将1段表达式的值赋值给某些一时半刻变量,制止嵌套太多麻烦明白。比如r⋈s的等价表明式也足以写为:
temp1←R × S
temps←σr.A1 = s.A1 ∧r.A2 = s.A2 ∧ … ∧r.An = s.An (temp1)
result=ΠR ∪ S(temp2)
←能够将复杂的逻辑简化为进程式的代码,而且←必须赋值给一时变量。

贰.为主数据类型

    》char(n):固定长度n的字符串,长度不够时自动加空格;
    》varchar(n):可变长度的字符串,最大尺寸为n,不够时不会自动加空格;
    》int:整数门类;
    》smallint:小平头类型;
    》numeric(p,d):定点数,p位数字(包蕴小数位),当中d位为小数位;
    》real,double precision:浮点数与双精度浮点数;
    》float(n):精度至少为n位的浮点数。
    》date:日历日期,包含年(四人)、月、日;
  
 》time:一仲夏的时间,包涵刻钟、分和秒,time(p)钦点秒后边小数位的位数(暗中同意0);
    》timestamp:date 和time
的结缘,timestamp(p)钦命秒前面小数位的位数(暗许陆)

​除了着力的涉嫌操作,还有一对外加(Additional)的操作,因为要是只用为重运算,某些表达式会相比繁琐,而增大操作是对某个基本发挥的简化。

聚拢包涵min、max、average、count等操作,聚集运算的输入为值的会晤,输出为单纯的值。教授的平分工资能够代表为:

3.3连接

e)增加运算
广义投影(Generalized Projection)
广义投影允许在阴影运算的还要拓展算术、字符串处理的操作,比如:
Πid,name,salary*13(instructor)

错落的等价表明式为:r ∩ s = r – (r – s)

三.7嵌套子查询

    in:测试是或不是是集合中的成员
            eg:
                  select course_id from section where  semester =
‘Fall’ and year=’2009′ and
                  course_id in (select course_id from section where 
semester = ‘Spring’ and year=’2010′ );
            用于枚举:
                  select name from instructor where name not
in(‘Mozart’,’Einstein’);
            多属性:
                  select count(distinct ID) from takes where
(course_id,sec_id,semester,year)
                  in (select course_id,sec_id,semester,year from
teaches where teaches.ID =10101);
        会晤相比较:
            some:某一个
                >some:比某1个大      >=some:大于或等于某3个
                <some:小于某二个      <=some:小于或等于某三个
                =some:等于某二个      <>some: 小于或高于某二个
            all:所有
                >all:大于所有         >=all:大于或等于全部
                <all:小于全部         <=all:小于或等于全数
                =all:等于全数         <>=all:大于或低于全部
        exist:是或不是存在 (not exist)
            eg:
                select course_id from section as S where
semester=’Fall’ and year=’2009′
                and exist(select * from section as T where
semester=’Spring’ and year=’2010′ and S.course_id=T.course_id);
        重复元组测试:unique/not unique
                eg:
                        select T.course_id from course as T
                        where unique(select R.course_id from section as
R where T.course_id=R.course_id and R.year=2009);
                有重复:false
                无重复:true
        from子句的子查询:
            eg:
                select dept_name,avg_salary from (select
dept_name,avg(salary) from instructor group by dept_name) as   
                dept_avg(dept_name,avg_salary)where
avg_salary>4200;            
        with子句:
            eg:
                with dept_total(dept_name,value) as (select
dept_name,sum(salary) from instructor group by dept_name),
                dept_total_avg(value) as (select avg(value) from
dept_total)
                select dept_name from dept_total,dept_total_avg
where  dept_total.value>=dept_total_avg.valur;

广义投影允许在影子运算的同时展开算术、字符串处理的操作,比如:

3.3.2 外连接

    (①)左连接(left outer
join):保留左连接运算从前的涉嫌,之后的涉嫌并无内容的以null补足;
      (二)右连接(right outer
join):保留右连接运算之后的涉及,在此以前的关联并无内容的以null补足;
      (三)全连接(full outer
join):保留全连接运算两边的关联,无内容的关联以null补足;
      eg:
          select * from student left outer join  takes:
          select * from takes right outer from student:
               
–上边结果一致,都以突显全体的student关系,假诺takes中无对于涉嫌,则以null补足
          select * from students full outer join takes:
               
–展现整个的student和takes关系,假诺有何人无对应提到,自动以null补足

dept_name G averge(salary)(instructor)

三.1开立关系表

  通用格式:
            create table r                    r关系名
            (A1 D1,                           Ai属性名,Di属性AI的域
             A2 D2,
             …,
             An Dn,
             <完整性约束一>,
             …,
             <完整性约束一>);
        
        部分完整性约束:
            》primary
key(Aj1,Aj二,…,Ajn):声明属性Aj1,Aj二,…,Ajn构成主码。主码:必须唯一且非空;
            》foreign key(Aj一,Aj二,…,Ajn) references
s:表示关系中任意元组的属性(Aj壹,Aj2,…,Ajn)上
                的取值必须对应于关系s中某壹元组在主码上的取值。
            》not null:评释该属性上分化意空值。
        
        eg:
            create table teaches
            (
                ID varchar(5),
                course_id varchar(8),
                sec_id varchar(8),
                semester varchar(6),
                year numeric(4,0),
                tel numeric(11,0) not null,
                primary key(ID,course_id,sec_id,semester,year),
                foreign key(course_id,sec_id,semester,year) references
section,
                foreign key(ID) references instructor
            );
        删除表(关系):
            drop table r;
        扩大属性,新属性上的值为null:
            alter table r add A D;
        去掉属性:
            alter table r drop A;

标识为←,与任何程序语言的赋值运算同样,←能够将一段表明式的值赋值给有个别一时变量,防止嵌套太多麻烦明白。比如r⋈s的等价表达式也得以写为:

3.8修改

   删除:
            delete from instructor where P;
        插入:
            insert into course values(‘CS-437′,’DataBase’,’Com.Sci’,四) 
:数据按涉嫌属性顺序排列
            insert into course(course_id,title,dept_name,credits)
values(‘CS-437′,’DataBase’,’Com.Sci’,4)  :
            insert into instructor select ID,name,dept_name,18000 from
student where dept_name=’Music’ and tit_cred>144;
        更新:
            update instructor set salary = case when salary<=10000
then salary*1.05 else salary*1.03 end;
        case的1般格式:
            case
                when pred1 then result1
                when pred2 then result2
                …
                when predn then resultn
                else result0
            end

中间{(null,…null)}的形式是S-PRADO后的schema

3.3.3on与where的区别

      eg:
          select * from student left outer join  takes on
student.ID=takes.ID;
               
–on字句是外接连的一有些,以ID为两次三番条件,实行连接,若无对应提到,则以null补足
          select * from student left outer join  takes on true where
student.ID=takes.ID;
               
–where不是外接连的一有个别,先进行外接连,再实行where的挑选。

                    连接类型                        连接条件
                   inner join                       natural
                   left outer join                 on
<predicate>
                   right outer join               using (A1,A2,A3…)
                   full outer join

d)外连接Outer join

三.肆骨干运算

  更名运算:as      在from 和select前面子句都能够用
      字符串运算:
            upper(s):转变到大写    lower(s):调换到小写  
trim(s):去除前面空格     等等…
      字符相称:like    not like
            >百分号(%):相称任意子串
            >下划线(_):相称任意一个字符
               在like中用escape定义转义字符
            eg:
               select dept_name from department where building like
‘ab\%cd%’ escape ‘\’    :相称全数以ab%cd早先的字符串
      显示次序:order by
            eg:
               select * from instructor order by salary desc,name
asc;
                  :按薪给降序排序展现,在薪酬一样时按姓名升序排  
(暗中同意是升序)
      where子句谓词:
            where salary<=10000 and salary >=8000     salary
between 8000 and 10000   (not between)
            where (instructor.ID,dept_name)=(teaches.ID,’Biology’)
      集结运算:并(union) 交(intersect) 差( except)
            eg:
                (select course_id from section where semester=’Fall’ =
year=2009)
                union
                (select course_id from section where semester=’Spring’
= year=2010)
            私下认可是自动删除重复的
            如要保留重复   用union all   intersect all except all

b)Natural-Join Operation

三.陆聚集函数  分组 having子句

  >平均值:avg
        >最小值:min
        >最大值:max
        >总和:sum
        >计数:count
        sum和avg输入必须是数字集
            eg:
                select avg(salary) as avg_salary from instructor where 
dept_name=’Comp.Sci’;
        分组:group by
            eg:
               select dept_name ,avg(salary) as avg_salary from
instructor group by dept_name;
              
:先对instructor根据dept_name举行分组,再在各样组内进行select
              
*内需保障出现在select语句中但未有被集结的性质只好出现在group by中
        having子句:
            eg:
                select dept_name ,avg(salary) as avg_salary from
instructor group by dept_name having avg(salary)>4200;
              
 :先对instructor根据dept_name举办分组,再对每1组进行having筛选,之后张开select
              
 *亟需确定保障出现在having语句中但未有被集结的性情只好出今后group by中
        空值和布尔值的汇聚:
            除count外全体聚集函数都忽略空值。
          
 规定空集的count为0,其余具备聚集运算在输入为空集的气象下回到贰个空值。

查询全体老师的名称及其授课音讯的ID表达式为:

​除了基本的关联操作,还有一些附加(Additional)的操作,因为1旦只用基本运算,有个别表明式会相比繁琐,而增大操作是对有个别基本发挥的简化。

聚集(aggregation)

Gsum(salary)(instructor)。正确的G应该是calligraphic字体。

Πname, course_id (instructor⋈teaches)

在笛卡儿积的基本功上,选取共有字段相等的元祖,并去除了重新的元祖。再次来到结果集中字段的来得顺序为:共有字段->右边关系的字段->左侧关系的字段

e)扩张运算

一经要询问全体物理系教授名称及教学课程的名号则为:

(semester = “Fall” ∧ year=2009 (section)

temps←σr.A1 = s.A1 ∧r.A2 = s.A2 ∧ … ∧r.An = s.An (temp1)

连年的等价表明式为:

广义投影(Generalized Projection)

c)赋值运算Assignment Operation

a)交集(Set-Intersection Operation)

result=ΠR ∪ S(temp2)

temp1←R × S

学习资料:Database System Concepts, by 亚伯拉罕 Silberschatz, Henry
F.Korth, S.Sudarshan

总括各部门的薪俸平均值时,必要按部门分组,写为:

Πname,title (dept_name = “Comp. Sci.” (instructor⋈teaches⋈course))

总括20拾年春天的任课老师数量时,供给去重:

(r⋈s) ∪(r-ΠR(r⋈s))×{(null,…null)}

只要奇骏和S未有值一样的天性,则r⋈s = r × s.

外接连是连接运算的强大,能够用来处理缺点和失误的音信,既自然连接中丢掉的未相配行;在那之中left
outer join ⟕、right outer join ⟖、full outer join ⟗
分别保存左手、左边、全体的未相配行。

(semester = “Spring” ∧ year=2010 (section))

Πid,name,salary*13(instructor)

←能够将复杂的逻辑简化为进度式的代码,而且←必须赋值给一时变量。

相关文章