您的位置:金沙游乐场85155 > 大数据库 > SQL总结

SQL总结

发布时间:2019-10-02 09:53编辑:大数据库浏览(198)

    范式一:保证数据库之中表每一列的原子性{如果 某一列 出生地的内容:湖南-长沙-芙蓉区 ,这种数据已然背离了  第一范式,此时应该设计多张表    }

    primary key(主键约束)

    表级方式定义主键

    create table student( 
        name varchar2(19),
        sex varchar2(10),
        age integer,
        constraint student_age_pk primary key(age)
        );
    

    把age定义为主键(student_age_pk:约束的名字有一定的规范:表名主键名约束类型)

    列级方式定义主键

    create table student( 
       name varchar2(19) primary key,
       sex varchar2(10),
       age integer);
    

    范式一:保证数据库之中表每一列与主键直接相关 **{如果 某一行之中数据描述的是一个学生的实体包括   {id name sex age classid }  如果再多加一列 classname  这种数据已然背离了  第三范式,此时应该设计多张表 }**

    foreign key(外键约束)

    create table emp(
       empno number(4), 
       ename varchar2(10) not null, 
       job varchar2(9),
       deptno number(7,2) not null, 
       constraint emp_deptno_fk foreign key(deptno) references dept (deptn)
       );
    

    --references dept (dept):外键所对应的主键所在的表 关键字 主表 主键

     

    数据模型

    按照计算机系统的观点对数据进行建模。

    DDL数据定义语言【create  drop  alter  declare  】

    两张表中的数据运算

    金沙85155登入 1

    select kc.mc "种类",kc.s1-(select sum(s1) from ck where ck.mc = kc.mc ) "剩余量" from KC;
    

     

    子查询

    • 子查询在主查询的前一次执行
    • 主查询使用子查询的结果
    • 子查询要用括号括起来
    • 将子查询放在比较运算符的右边
    • 子查询中不要加ORDER BY子句

    应用场景:例如那些雇员的工资比林志玲的高?

    3.数据完整性分类

    域完整性

    实体完整性

    自定义完整性

    引用完整性

     

    数据库设计范式

    数据库设计范式简单的说就是关系数据库在设计时需要遵循的一种规范,数据库范式按照要求从低到高分为6大范式,即第一范式(1NF)~第六范式(6NF)。在第一范式的基础上进一步满足更多要求的称为第二范式,一次类推。越高的范式数据库冗余越小,一般来说,数据库只需要满足第三范式(3NF)就行了。

    5.7大约束

    唯一约束【允许一个空】UNIQUE

    主键约束【不允许空,最少性,稳定性】PRIMARY KEY

    检查约束  CHECK

    自定义约束 

    默认约束  DEFAULT

    非空约束  NOT NULL

    外键约束 FOREIGN KEY

     

     

    多表联查

    购买数量超过一个的产品名,顾客名以及购买的数量(3张表)
    select * from products;
    select * from customers;
    select * from purchases;

    • 第一种方法

      select * from customers c inner join (select * from products p inner join purchases pr on p.product_id=pr.product_id) a on a.customer_id=c.customer_id where a.quantity>1;
      
    • 第二种方法

      select * from (products p inner join purchases pr on p.product_id=pr.product_id and pr.quantity>1) inner join customers c on c.customer_id=pr.customer_id;
      
    • 第三种方法

      select * from products p,purchases pr,customers c where p.product_id=pr.product_id and pr.customer_id=c.customer_id and pr.quantity>1;
      

     

     

    添加注释

    comment on table 表名 is ‘注释’;--表添加注释
    comment on column 表名.字段名 is ‘注释’;--字段添加注释

    1.数据库设计三大范式

    内连接:返回符合特定连接条件的查询记录
    • 等值连接:返回符合指定连接条件的值,这些值是相等关系

      select * from products p,product_type pt where p.type_id = pt.type_id;
      select * from products p inner join prodect_type on p.type_id = pt.type_id;--inner join on 条件
      
    • 非等值连接:返回符合指定连接条件的值,这些值不是相等关系

      select * from products p,product_types pt where p.product_type_id <> pt.product_type_id;--<>:不等于
      
    • 自然连接:特指在同一张表内通过特定连接条件查询符合连接条件的值

    金沙85155登入 2

    select * from products p natural inner join purchases pt;--自动按着相等的去连接,不用加条件了 在emp中每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,自身也有自己的mgr。我们需要将每一个员工自己的名字和经理的名字都找出来。
    select worker.ename,'work for',manager.ename from emp worker,emp managetr where worker.mgr = manager.empne work for:连接字符串
    

    4.数据完整性保持手段:约束

     

     

    语法的执行顺序

    1.select 2.from 3.where 4.group by 5.组函数 6.having 7.order by

    说明:having与where功能一样,就是执行的顺序不一样eg:select e.division_id,avg(e.salary) from employees2 e group by e.division_id where avg(e.salary)>150000;--会报错的,因为where比组函数(avg)先执行,在执行where的时候,avg(e.salary)还没有算出来,所以会出错,换成having就没事了。

    • insert into(插入语句)
      插入时注意完整性约束条件(外键的取值)
      插入的时候插入到首行

      insert into 表名(插入的字段)values(字段对应的值)
      insert into student values(3,'name','sex',12); 
      insert into student(id,name) values(4,'name'); 
      insert into student values(5,'''name','sex',12);
      

    插入的名字为'name insert into student(name,sex) values(&Name,'nan');
    &:变量,在执行该语句时,会让你输入name要插入的值(Name变量名自己起的) 一次插入多条语句,要查入得值从另一个表中取数据 insert into student(name,sex,age) select name,sex,age from student2 where id>10;

    • delete(删除语句) : delect from 表名 条件

      delect from student where id=3
      
    • update(修改语句) : update 表名 set 字段名=要修改的值 条件

      update student set name=gfdd where id=2;
      update studnet set name=gggg,sex=nv where id=3;
      

    DCL数据控制语言【revoke  grant】

    四表联查

    有如下几张表:

    部门表:organization(orgid ,orgName)
    商品表:Goods(goodsid,goodsName)
    销售单(单头):sale(billid,billdt,orgid,status)
    销售单(单体):sale_item(billid,goodsid,qty)

    orgid:组织编码;
    orgName:组织名称;
    billid:单据编号
    billdt:订单日期

    金沙85155登入,查询“销售一部”本月的商品销售明细(商品编码。商品名称,销售日期,销售数量)

    select * from organization o,goods g,sale s,sale_item si 
    where 
    o.orgid=s.orgid and g.goodsid=si.goodsid ands.billid=si.billid and orgName="销售一部" and billdt>trunc(sysdate) and billdt < last_day(sysdate);
    

    6.查询方式

    选择  【int()  not in()  between   and     】

    模糊  【通配符: %   _   *     】

    筛选  【where  like  = 】

    排序  【order by  】

    聚合  【count  sum  avge  max  min   】

    分组  【group by 】

    连接  【 内连接  外连接  全连接  交叉连接  】

    子查询  【select  * from  A   where id not in (select  id from A where id>=10)】

     

     

     

     

     

     

     

     

     

     

     

     

    order by

    • 使用order by可以将记录进行排序
    • ASC:升序(默认的),DESC:降序排列
    • order by 只能放到所有select语句的最后

    select name,sex,age from student order by age asc:按照age进行降序排列
    select name,sex,age,sal from student order by age asc,sal desc:按照age降序排列,如果相等则在按照sal升序排列

    **范式一:保证数据库之中表每一列与主键有关{如果 某一行之中数据描述的是一个学生的实体包括   {id name sex age classid }  如果再多加一列 光照强度 这种数据已然背离了  第二范式,此时应该设计多张表    }**

    通用函数

    • nvl(value,srt):如果第一个参数不为null,就返回第一个参数,如果为null就返回第二个参数

      select nvl(e.name,'name is null') from employee e;
      
    • nvl2(value,x,y):如果value为null就返回y,否则返回x

      select nvl2(s.class_id,1,2) from students s;
      
    • nullif(x,y):如果相等返回null,不相等则返回x;

      select nullif(s.sex,'男') from students s;
      

     

    目录

    金沙85155登入 3

    DML数据管理语言【insert  update  select  delete】

    一次修改多条记录
    update employees e set e.salary = 
    case e.employee_id
      when 1 then 5555
      when 2 then 6666
    end
    where e.employee_id<3;
    

    6.T-SQL组成

    多表连接查询中的连接类型

    金沙85155登入 4

    2.数据的特点:正确,可靠,完整

    多行子查询

    • 查询结果为多行
    • 多行子查询只能使用多行比较运算符

      IN:等于列表中的任何值
      ANY:比较子查询返回的每一个值,只要其中一个满足条件就返回true
      ALL:比较子查询返回的每一个值,要其中所有的值都满足条件才返回true

    使用IN:

    select empno,ename,job from emp where deptno in(select deptno from emp where ename = 'SMITH' or ename ='MITLER');
    

    使用ANY

    • <ANY : 指小于最大值

    • ANY : 指大于最小值

    • ANY:与IN等价

      select empno,ename,job from emp where sal <ANY (select sal from emp where job = 'clerk')
      

    使用ALL

    • <ALL : 指小于最小值
    • ">ALL" : 指大于最大值
    select empno,ename,job,sal from emp where sal > ALL(select avg(sal) from emp GROUP BY depton)
    

    类型转换函数

    数据类型转换包含隐士类型转换和显示类型转换
    隐士类型转换:系统自动转换
    显示类型转换:调用相应的函数转换

    TO_CHAR:字符串转换(其他类型转换为字符串)
    TO_NUMBER:数值转换
    TO_DATE:日期转换

    • TO_CHAR

    将日期转换为字符串格式
    必须用单引号括起来,大小写不敏感
    有一个fm元素,用于填补空格或者禁止前面的零
    使用逗号分离日期
    TO_CHAR(date,'fmt')
    常用的日期格式:
    YYYY:四位数表示的年
    YEAR:拼写出的年
    MM:两位数字的月
    MONTH:全月明(例如:sepember)
    DD:两位数字表示的月
    DAY:全天名

    select name,TO_CHAR(hiredate,'fmDD Month YYYY') HIREDATE from emp
    
    • TO_NUMBER:将字符串转化为数值TO_NUMBER(char)

      select * from emp where deptno = TO_NUMBER('30')
      
    • TO_DATE:将字符串转换为日期TO_DATE(char,['fmt'])

      select TO_DATE('2006-05','YYYY-MM') from DUAL
      

    oracle有如下类型的约束:

    not null:非空
    primary key:主键约束
    foreign key:外键约束
    check:检查约束
    unique key:唯一性约束

    数值处理函数

    • 1.round:保留指定的位数(按四舍五入)

      SELECT round(5.75), round(5.75, 1), round(15.75, -1) FROM dual;--1代表保留一位小数,-1表示个位也四舍五入
      
    • trunc:直接去掉小数点,没有四舍五入

      SELECT trunc(5.75), trunc(5.76, 1), trunc(15.75, -1) FROM dual;--1表示保留一位小数,直接去掉后面的,不四舍五入
      
    • mod:去余数

      select mod(1600,300) from dual;--返回结果为100
      
    • abs:去绝对值

      select t.quotedprice -100 from order_details t where t.ordernumber =354 and t.productnumber = 13;--返回
      
    • sign(x)返回x的符号

    若x<0,返回-1;若x=0,返回0;若x>0,返回1

    • floor(x)返回小于或等于x的最大整数

      select floor(5.8),floor(-5.6) from dual;
      
    • ceil(x)返回大于或等于x的最小整数

      select ceil(5.8),ceil(-5.6) from dual;
      
    • power(x,y)返回x的y次幂

    第一范式

    是数据库设计的最基本的要求,不满足1NF的数据库不是关系型数据库
    所谓第一范式就是指数据库表的每一列都是不可分割的基本数据项,同一列中只能有一个属性(也就是说一个属性下不能再分出其他的属性来)

    关注微信公众号获取更多相关资源

    金沙85155登入 5

    Android小先生

    实体完整性约束

    每个实例或者行的主键都不能为空

    单行子查询

    • 查询结果为一行

    • 单行子查询只能使用单行比较运算符 =,>,>=,<,<=,<>

      select name,job from emp where job = (select job from emp where empno = 7369);
      select ename,job,sal from emp where sal=(select min(sal) from emp)
      

    现实世界的实体进入数据库

    • 1.讲现实世界中的客观对象抽象为概念模型
    • 2.把概念模型转化为某一DBMS(数据库管理系统)支持的数据模型

    概念模型

    也称为信息模型,即按照用户的观点来对数据和信息建模

    • 实体(Entity):客观存在并可互相进行区分的事物称为实体
    • 属性(Attribute):实体所具有的某一特性称为属性,一个实体可有若干个属性来刻画。
    • 键(KEY):唯一标识实体的属性集称为键,一般分为超键、候选键、主键以及外键。
    • 域(Domain):属性的取值范围称为该属性的域。
    • 实体型(Entity type):用实体名以及其属性名集合来抽象和刻画同类实体称为实体型
    • 实体集:同型实体的集合称为实体集
    执行sql语句变成为:
    select
     t_date, 
     (select count(*) from t where t_status='胜' and t_date=e.t_date) 胜, 
     (select count(*) from t where t_status='负' and t_date=e.t_date) 负
    from t e group by t_date order by e.t_date;
    

    SQL语句

    • 常用数据类型 2.子查询(单行子查询和多行子查询)
    • select语句 条件查询 模糊查询 简单去掉重复的查询结果 关于空值
    • order by
    • 单行函数
    • 字符函数
    • 数值处理函数
    • 日期处理函数
    • 类型转换函数
    • 通用函数
    • 组(聚合)函数
    • 语句的执行顺序
    • insert
    • detect
    • update
    • 事务与锁
    • DDL语句(数据定义语言)
    • 多表联合查询
    • 集合
    • 视图
    • 约束条件
    • 添加注释
    • 索引
    • 经典案例

    索引

    使用索引大大加快查询的速度
    对数据量大的,经常使用的表才去创建索引(需要维护的)
    查询的时候与正常的一样

    create index 索引名 on 表名(字段名。。。。);--创建索引delete index 索引名;--删除索引

    第三范式

    要求一个数据库表中不包含已在其他表中已包含的非主关键字信息(非主键属性不能出现在第二张表中)

    非主键属性重复了,完全可以根据编号(主键)去查询部门简介和名称

    本文由金沙游乐场85155发布于大数据库,转载请注明出处:SQL总结

    关键词:

上一篇:没有了

下一篇:T-SQL:基础练习(杂)