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
主表(限定字段)

        ALTEHighlander  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 }  假如再多加一列 光照强度 这种多少已然背离了  第二范式,那时候应该设计多张表    }**

数据模型

遵纪守法Computer种类的观点对数码开展建立模型。

 

概念模型

也称得上音讯模型,即遵照客户的观点来对数码和音讯建立模型

  • 实体(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

主键节制【不允许空,起码性,牢固性】PQX56IMAOdysseyY 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最大值为4000,最小值为1
  • char(size):固定长度的字符数据,其尺寸为size个字节,最大值为二零零零,最小值和暗许值为1,不管实际的尺寸为多少都会分配钦命的size个字节
  • number(p,s):有效位数为p且精度为s的数值(小数点后有s位)p的取值范围为1到38
  • date:有效日期范围从公元前4712年10月到公元后4712年6月二三日
  • long:可变长度的字符数据,其长度可达2G个字节

查询

子查询

  • 子查询在主查询的前一遍进行
  • 主查询使用子查询的结果
  • 子查询要用括号括起来
  • 将子查询放在相比运算符的右边
  • 子查询中不用加OWranglerDE纳瓦拉 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-三十日算后一个月,14日后算下二个月
Year 1-10月算下季度,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_CHA逍客:字符串调换(别的类型转变为字符串)
TO_NUMBEOdyssey:数值调换
TO_DATE:日期转换

  • TO_CHAR

将日期转换为字符串格式
必需用单引号括起来,大小写不灵动
有二个fm成分,用于补充空格可能防止前面包车型客车零
应用逗号分离日期
TO_CHAR(date,’fmt’)
常用的日子格式:
YYYY:三个人数表示的年
YEA途乐:拼写出的年
MM:两位数字的月
MONTH:全月明(例如:sepember)
DD:两位数字代表的月
DAY:全天名

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

事务

黄金时代组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积的结果
笛卡尔积结果:多个表中颇负数据的集合都会询问出来

图片 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小先生

相关文章