2018-09-01


sequence 序列、synonym同义词、DBLink连接、索引index、view视图、数据建模、PL/SQL 语言

接着前天的多表连接、子查询、分组查询等知识点,今天继续分享心得知识点。

sequence 序列

--序列可以让主键自动增长

--使用的时候,要先创建

create sequence stu_seq;

create table tb_class(

      id int primary key,

      code varchar(20)

);

insert into tb_class values(stu_seq.nextval,'java091');

select * from tb_class;

insert into tb_class values(stu_seq.nextval,'java09');

--synonym同义词

--先创建,后使用

create synonym myclass for tb_class;

select * from  myclass;--用myclass代替了tb_class表,也就是别名。

select * from tb_class;

---- DBLink连接

--找到oracle的安装路径

--C:\oracle\product\11.1.0\db_1\NETWORK\ADMIN

--1、listener.ora监听器

--2、sqlnet.ora网络

--3、tnsnames.ora tns配置文件

--创建连接

create database link hello

      connect to system identified by "1234"

      using '(DESCRIPTION=

      (ADDRESS_LIST=(

      ADDRESS=(PROTOCOL=TCP)(HOST=10.25.161.113)(PORT=1521))

      )

      (CONNECT_DATA=(SERVER=DEDICATED)

      (SERVICE_NAME=Oracle)

      )

      )';

      select * from scott.emp@hello;


如何优化你的数据库查询?


这是面试官最喜欢问的问题哦。

1、数据库的查询方式,三种:

--全表扫描,最慢,select * from tb_stu;

--利用索引扫描,快,推荐使用。方式是key-value

--共享语句:必须建立在全表扫描的基础上,已经查询过的数据留在缓存中,直接去缓存中查找。

index索引

作用:在数据库中用来加速对于表的查询。(也就是优化数据库)

原理:通过使用快速路径访问方法快速定位数据,减少磁盘的I/O.

特点2个:与表独立存放,但不能独立存在,必须属于某个表。

由数据库自动维护,当表被删除时,该表上的索引自动被删除。

--索引的建立

自动:当建立一个表的时候,定义主键primary key或者unique约束条件时,数据库自动创建索引。

手动:用户可以创建索引加速查询(最好是指定经常要查询的字段)

--怎么工作的:当创建索引的时候,oracle 会默认建立一张与当前表相关的索引页,里面保存了索引字段和对应的真实的磁盘地址,当用户发送sql

语句带来索引的时候,oracle会到索引页中查询索引字段,直接定位磁盘的IO,提取数据。

select * from tb_stu;

insert into tb_stu values(1,'jss',1);

--创建索引index

create index 索引名 on 表名(需要索引的字段);

create index 索引名 on 表名(索引字段);

eg:

create index stu_index on tb_stu(name);

select * from tb_stu where name="翠花";

--多使用共享语句,可以到达sql语句的优化。

--特殊的:当sql语句中包含not in ,<>不等于,is not null,like '%%'的时候不会建立索引。

in:会堆成一堆or,可以使用表的索引。

not in :强烈推荐不使用。因为它不能应用表中的索引。

<>操作符 不等于:是永远不会有用到索引的,因此它只会建立全表查询。(优化的方案:用其他相同功能的代替,比如:a<>0,改成a<0 or a>0,a<>’’ 改为 a>’’)

is null或者is not null (判断字段是否为空):判断字段是否为空一般也是不应用索引的,优化方法跟<>一样。

like :like操作符可以应用通配符查询,但是用的不好则会产生性能上的问题。

优化方案:如LIKE ‘%001%’ 这种查询不会引用索引,会产生全表扫描,

而LIKE ‘001%’则会引用范围索引。进行范围的查询,性能肯定大大提高。

create table aaa (

      comm int default 0,

      status varchar(20) default '已发'

);

create table bbb (

      email varchar(50) default 'zsfz053@126.com'

);

select * from aaa where comm is null; -- 不会用到 index

select * from bbb where email = 'zsfz053@126.com';  -- 会用到 index

--视图:

- 创建表空间

create tablespace Jss

datafile 'F:\dataspace\jss.dbf'

size 20M

autoextend on; -- 自动扩展,如果容量不够的话,则自动加

-- 千万记得:不能手动到路径下把生成的 xxx.dbf 文件删掉。

-- 如果需要删除表空间

drop tablespace jss including contents and datafiles;

-- 查询所有的表空间

select * from DBA_tablespaces;

-- 查询所有的数据文件

select * from Dba_Data_Files;

-- 创建用户

create user lin    -- 用户名

identified by 1234 -- 密码

default tablespace jss  -- 对应的表空间

temporary tablespace temp  -- 临时表空间

-- 删除用户

drop user jss;

-- 查询所有的用户

select * from Dba_Users;

-- 给用户加锁和解锁

alter user jss account lock;

alter user jss account unlock;

-- 操作权限

-- 连接权限

grant connect to jss;

-- 如果 jss 有连接权限,可以指定给 admin 账户

grant connect to jss with admin option;

-- 如果想要放大权限的话,可以指定 DBA 权限给它

grant dba to jss with admin option;

grant dba to jss with admin option;

-- 收回权限

revoke connect from jss;

revoke dba from jss;

创建用户的时候通过dba赋予的权限,创建视图的时候会报:没有权限。

--解决方案:使用system登录,再给用户赋予权限。

grant create any table to jss with admin option;

grant create any view to jss with admin option;

graant select  any table to jss with admin option;

--看看视图是怎么样让查询变的简单的:

select deptno 部门, sum(sal) 总薪资, max(sal) 最大值--注意要给别名,不然会出错

from scott.emp

group by deptno;

create view aaa

as

select deptno 部门, sum(sal) 总薪资, max(sal) 最大值--注意要给别名,不然会出错

from scott.emp

group by deptno;

接着:

select * from aaa;

--复杂视图(多个表)

create view bbb

as

select d.dname 部门, d.loc 地址, e.*

from scott.dept d, scott.emp e

where d.deptno = e.deptno

select * from bbb;

--删除视图

drop view aaa;

--注意:可以通过视图操作表,但是不建议。


软件开发过程:

1. 需求调研,与客户进行沟通

2. 需求分析,将现实工作中的动作模拟到计算机

  数据建模

3. 开发

4. 测试

5. 上线部署

从关系数据库的表中删除冗余信息的过程称为规范化,

是得到高效的关系型数据库表的逻辑结构最好和最容易的方法。

获得数据规范化的方法: 三范式

第一范式:必须要有主键,并且每个属性值,都是不可再分的最小数据单位,

          则称R是第一范式的关系。

第二范式:所有非主关键字都完全依赖于主关键字(通常用于联合主键)

第三范式:非主关键字不能依赖于其他非主关键字(通常用于一个主键)

-- 有 N 个班级,有 N 个学生,有 N 门课程

-- 一个班可以有多个学生,一个学生只能属于一个班,

-- 一个学生可以选修多门课程,一门课程可以被多个学生选修

数据建模

1. 根据三个范式

2. 分析实体之间的关系, ER 图 Entity-Reference(画出来看,会明显很多)

一对一:一个人只有一个身份证,唯一外键关联或者主键关联。

一对多:一个班级可以有多个学生。一个学生只属于一个班级(clazz - student)

        关联:一对多使用主外键关联,通常在多方(student)建立外键

多对多:一个学生可以选择多门课程,一门课程可以被多个学生选修 (student - course)

        关联:多对多通常使用中间表(再多建一张表存储)关联数据

              通常中间表会有两张表的id作为联合主键,并且作为外键指向关联表

下面有个实例:

网上购书

图书表: id、书名、出版社、出版时间、价格、作者、描述

用户表:id、姓名、地址、电话、email

订单表: id、编号code

-- 用户表

create table tb_user (

      id int primary key,

      name varchar(20) not null,

      address varchar(50) default '广州天河',

      phone varchar(20) unique,

      email varchar(20) unique

);

insert into tb_user

values (1, '翠花', '中国香港', '13800138000', 'cuihua@163.com');

insert into tb_user

values (2, '春花', '中国台湾', '13800138001', 'chunhua@163.com');

-- 图书表

create table tb_book (

      id int primary key,

      title varchar(50) not null,

      publication varchar(20) not null,

      publictime date,

      price number,

      author varchar(20),

      note varchar(100)

)

insert into tb_book

values (1, 'Java 从入门到放弃', '电子工业出版社', sysdate, 100, 'Jss', '很好的书');

insert into tb_book

values (2, 'Python 从入门到放弃', '电子工业出版社', sysdate, 120, 'Jss', '很好的书');

insert into tb_book

values (3, 'C++ 从入门到放弃', '电子工业出版社', sysdate, 99, 'Jss', '很好的书');

-- 订单表

create table tb_order (

      id int primary key,

      orderno varchar(30) not null,


      user_id int,

      foreign key (user_id) references tb_user(id)

);

insert into tb_order

values (1, '001', 1);

insert into tb_order

values (2, '002', 1);

insert into tb_order

values (3, '003', 2);

-- 订单和书籍是多对多的关系,创建中间表维护关联关系 

create table tb_order_book (

      order_id int,

      book_id int,

      count int,

      primary key(order_id, book_id),


      foreign key(order_id) references tb_order(id),

      foreign key(book_id) references tb_book(id)

);

insert into tb_order_book

values (1, 1, 2);

insert into tb_order_book

values (2, 1, 5);

insert into tb_order_book

values (3, 3, 10);

select * from tb_user;

select * from tb_book;

select * from tb_order;

3. 查询“翠花”的详细信息,包括:

  用户信息、订单信息、购买书籍名称、购买的数量

select u.name 名字, o.orderno 订单号, b.title 图书名称, ob.count 数量

from tb_user u, tb_order o, tb_book b, tb_order_book ob

where u.id = o.user_id

and b.id = ob.book_id

and o.id = ob.order_id

and u.name = '翠花';

- PL/SQL 也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL),是 Oracle 数据库对 SQL 语句的扩展。 PL/SQL 只有 Oracle 数据库有。

-- MySQL 目前不支持 PL/SQL 的,但支持 Navicat Premium。

-- 实际开发中,我们一般都是通过 Java 代码来处理数据

-- 将处理好的结果,再交给 SQL 去执行即可。

-- 语法格式

declare  -- 声明部分

    -- 定义变量

begin  -- 开始

    -- 主要内容

exception  -- 处理异常

end;  -- 结束

declare --声明

begin--开始,主要内容

end;结束

--打印语句

begin

--包.方法(存储过程)

dbms_output.put_line('jss打游戏打不过人家。。。');

end;

--定义变量

declare

  vid int;

vname varchar(20):='jss';--:=是赋值

begin

  dbms_output.put_line('jss打游戏打不过人家。。。');

end;

--复杂类型

declare

  vid int;

vname varchar(20);

type car is record(--复杂类型的声明:type car is record

id int,

name varchar(20),

price number

);

--如果要给复杂类型数据赋值,需要给它一个变量才可以。

vcar car;

begin

--declare处声明,begin处赋值

vname:='jss';

vcar.name:='BMW X6';

dbms_output.put_line(vname||'就算有'||vcar.name||'jss打游戏打不过人家。。。');--连接字符用||

end;

PL/SQL的使用:插入数据、查询数据、for循环,if else逻辑语句

--插入数据

declare

vid int:=1;

vname varchar(20):='花花';

begin

insert into tb_stu(id,name) values (vid,vname);

end;

--查询数据(查询在声明变量中有的字段)

declare

vid int:=1;

vname varchar(20);

begin

select name into vname from tb_stu where id=vid;

dbms_output.put_line(vname);

end;

--if else逻辑语句

--if

declare

i number:=10;

begin

if(i=10) then

dbms_output.put_line('此处打印出10...');

end if;--要给if 结束语句end if;

end;--每句后面都加个;来去隔开。

--if else

declare

i number:=20;

begin

if(i=10) then

dbms_output.put_line('此处打印出10...');

else

dbms_output.put_line('此处打印的不是10...');

end if;--要给if 结束语句end if;

end;

--if...else if

declare

i number:=20;

begin

if(i=10) then

dbms_output.put_line('此处打印出10...');

else if(i=20)

dbms_output.put_line('此处打印的是20...');

else

dbms_output.put_line('此处打印出不是10,也不是20...');

end if;--要给if 结束语句end if;

end;

--loop循环

declare

i number:=0;

begin

loop

i:=i+1;

dbms_output.put_line('jss...');

exit when i=5;

end loop;

end;

--for循环

declare

i number:=0;

begin

for i in 1..6--for用来指定条件

loop

dbms_output.put_line('jss...');

end loop;

end;

--while循环

declare

i number:=0;

begin

while i<6

loop

dbms_output.put_line('cuihua..');

i:=i+1;

end loop;

end;


小编很喜欢广州的夜景。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容