数量的完整性

1.数据库设计三大范式

图片 1

#实业的完整性

概述:  实体:即表中的一行(一条记下)代表叁个实体(entity)
实体完整性的功能:标志每一行                数据不另行

自律类型有:主键约束 primary key      独一约束 unique   自动增进列
 auto_increment 

  *主键约束

            注:每种表中要有多个主键。特点:数据独一,且不可能为null。

            第一种丰裕格局:

                 CREATE TABLE student( id int primary key, name
varchar(50));

            第三种丰富格局:此种方式优势在于,能够创立联合主键

                 CREATE TABLE student(id int,name varchar(50),primary
key(id));

                 CREATE TABLE student(classid int,stuid int,name
varchar(50),primary key(classid                           ,stuid));

           第两种丰裕格局:

                 CREATE TABLE student(id int,name varchar(50));

                  ALTER TABLE  student  ADD PRIMARY  KEY (id);

*独一约束

        特点是不能够再一次

        create table student(id int primary key,name varchar(255)
unique);

*自行增加列

       sqlserver数据库(identity)     oracle数据库( sequence)��

       给主键加多自动增进的数值,列只可以是整数类型

      create table student(id int primary key auto_increment,name
varchar(255));

范式一:保障数据库之中表每一列的原子性{要是 某一列 出生地的剧情:青海-纽伦堡-桑植县 ,这种数据已然背离了  第一范式,此时应当设计多张表    }

目录

图片 2

#域完整性

  域完整性的功效:限制此单元格的多寡准确,不对照此列的任何单元格比较 域代表当前单元     格 域完整性约束:数据类型   非空约束(notnull)
 默许值约束(default)    check约束(mysql不支  
 持)check(sex=’男’orsex=’女’)

  *数据类型

     数值类型、日期类型、字符串类型

  *非空约束  not null  

      CREATE TABLE student( Id int pirmary key, Name varchar(50) not
null, Sex varchar(10));

      INSERT INTO  student values(1,’tom’,null);

  *暗中同意值约束

      CREATE TABLE student(Id int pirmary key,Name varchar(50) not
null,Sex varchar(10) default       ‘男’);

       insert into student1 values(1,’tom’,’女’);

      insert into  student1 values(2,’jerry’,default);

 

简介

在Android中存放数据不常会用到数据库,Android给大家提供了
一多元的API来操作数据库,特别轻便,大家只供给输入相应的SQL语句,以至不懂SQL语句,只传入对应的参数就能够使用。还应该有一部分第三方库,如GreenDao,OrmLite等都不小的简化了对数据库的一些操作。那样尽管大家不须要对数据库有多询问一样能兑现效果与利益,但是在直面复杂操作时,对SQL语句的熟识应用就显得极度关键了。因为在Android我们只如果应用SQL语句对表操作,所以本文主要介绍SQL的施用,只是简短介绍了数据库一些有关的定义,那样能有越来越分明的认知。

#引用完整性(参照完整性)

    外键约束:  foreing     key

     分清主次关系  外键依赖主键    先有主键  再有外键

      语法   

         CONSTRAINT 约束的名字   FOREIGN KEY(约束的字段) REFERENCES
主表(约束字段)

        ALTE帕杰罗  TABLE  次表名称  ADD CONSTRAINT 约束的名字 FOREIGN
KEY(约束的字段)               REFERENCES   主表(约束的字段);

    例:

    CREATE TABLE student(sid int pirmary key,name varchar(50) not
null,sex varchar(10)                   default‘男’);

    create table score(id int,score int,sid int ,
–外键列的数据类型绝对要与主键的等级次序一致

    CONSTRAINT fk_score_sid foreign key (sid) references student(id));

   第三种丰富外键格局。

    ALTER TABLE score1 ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid)
REFERENCES     stu(id);

**范式一:保证数据库之中表每一列与主键有关{假若 某一行之中数据描述的是三个学员的实业满含   {id name sex age classid }  固然再多加一列 光照强度 这种数据已然背离了  第二范式,此时应有设计多张表    }**

数据模型

依据计算机种类的视角对数码进行建立模型。

 

概念模型

也叫做音信模型,即遵照用户的意见来对数据和消息建模

  • 实业(Entity):客观存在并可相互开始展览区分的东西称为实体
  • 品质(Attribute):实体所负有的某一特色称为属性,叁个实体可有若干天脾气来描写。
  • 键(KEY):独一标志实体的品质集称为键,一般分为超键、候选键、主键以及外键。
  • 域(Domain):属性的取值范围称为该属性的域。
  • 实体型(Entity
    type):用实体名以及其属性名群集来抽象和描绘同类实体称为实体型
  • 实业集:同型实体的集纳称为实体集

范式一:保证数据库之中表每一列与主键直接有关 **{要是 某一行之中数据描述的是四个学员的实体包蕴   {id name sex age classid }  假诺再多加一列 classname  这种数量已然背离了  第三范式,此时理应设计多张表 }**

切实世界的实业步向数据库

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

2.数额的风味:准确,可信赖,完整

键的概念

  • 超键(super
    key):在关乎中能独一区分实体的习性集称为涉及方式中的超键。
  • 候选键(candidate
    key):不含有多余属性的超键(每四本品质都能分别实体)
  • 主键(primary key):用户选作区分实体发的一个候选键(foreign key)
  • 外键:在某些关系A中的主键出现在另一个涉及B中,此时波及A中的该主键称为关系B中的外键。

事例表明:
员工(居民身份证号、姓名、年龄、性别)假诺姓名也是独一的超键:居民身份证号、姓名、姓名+年龄、姓名+性别、居民身份证号+年龄、身份ID号+性别候选键:身份ID号、姓名

 

数据库设计范式

数据库设计范式简单来说正是关周全据库在规划时须要根据的一种标准,数据库范式依据需要从低到高分为6大范式,即首先范式(1NF)~第六范式(6NF)。在第一范式的基础上越发满足越多供给的称为第二范式,一遍类推。越高的范式数据库冗余越小,一般的话,数据库只需求满足第三范式(3NF)就行了。

3.数据完整性分类

域完整性

实体完整性

自定义完整性

援用完整性

 

首先范式

是数据库设计的最宗旨的渴求,不知足1NF的数据库不是关系型数据库
所谓第一范式便是指数据库表的每一列都以不可分割的为主数据项,同一列中不得不有二个性情(也正是说贰脾本性下无法再分出别的的性情来)

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

 

 

第二范式

其次范式是在第一范式的根底上创立起来的,即满足2NF必须先知足1NF
只现出在复合主键的数据库表中
第二范式供给数据库表中的每一个实例或然行必须能够被独一地分别,所以实体必须安装主键,而且实体的品质必须完全注重于主键,不得出现非主键属性部分注重于主键的意况。

主键为学号+课程名称,而学分注重于学号,这正是所谓的非主键属性注重于主键的图景,那是不相符2NF的,现身了多少的冗余(存款和储蓄多余的数量,浪费空间),化解办法正是拆成3张表。

5.7大约束

独一约束【允许二个空】UNIQUE

主键约束【不容许空,最少性,牢固性】PKugaIMA宝马7系Y KEY

检查约束  CHECK

自定义约束 

暗许约束  DEFAULT

非空约束  NOT NULL

外键约束 FOREIGN KEY

 

 

其三范式

渴求一个数据库表中不富含已在别的表中已带有的非主关键字消息(非主键属性不可能现身在第二张表中)

非主键属性重复了,完全能够根据编号(主键)去询问部门简单介绍和称号

6.T-SQL组成

数据库设计的完整性约束

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

实业完整性约束

各种实例大概行的主键都无法为空

DCL数据调节语言【revoke  grant】

仿效完整性约束

外键可认为空值;当外键不为空时,其取值只可以等于参照的主键的某部值

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

数据库的约束

封锁是表级强制推行的条条框框,当表中数量有互赖性时,能够尊敬数量不被删除

 

 

封锁的种类:

  • 表级约束和列级约束,他们相互在职能上从未有过其他的界别,但常见假设有些约束用于于不断八个列时,只好选择表级约束的款型来拓展表述,若是多少个字段组成耨表的一块儿主键时。
  • 列级约束: 在概念列的时候:列名 约束类型 表级约束
    在概念完全数的列后:列名,列名,。。。 约束类型

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)】

 

 

 

 

 

 

 

 

 

 

 

 

oracle有如下类型的牢笼:

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

not null(非空约束)

create table student(
     name varchar2(10), 
     sex varchar(5) not null, 
     age integer)

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);

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):外键所对应的主键所在的表 关键字 主表 主键

SQL语句

  • 常用数据类型 2.子查询(单行子查询和多行子查询)
  • select语句 条件查询 模糊查询 轻巧去掉重复的询问结果 关于空值
  • order by
  • 单行函数
  • 字符函数
  • 数值处理函数
  • 日子管理函数
  • 类型调换函数
  • 通用函数
  • 组(聚合)函数
  • 讲话的施行各类
  • insert
  • detect
  • update
  • 事务与锁
  • DDL语句(数据定义语言)
  • 多表联合查询
  • 集合
  • 视图
  • 封锁规范
  • 丰硕注释
  • 索引
  • 出色案例

常用数据类型

  • varchar2(size):可变长度的字符串,最大尺寸为size个字节,size最大值为6000,最小值为1
  • char(size):固定长度的字符数据,其尺寸为size个字节,最大值为贰仟,最小值和暗中认可值为1,不管实际的尺寸为多少都会分配钦赐的size个字节
  • number(p,s):有效位数为p且精度为s的数值(小数点后有s位)p的取值范围为1到38
  • date:有效日期范围从公元前4712年七月到公元后4712年7月三12日
  • long:可变长度的字符数据,其尺寸可达2G个字节

查询

子查询

  • 子查询在主查询的前一回实施
  • 主查询使用子查询的结果
  • 子查询要用括号括起来
  • 将子查询放在相比运算符的左臂
  • 子查询中毫无加OENVISIONDEEscort BY子句

利用场景:举个例子那多少个雇员的工薪Billing志玲的高?

单行子查询

  • 查询结果为一行

  • 单行子查询只好选取单行对比运算符 =,>,>=,<,<=,<>

    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)
    

相关子查询

图片 3

多行子查询

  • 询问结果为多行
  • 多行子查询只可以使用多行相比运算符

    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)

SQL语句

  • select语句

select 列名 form 表名select name from student
select * from student :查询全部的列
select name,sex from student

  • select name as myname from student:队列中应用小名

    • 询问结果显示的列用小名呈现(as 用别称展现)
    • 在此之前是结果列名叫name as后为myname
    • 不写as就要加引号恐怕空格:select name “myname” form student
  • 列使用算数表明式:

    • select name,sal,sal+100 from student: 查询sal和sal+100
  • 至于空值

    • 空值为不可用,不精晓,不适用的值
    • 空值不等于0只怕空格
    • 含有空值的算数表达式等于空
  • 连日来操作符

    • 可将列也许字符与另外列连接起来,用双竖线标志(||)
    • 暴发的结果是贰个字符表明式
    • 运用连接操作符查询,重返结果是三个总是后的结果(每一个结果的总是)
    • select name || sex as new from
      student:将name和sex的询问结果连接起来突显并安装查询结果对应的列名字为new
  • 回顾去掉重复的询问结果

    • 选取distinct关键字能够是某列中重复的值不展现
    • distinct操作会引起排序,通过排序去掉重复的笔录
    • distinct必须放在第一列的前边,只可以兑现单列去重
    • select distinct sex from student
  • 标准查询

    • select 列名 from 表名 where 条件
    • where前面无法动用小名
  • 混淆查询

    • 行使like运算符进行通配查询
    • 询问条件能够分包文字字符或数字
    • %:表示0或多个字符
    • _:表示多少个字符

    select name from student where name like ‘S%’
    :只展现以S早先的真名
    select name from student where name like ‘_A%’
    :只展现第二个字符为A的名字
    select naem from student where name like ‘%A_B%’
    :只显示含有A_B的名字(\:转义字符)

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升序排列

单行函数

  • 用来操作数据项
  • 尚可参数并重返一个值
  • 对每二个回到行起作用,每一行重返三个结实
  • 可利用转变函数修改数据类型
  • 可选取嵌套方式
  • 广阔的单行函数富含字符、数字、日期管理函数、类型转变函数、逻辑管理函数等

字符函数

  • lower:将字符串全体化为小写

    select name,sex from student where LOWFR(name) = 'blake'; 查询姓名为blake的相应属性,不管姓名是大小写还是大小写混写的都能查出
    
  • upper:将字符串全部制改正为大写

  • initcap:将字符串的率先个字母变为大写

  • concat:将八个字符串拼接起来

  • substr:截取字符串

    select substr('helloword',2,5) from dual;--从第二个开始数5个
    
  • length:重返字符串的长短

    select length(t.empfirstname) from employee t;
    
  • instr:在四个字符串中定位子字符串的地方(未有的话再次来到值为0)

    select instr('hellword','w')from dual;--查询w在hellword中的位置
    
  • 左补齐函数(lpad)

  • 右补齐函数(rpad)

    select e.empfirsname,rpad(e.empfistname,10,'&') from employees e;--设置长度为10,不够的用&补齐
    
  • replace:替换函数

    select replace('ABCDFG','D','www') from dual;--用www替换D
    
  • trim(leading|trailing|both y from x):从x中截去单个字符y

  • both:截去两侧的;leading:从左边;traiing:从右侧

    select trim(both 'h' from 'hooojdhh') from dual;--截去两边的h
    

数值管理函数

  • 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次幂

日期管理函数

  • sysdate:重临系统的脚下时光

    select sysdate from dual;
    
  • add_months(x,y):重返x加上y个月的结果,借使y为负值,正是减去

    select add_months(sysdate,10) from dual;
    
  • last_day(x):重返满含x月的末梢一天

    select last_day(date '1993-04-28') from dual;--返回结果为1993-04-30
    
  • next_day(x,day):从x时间开始,重回下八个day的时日值

    select next_day(sysdate,'星期一') from dual;--从系统的当前时间开始,返回下一个星期一的日期
    
  • months_between(x,y):重回x和y之间有几个月(x-y),能够是负数

    select months_between(sysdate,date '1993-04-28')/12 from dual;--计算出某个人的周岁
    
  • round(date,month/day):

Month 1-十八日算前些日子,八日后算下二个月
Year 1-4月算下半年,7-5月算前一年

select round(date'2014-7-16','month') from dual;--返回2014-8-1 select round(date'2014-7-16','year') from dual;--返回结果为2015-1-1
  • trunc

    select trunc(date'2014-7-16','month') from dual;返回结果为2014-7-1
    

类型转变函数

数据类型转变包蕴隐士类型调换和显示类型调换
隐士类型转变:系统活动转换
来得类型调换:调用相应的函数转变

TO_CHALacrosse:字符串调换(别的类型转换为字符串)
TO_NUMBEKuga:数值转换
TO_DATE:日期转变

  • TO_CHAR

将日期转变为字符串格式
务必用单引号括起来,大小写不灵敏
有多少个fm元素,用于补充空格大概禁止前边的零
行使逗号分离日期
TO_CHAR(date,’fmt’)
常用的日子格式:
YYYY:二个人数表示的年
YEARubicon:拼写出的年
MM:两位数字的月
MONTH:全月明(例如:sepember)
DD:两位数字代表的月
DAY:全天名

select name,TO_CHAR(hiredate,'fmDD Month YYYY') HIREDATE from emp
  • TO_NUMBERAV4:将字符串转化为数值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
    

通用函数

  • 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;
    

case表明式:(选拔说明式)

Case国际sql通用支持的,使用case可移植越来越好。约等于在SQL中施行if语句 CASE
可用于允许使用有效表明式的大肆语句或子句。 举例,能够在
SELECT、UPDATE、DELETE 和 SET 等语句以及 select_list、IN、WHERE、O宝马X5DER
BY 和 HAVING 等子句中央银行使 CASE。

select e.salary,
case e.type_id
   when 1 then e.salary*2 
   when 2 then e.salary*3
   when 3 then e.salary*4 
    eles e.salary*5
end 
as new_salary from employee e;

说明:当typeid为1时,薪水2,当typeid为2时,薪水3,当type_id为3时,薪水4,其他情状下薪金5;

组(聚合)函数

  • max(),min().avg():注意单行与多行无法放在一块儿

    select max(e.aslary),e.type_id from employee e;--会直接报错的,单行结果与多行不能放在一起
    
  • count:计算函数 : 计算字段时不总结null的

    select count(*) from employee;--统计该表一共有多少条记录(里面加任意的数字也可以count(2))
    select count(e.manager_id) from employee e;--按照某个字段统计,空值不统计
    
  • group by:分组
    重组分组函数使用
    group
    by前边的列可以不出新在select后面,但出现在select前面包车型地铁列必须出现在group
    by子句里面
    若果select列表中既有普普通通列又有分组函数,则必须利用group by子句
    汇集分组函数的准则限制不可能运用where,只好使用having,且用了having必须利用group
    by。

    select e.division*id,avg(e.salary) from employees2 e group by e.division*id;--求每个部门的工资
    

语法的进行各类

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)>1四千0;–会报错的,因为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;
    

事务

一组sql语句一块实施,要么一同成功,要么一同战败 以commit初始

  • commit:提交eg:commit

  • rollback:回滚(撤销)eg:rollback

    commit;select * from customers;insert into customers values(6,'gfd','red',date '1993-04-28',null);
    insert into customers values(7,'gfd','red',date '1993-04-28',null);
    savepoint A;--添加保存的点,回滚时可以指定到该位置
    insert into customers values(8,'gfd','red',date '1993-04-28',null);
    savepoint B;
    insert into customers values(9,'gfd','red',date '1993-04-28',null);
    rollback to A;--回滚到A点
    

锁:保险数据库的一致性(同步):自增加锁

T1试行 update students set name=’gfd’ where id=3;
如果T2想修改id=3的数据,必须等T1提交后本事修改(也正是说提交后自动释放锁)

死锁

T1 update students set name='gfd' where id=3;
update students set name='gfd' where id=4; T2 update students set name='gfd' where id=4; 
update students set name='gfd' where id=3; 

证实:在T1,T2奉行完第一条语句时,再施行下一条语句时,都被各相互锁着,所以都没办法实践下去了。
就涌出了死锁的情景,oracle数据库会自行解锁一条语句

DDL语句(数据定义语言)

对表的操作能够经过DDL语句进行,富含:

  • create:创制新表,必须以字母初阶,访谈别的用户的表时需求增加用户名的前缀

    create table dept(deptno number(2),dname varchar2(14),loc varchar2(3));
    create table dept30 as select empno,ename,sal*12 ANNSAL,hiredate from emp where deptno=30;--数据从别的表中拷贝
    
  • 制造联合主键的表

    create table emp( emp_id integer, emp_name varchar2(20) not null, emp_bir date default sysdate primary key(emp_id,emp_name) );
    
  • alter:更换表的协会(字段)

alert table 表名 add (扩张的列名 类型,。。。。。);–增添列
alert table 表名 modify (修改的列名 类型);–修改列
alert table 表名 rename column 要修改的列名 to 新的列名;–修改列名
alter table 表名 rename to 新的表名;–修改表名
alert table 表名 drop column 要删减的列名;–删除列
alert table dept30 add (job varchar2(9));
alert table dept30 modify (job varchar2(15));
alert table dept30 raname column deptname to dname;alert table dept30
drop column job;

  • drop:删除表

表中的全体数据将被剔除
东西被活动提交
具有的目录被剔除
不能够回降
到底删除表
drop table 表名;–删除内定的表

  • truncate:急速删除表中的具有记录

直白删除全数的笔录,无法内定删除条件
心有余而力不足回落
只会去除数据,会保留表的结构(字段),能够再一次插入数据
速度快于delect
truncate table 表名;–删除内定的表

封锁规范

  • primary key(主键约束)

    • 在创造的表的时候钦命

      create table emp(emp_id integer primary key)
      
    • 在表创立达成后增多主键约束

      alter table stu add primary key (emp_id);
      
  • foregin key(外键约束)

    • 两张表未有树立外键关系

      alter table stu add foregin key(stu_id) references xi(xi_id)
      
    • 剔除此而外键的时候,相应表中与该外键的有关的笔录也整个删减

      alter table stu add foregin key(stu_id) references xi(xi_id) on delete cascade
      
    • 删去外键的时候,相应表中与该外键的关于的列全体装置为null

      alter table stu add foregin key(stu_id) references xi(xi_id) on delete set null
      
  • unique(不能够再度约束)

    alter table emp add unique(emp_name);--可以插入null(null值可以重复)
    
  • check(取值范围约束)

    alter table emp add check(em_sex in ("男","女"));alter table emp add check(em_id>0);
    

索引

行使索引大大加快查询的快慢
对数据量大的,平常使用的表才去制造索引(要求维护的)
询问的时候与常规的平等

create index 索引名 on 表名(字段名。。。。);–制造索引delete index
索引名;–删除索引

视图

能够掩盖一些消息
编造的表(不忠实存在,基表的数码删除时,视图中的数据也会去除)
能够实行增删改查(对视图表中的数据变动时,基表的数量也会更动)
就算视图中能看到的,基表中必定能阅览

create or replace view ch_view as select * from products p where p.price<15;--创建视图
select * from ch_view;--查询视图insert into ch_view values(14,3,'fff','ggg',12);--插入数据

加上注释

comment on table 表名 is ‘注释’;–表加多注释
comment on column 表名.字段名 is ‘注释’;–字段增加注释

多表联合查询

从未点名连接条件的多表查询将产生笛Carl积的结果
笛Carl积结果:三个表中装有数据的聚众都会询问出来

图片 4

笛Carl积

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

图片 5

内接二连三:重回符合一定连接条件的询问记录
  • 等值连接:重临符合钦命连接条件的值,那一个值是相等关系

    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;--<>:不等于
    
  • 本来连接:特指在同样张表内通过一定连接条件查询符合连接条件的值

图片 6

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:连接字符串
外接连:不仅仅重临符合连接条件的记录,也回到钦赐表中的不符合连接条件的笔录

图片 7

  • 左外连接:先对A表和B表做内接二连三,再把A表中从未相称的结果集加多进去产生新的结果集(相应的右表的值(对应A表未有相称的)为null)

    select * from newdept left outer join newemp on newdept.deptid = newemp.deptid;--outer可以省略 
    。。。。。。。where a.deptno = b.deptno(+);--左连接
    
  • 右外连接:
    先对A表和B表做内接连,再把B表中并没有相配的结果集增添进去变成新的结果集(相应的左表的值(对应B表未有相称的)为null)也回到

    select * from newdept right outer join newemp on newdept.deptid = newemp.deptid
    。。。。。。。where a.deptno(+) = b.deptno;--右连接
    
  • 全外连接:在内连接的根基上,把左右两表中不吻合连接条件的笔录都回到

在emp中每三个职工都有和睦的mgr(老板),并且每二个经理自身也是百货店的职工,自己也可以有投机的mgr。大家需求将每二个员工自身的名字和经营的名字都找寻来。

  select worker.ename,'work for',manager.ename from emp worker,emp managetr 
  where worker.mgr = manager.empnework for:连接字符串

用SQL语句列出EMP表中持有单位的详细音信以及相应的机关人数

select a.* , b.* from dept a,(select deptno,count(*) from emp group by deptno) b where a.deptno = b.deptno(+)
  • 全外连接

用SQL语句列出NEWEMP表和NEWDEPT表中兼有单位和职员和工人的详细音讯:

select * from newdept full outer join newemp on newdept.deptid = newemp.deptid

集合

聚拢中的成分得以把一条记下可能多个字段当做四个成分
用了聚众再排序的时候,order by 字段的职位(举例 1):只可以用数字了

  • intersect:交集

  • minus:减集

    • 在一张表中彰显了,就不在另一张表中出现了(A表 minus
      B表):呈现B表去除与A表一样的有个别
  • union all:并集(加all不去重)union :去重

    select * from (select * from (select * from employees2 e order by e.salary desc) where rownum<11
    minus
    select * from (select * from employees2 e order by e.salary desc) e where rownum<4) order by 6;--用到了集合再排序只能使用数字了
    

特出例子

依赖时间总计胜负数

图片 8

实行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;
两张表中的多寡运算

图片 9

select kc.mc "种类",kc.s1-(select sum(s1) from ck where ck.mc = kc.mc ) "剩余量" from KC;
三次修改多条记下
update employees e set e.salary = 
case e.employee_id
  when 1 then 5555
  when 2 then 6666
end
where e.employee_id<3;

多表联合检查

购入数码抢先贰个的产品名,顾客名以及购置的多寡(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;
    

四表联合检查

有如下几张表:

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

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

询问“发售一部”前一个月的商品出卖明细(商品编码。商品名称,销售日期,发售数量)

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);

体贴入妙微信公众号获取更加多相关财富

图片 10

Android小先生

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website