zoukankan      html  css  js  c++  java
  • 恒大威武!关于SQL的一些基础知识整理回顾

    首先的首先,恒大威武!

    开始正题。

    关系代数:

    目前主流的关系型数据库,是建立在关系代数的基础上的,即他的数学支撑是关系代数。

    关系代数主要包括如下几个二目运算:并运算union、交运算intersection、差运算difference、笛卡尔积Cartesian Product.

    这里需要留意的是,笛卡尔积严格的说是广义的笛卡尔积,因为在关系型数据库中的笛卡尔积的元素是元组,所谓元组,直白的解释就是数据库中的一行,每一行是一个元组。

    数据库中专门的关系运算有如下几个:选择selection、投影projection、链接join、除运算division。

    SQL:

    SQL,即结构化查询语言,书关系型数据库的标准语言,但是每个厂商基于这个标准会有一套自己的实现。比如oracle的和mysql的。

    SQL主要有三大块:DDL和DML和DQL。

      • DDL:数据定义语言,包括create、drop等
      • DML:数据操作语言,包括insert、update、delete等
      • DQL:数据查询语言,包括select、where、order by等

    DDL:

    创建数据库:create database 数据库名

    撤销数据库:drop database 数据库名 [cascade|restrict]

      • cascade模式:直接删除数据库及其所有的表、视图、索引等元素
      • restrict模式:只有当数据库中没有任何元素的时才会删除,否则拒绝执行

    创建数据表:create table 表名 列名

    修改数据表:alter table 表名 [add 新列名][drop 完整性约束][alter column 列名]

    删除表:drop table 表名 [cascade|restrict]

    删除表时,不仅表的数据和定义被删除,相关的视图索引触发器也都被删除

      DQL:

    select语句:

      select 列 from 表 where 条件表达式 group by 列名 having 条件表达式 order by 列名 asc|desc

      and和or可以连接多个查询条件,and的优先级比or高,但是可以用括号改变优先级

    聚集函数:

      count([distinct|all] *|列名) 统计个数

      sum([distinct|all] 列名) 求和

      avg([distinct|all] 列名) 求平均

      max([distinct|all] 列名) 求最大值

      min([distinct|all] 列名) 求最小值

      如果指定distinct短语,则在计算时会取消列中的重复值,如果不指定distinct或者指定all(默认是all),则表示不取消重复值。

    分组语句:

      分组语句主要是group by子句和having子句。

      例如:查询选修了三门课以上课程的学生学号:

        select sno from sc group by sno having count(*)>3

      group by子句将查询结果按照指定列或多列分组,值相等的为一组。

      需要注意的是,数据分组后,聚集函数将作用于每一个组,即每个组都有一个函数值。上例中的count是对每一个group后的组做count。

      having子句都是跟groupby子句连用,按照自定的条件对组进行筛选,得到满足条件的组。

    having子句和where子句的区别是作用对象不同,where子句的作用对象是表中的记录,即元组,筛选满足条件的元组,而having子句的作用对象是groupby后的组,筛选满足条件的组。

    多表连接查询:

      两表连接:

        select * from s,sc where s.no=sc.no

      自身连接:一个表与其自己进行连接,称为表的自身连接

        查询每一门课程的间接先修课,即先修课的先修课。

        select first.cno,second.cpno from c first, c second where first.cpno=second.cno

      外连接:

    正常的连接操作,只会把满足条件的元组输出,如果想把连接的左表右表中不满足条件的元组也作为结果输出,在无值属性上填空值null,这种连接就叫外连接。关键字join|out join

      左外连接:列出左边表的所有元组,叫做左外连接,关键字left join|left out join

      右外连接:列出右边表的所有元组,叫做右外连接,关键字right join|right out join

      例子:

      select * from s left out join sc on(s.sno=sc.sno)

      select * from s left out join sc using(sno)

    嵌套连接查询:

      写几个嵌套查询的例子,看了应该就懂了。

        • select name from s where sno in (select sno from sc where cno='2')
        • select sno,cno from sc x where grade>=(select avg(grade) from sc y where y.sno=x.sno)

      ANY(SOME) ALL关键字:

    子查询返回单值时可以用比较运算符,如上面的>=,如果返回的是多值就没法用比较运算符,得用ANY(有的系统是some)或者all关键字,这两个关键字必须跟比较运算符连用来表达语义,any表示某个,all表示所有,主要的语义如下:

    >any    大于子查询结果中的某个值

    >all     大于子查询结果中的所有值

    <any    小于子查询结果中的某个值

    <all     小于子查询结果中的所有值

    写几个例子:

      查询其他系中比计算机系某一学生年龄小的学生姓名和年龄

      select name,age from s where age<ANY(select age from s where dept='cs') and dept<>'cs'

      查询其他系中比计算机系所有学生年龄小的学生姓名和年龄

          select name,age from s where age<ALL(select age from s where dept='cs') and dept<>'cs'

      exists谓词的子查询

        exists谓词的子查询不返回任何数据,只是产生逻辑真true和逻辑假false。

        例如:查询所有选修了1号课程的学生姓名:

        select name from s where exists (select * from sc where sno=s.sno and cno='1')

        只要子查询结果非空,则where子句就是true,否则就是false.

    集合操作:

      select语句的结果是元组集合,所以多个select语句可以进行集合操作,集合操作主要有求并union、求交intersect、求差except

      写几个例子:

      select from s where dept='cs' union select from s where age<19

      select from s where dept='cs' intersect select from s where age<19

    DML:

      insert:

        普通插入:insert into s(a,b,c) values(1,2,3)

        子查询插入:insert into s(a,b) select a,b from y.把子查询嵌套在insert语句中,生成需要插入的批量数据

      delete:

        普通删除:delete from s where a='1111'

        在查询删除:delete from sc where 'cs' = (select dept from s where s.sno=sc.sno) 删除计算机系所有学生的选课记录

      update:

        普通修改:update s set age=22 where sno='12345'

        子查询修改:update sc set grade=0 where 'cs' = (select dept from s where s.sno=sc.sno) 设置计算机系学生成绩为0

     

    周天宅家码了一些SQL方面的基础知识和细节,有用请点赞,哈哈。

    最后的最后,还是恒大威武!

  • 相关阅读:
    Java学习笔记 -StringBuffer & StringBuilder
    Java学习笔记
    java学习笔记 -数组
    关于运放采集电路如何自动切换量程电路
    仪器仪表运放的放大倍数的一些问题
    二极管、三极管和mos管使用总结
    mos管缓启动和防反接电路原理
    关于产生负电源电路
    可靠性测试之画pcb
    AD软件pcb电路板各图层的理解
  • 原文地址:https://www.cnblogs.com/lingiu/p/3416737.html
Copyright © 2011-2022 走看看