zoukankan      html  css  js  c++  java
  • 数据库相关

    数据库创建注意事项

    1:没有关联表的先建,有关联的表后建,多关联的表最后建

    2:最好直接用sql语句建表要不会出错

    3:要建外建约束必须建立索引

    4:表之间建立索引的名字不能重复,索引名字一般与外建一致

    MySQL数据库

    数据库操作(select * from employee where 1=1等于自身)

    创建数据库:

             create database 数据库名

             修改数据库:

             alter database 数据库名 default character set utf8;

             删除数据库:

             drop database 数据库名;

             查看数据库

             show databases;

             show create database 数据库名;

    表操作

    创建:

             create table 表名(字段名 字段数据类型,字段名 字段数据类型..);

             修改:

             alter table 表名

                       添加字段: add column

                       修改字段类型: modify column

                       修改字段名称: change column

                       删除字段: drop column

                       修改表名: rename to

             删除:

             drop table 表名;

             查看:

             show tables;

             desc 表名;

    数据操作

    添加:

             insert into 表名(字段1,字段2...) values(值1,值2...);

             修改:

             update 表名 set 字段1=值1,字段2=值2......  where ..

             删除

             delete from 表名;

    查看表

             1)查询所有字段: select * from 表

             2)查找指定字段: select 字段1,字段2 from 表;

             3) 查询时指定别名 : select 字段1 as 别名1,字段2 as 别名2 from 表;

             4) 查找时合并列: select 字段1+字段2 from 表

             5) 查询时添加常量列: select 常量 as 别名 from 表

             6)查询去除重复数据: select distinct 字段 from 表

             7)条件查询 where

                       7.1 逻辑 : and  or

                       7.2 比较: >  >=  <  <=  =  <>  between and

                       7.3 判空:

                                null:   is null    /  is not null

                                空字符: =''   /   <>''

                       7.4 模糊:

                                like  

                                %: 任意个字符

                                _: 一个字符

             8)分页查询

                       limit 起始行,查询行数

             9)聚合查询(统计查询)

                       max()   min()   sum()   avg()  count()

             10) 排序

                       order by 字段

                                asc: 升序

                                desc: 倒序 

             11)分组:    

                       group by

             12)分组后筛选

                       having 条件

    sql分类:

             1)DDL语句: 数据定义语句

                       create/alter/drop

             2) DML语句: 数据操作语句

                       insert/update/delete

             3) DQL语句: 数据查询语句

                       select/show

    mysql约束

    -- 非空: not null

    CREATE TABLE student(

             id INT,

             NAME VARCHAR(20) NOT NULL,

             gender CHAR(1)

    );

    -- 唯一:unique

    CREATE TABLE student(

             id INT UNIQUE,

             NAME VARCHAR(20),

             gender CHAR(1)

    )

    -- 主键(唯一+非空): primary key

    CREATE TABLE student(

             id INT PRIMARY KEY,     

             NAME VARCHAR(20),

             gender CHAR(1)

    );

    --自增长: auto_increment

    CREATE TABLE student(

             id INT PRIMARY KEY AUTO_INCREMENT,

             NAME VARCHAR(20),

             gender CHAR(1)

    );

    delete from 删除数据,不能重置自增长约束;truncate table 删除数据,也可以重置自增长约束。

    外键与外键约束

    语法:

    -- 部门表(主表)

    CREATE TABLE dept(

             id INT PRIMARY KEY AUTO_INCREMENT,   //主键自增长

             deptName VARCHAR(20)

    );

    -- 员工表(副表)//里面的外键要参考外面的主键

    CREATE TABLE employee(

             id INT PRIMARY KEY AUTO_INCREMENT,

             empName VARCHAR(20), -- 姓名

            

    deptId INT, -- 部门id   //外键

             --           外键名                外键字段             主键字段

    CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)  //外键约束语

    );

    当有了外键后,数据操作顺序应该是:

    1)插入数据,先插入主表数据,再插入副表数据

    2)修改数据,先修改副表数据,再修改主表数据

    3)删除数据,先删除副表数据,再删除主表数据

    在外键的基础上,可以给外键再添加级联操作:

    添加了级联操作之后,数据操作顺序可以变成:             

    1)修改数据,直接修改主表数据,同时修改副表数据

    2)删除数据,直接删除主表数据,同时删除副表数据

    修改级联:ON UPDATE CASCADE  //加在外键约束语后面

    删除级联:ON DELETE CASCADE  //加在外键约束语后面

    数据库设计(三大范式)

    2.1 第一范式:要求表的每个字段都必须是独立的不可分割的单元

    2.2 第二范式:在第一范式的基础上,要求表的除主键字段外的其他字段都和主键字段有关系的(不相关的数据分开)

    2.3 第三范式:在第二范式的基础上,要求表的除主键外的其他字段都和主键是决定关系

    (在第二范式的基础上,把重复的数据在分成一个表,减少数据冗余)

    表与表的关系

    4.2 内连接查询(最常见)

             inner join

             效果;只有满足了连接条件的数据才会被显示出来

    4.3 左外连接查询

             left outer join

             左表数据全部显示,右表数据如果满足连接条件就显示,不满足就显示null     

    4.4 右外连接查询

             right outer join

             右表数据全部显示,左表数据如果满足连接条件就显示,不满足就显示null

    SELECT s.NAME,p.NAME,w.wtime

             FROM staff s,project p,worktime w

                       WHERE s.id=w.s_id AND p.id=w.p_id AND s.NAME='伍岳林';

    Oracle数据库

    连接数据库

    命令格式 :  sqlplus 用户名/密码@数据库ip:数据库端口/数据库实例  [ AS sysdba ]

    普通连接

    sqlplus scott/tiger@192.168.56.101:1521/orcl

    管理连接

    sqlplus sys/sys@192.168.56.101:1521/orcl as sysdba;

    切换用户

    conn 用户名/密码@数据库ip:数据库端口/数据库实例  [ AS sysdba ]

    eg:

    conn sys/sys@192.168.56.101:1521/orcl as sysdba;

    数据库基本操作

    修改

    ed  修改  :执行修改好的内容

    /    修改  : 错误例子select * form emp改成c /form /from

    清屏

    host cls

    显示表结构

    desc emp

    设置行宽

    set linesize 150

    设置列宽

    Col colum for 填写需要的数值

    Select查询

    where 执行顺序(sql优化问题)

    Where 执行顺序: 右  ---> 左

    where condition1 and condition2

    where condition2 and condition1

    去掉重复记录

    Select distinct job,depton from emp;

     

    字符串并列

    Sql -----------“ ||” 后面会取反双引号 相当于+号

    Select ename || ‘的薪水是’ || sal from emp;

     

    Oracle默认的日期格式

    字符和日期要包含在单引号中

    默认格式为:DD-MON-RR

    修改日期格式

    Alter session set NLS_DATE_FORMAT=’yyyy-dd-mm’;

     

    比较运算符

    Beween…and…在两个之间

    总结: between ... and ... 1包括边界  2 小值在前大值在后

    Select *from emp where sal between 1000 and 2000;

     

    in表示在集合中 相当于or

    注意:in()中有null不会报错但是无效

    Select *from emp where depton in(10,20);

     

    Like模糊查询(转义字符)

    ‘_’代表省略前一个字符和mysql一样

    Select *from emp where ename like ‘_A%’;

     

    注意: like 转义用法  escape 转义字符

     

    Order by排序

     

    注意:

    1:Ordre by默认:升序asc

    2:order by作用域: 作用所有字段,字段在先,先排,在后,后排.(谁在前面优先排谁)

    降序只对前一个数据有效

    Order by支持字段顺序排序

    Order by后面可以跟算数表达式

    Select *from emp order by sal*12;

     

    附加:nulls last表示无论升降null值排在最后

    Select *from emp order by comm desc nulls last;

     

    单行函数(dual相当于新表)

     

    字符串函数

     

    Select lower(‘hello WORLD’) 转小写, upper(‘hello WORLD’) 转大写, initcap(‘hello WORLD’) 首字大写 from dual;

     

    查询当前时间

    select sysdate from dual;

     

    Concat 相当于’||’

     

    Substr(a,b,c)

    substr(a,b,c) --从a中,b位开始,取c个

     

    Length(字符串)和lengthb(字节数)

     

    Lpad和rpad替换

     

    Instr索引值(从1开始),trim替换首字,replace取代

     

     

    数字函数

     

    round 四舍五入

    trunk 截断(时间可以取trunk((需要截取的时间字段),’year’(想要从哪里截取)))

    mod 求余

    日期函数

    注意:可以对日期进行加减乘除

     

    对时间进行四舍五入month月份,year

     

    trunk 截断(时间可以取trunk((需要截取的时间字段),’year’(想要从哪里截取)))

    trunk(hiredate,’year’) 在hiredate中从年开始日期截断

    滤空函数

    nvl(a,b,c) 如果a为null,输出c, 否则,输b

     

    条件表达式(if-when-sele)

    SELECT last_name,job_id, case job_id when 'AD_PRES' then 'A'

                                        when 'ST_MAN' then 'B'

                                        when 'IT_PROG' then 'C'

                                        when 'SA_REP' then 'D'

                                        when 'ST_CLERK' then 'E'

                                        else 'F'

                                        end FROM employees;

     

    省略写法

    SELECT last_name,job_id,decode(job_id,'AD_PRES','A','ST_MAN','B','IT_PROG','C','SA_REP','D','ST_CLERK','E','Others','F') GRADE FROM employees;

    Group by分组

    注意:组函数:有没有自动滤空功能?  --有

    怎么来屏闭自动滤空功能?

    嵌套滤空函数来屏闭.

    Group by只允许跟表字段列

    分组函数

     

    组函数使用:

    在SELECT列表中所有未包含在组函数的列都应该包含在GROUP BY子句中。相反,包含在GROUP BY子句中的列不必包含在SELECT列表中。

     

    having 相当where

     

    Group by增强

    select deptno,job,sum(sal) from emp group by rollup(deptno,job);

     

    多表查询

    连接类型

     

    等值连接

     

    等值连接显示左边表的内容(左连接)

     

    省略laft  join

     

    不等值连接

     

    Between….and

    外连接(左外连接和右外连接)

     

    自连接

     

    不推荐会产生笛卡尔积

    子查询

    子查询需要解决的问题:

       不能一步到位进行查询,我们就使用子查询.

    子查询需要注意的问题:

    1.括号

    2.主查询的where,select , from ,having后面都可以放置子查询

    3.在group by 后面不能使用子查询

    4.强调from后面子查询

    5.主查询和子查询可以不同一张表,只要子查询返回的结果,主查询可以访问就可以了.

    6.一般不在子查询中使用order by ,但TOP-N 分析问题,必须使用order by .

    7.一般先执行子查询再执行主查询,但相关子查询例外.

    8.单行子查询只能使用单行操作符,多行子查询只能使用多行操作符.

    9.重点注意:子查询中的null

    常规子查询

    select 子查询

     

    From子查询

     

    Having子查询

     

    子查询与主查询不在同一张表

     

    子查询中使用组函数

     

    多行子查询

    In在集合中

     

     

    Any:和子查询返回的任意一个值比较

     

    All:和子查询返回的所有值比较

     

    多行子查询空值

     

    Using使用

     

    UNION / UNION ALL  并集

    INTERSECT 交集

    MINUS 差集

    UNION运算符返回两个集合去掉重复元素后的所有记录

    UNION ALL返回两个集合的所有记录包括重复的

    INTERSECT运算符返回同时属于两个集合的记录

    MINUS 返回属于第一个集合,但不属于第二个集合的记录

    select * from emp where deptno=10;

    +

    select * from emp where deptno=20;

    =

     

    Group by增强(了解)

    集合运算注意的问题:(尽量不使用集合运算)

    1. 参加集合运算的列数相同,并且 类型一致.

    2. 采用第一集合表作为表头

    3. 如果要排序必须在最后一个集合中使用order by

    4. 可以使用括号改变执行顺序

    select deptno,job,sum(sal) from emp group by deptno,job;

    +

    select deptno,sum(sal) from emp group by deptno;

    +

    select sum(sal) from emp;

     

    分页及rownum

     

    注意:

    关于rownum:

    1.rownum 按照默认的顺序生成.

     

    2.rownum只能使用 < 或者 <=,绝对不能使用 > 或者 >=

     

    分页1:

     

    分页2:

     

    增删改

    1:在建表时可以插入另一张表的数据

    Create table emp2 as select * from emp;

    可以向另一张表插入一些数据

    Insert into emp2 select * from emp where ename like ‘ab%’;(注意:两张表列名对应)

    更新和mysql一致

    删除有delete和trancate

     

    总结

     

    注意:

    Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE.            

    Oracle 默认的事务隔离级别为: READ COMMITED (读已提交)

    Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ (可重复读)

    Oracle默认开启事务

    Oracle其他使用

    常见数据库对象

    表:table

    视图:

    序列:

    索引:index

    同义词:synonym

    数据类型

     

    建表操作

    创建表

    普通建表

    Create table 表名( 字段1 数据类型[默认值,约束条件],

      字段2 数据类型[默认值,约束条件],

    ...

    )

    例如:

     

    子查询建表

    Create table (表名) as (插入的sql的语句)

    例如:

     

    Alter修改表

    Alter table (表名) add (字段 字段属性);  //添加字段

    Alter table (表名) modify (字段 字段属性); //修改字段

    Alter table (表名) drop column (字段 字段属性);  //删除字段

    Alter table (表名) rename column (原字段名) to (修改后的字段名); //更改字段名

    例如:alter table dept3 add (loc3 varchar(30));

     

    删除表

     

    Drop table 表名;

    例如:

     

    改变对象名称

    Rename …to…

     

    清空表

    Truncate table (表名);

     

    约束条件

     

    不为空:Not null

    唯一:unique

    主键唯一:primary key 主键约束(自带唯一)

    外键约束:Foreign key

    检查:Check

    视图对象

     

    开启视图权限

    在虚拟机中 grant create view to soctt;

    Create view (创建的视图名) as (sql插入的表);

    注意delete 、update 、 insert 视图操作中不能使用:

    组函数

    Group by 字句

    Distinct 关键字

    Rownum 伪列

    删除视图:drop view (视图表名);

    序列对象

     

    例如:

    Create sequence (表名)

    increment by 10 (自增长)

    start with 120 (初始值)

    maxvalue 999 (最大)

    nocache (缓冲)

    nocycle; (多久循环)

    删除序列

     

    索引对象

    Create index (索引名字) on (表名)(字段名,可以多个);

     

    同义词对象

    Create synonym (同义词简写) for (需要的同义词对象可以是表名);

     

    Pl/sql设计

    Plsql结构和组成

     

    常量定义

    变量:Char 、varchar2、date、number、boolean、long

    引用型变量:字段名后%type;

    例如:

     

    记录型变量:字段名后%rowtype;

     

    条件语句

    If语句

    If…elsif…then…else..end if;(相当于if..else判断)

    例如:

     

    循环语句

    loop (声明相当于for)

             exit when (退出条件);

             业务条件

    end loop;(声明结束)

    例如:

     

    游标

    需要开启和关闭 open (光标对象)        close (光标对象)

    注意:返回多个值无法用单个接收,就要定义游标,没走一次游标,返回一个值

    Cursor 光标名 is (sql需要创建的光标对象);

    例如:使用游标查询员工的姓名和工资,并打印

     

    带参数光标

    例如:查询某个部门的所有员工姓名

     

    定义游标集合

     

    自定义异常

    --用户定义例外

    --查询50号部门的员工姓名

    set serveroutput on

    declare

      cursor cemp is select ename from emp where deptno=10;

      pename emp.ename%type;

      --自定义例外

      no_emp_found exception;

    begin

      open cemp;

        loop

          --取出一条记录

          fetch cemp into pename;

          if cemp%notfound then

          --抛出例外

          raise no_emp_found;

          end if;

        end loop;

      close cemp;

    exception

      when no_emp_found then dbms_output.put_line('没有找到员工');

      when others then dbms_output.put_line('其它例外');

    end;

    /

    Oracle数据字典

     

    可以查询以下对象看结构:

    DICTIONARY

    USER_OBJECTS

    USER_TABLES

    USER_TAB_COLUMNS

    USER_CONSTRAINTS

    USER_CONS_COLUMNS

    USER_VIEWS

    USER_SEQUENCES
    USER_TAB_SYNONYMS

    触发器

     

    实例:

     

    触发语句与伪记录变量的值

     

    实例2:

     

    闪回

    1.错误删除数据并提交数据,并且commit

    2.错误删除表(drop table)

    3.如何获取表上的历史记录

    4.如何撤消一个已经提交的事务

    闪回表需要权限 grant flashback any table to scott; 授权

    执行闪回表必须开启行移动alter table flashback_table enable row movement;

    闪回类型:

    1.闪回表:将表回退到某一个时间上.

    2.闪回删除: 将oracle回收站的内容恢复.

    3.闪回版本查询: 获取表中的历史记录

    4.闪回事务查询: 查询获取表中的user_sql

    5.闪回数据库:将数据库回退到某一个时间上.

    6.闪回归档日志: 将数据库操作回退到日志的某一个时间上.

    查询scn

     

    闪回表

     

     

    修改闪回时间参数

     

    系统改变scn

     

    语法:

     

    闪回就是放入回收站

    查看回收站

     

    清空回收站

     

    永久删除不闪回

     

    两张一样表闪回需要重命名

     

    Oracle中导入导出

    真正数据备份,不是用exp和imp

    真正数据备份RMAN 全称:Recovery Manager

    Imp数据导入

     

    Emp和imp的提示模式

     

    管理方案:

    192.168.56.101:1158/em

    创建新用户

     

    要登入授权

     

    授予用户建表权限并且具有对表的授权功能

     

    给用户分配默认表空间

     

    存储过程和存储函数

    如果有返回值,使用存储函数,否则,使用存储过程

    存储过程实例

     

    存储过程的调用

     

    存储函数

    在方法后面+(输入是in,输出是out)

     

    In和out

     

  • 相关阅读:
    团队项目-BUG挖掘
    评论任务
    4-14结对-复利计算
    做汉堡-结对
    复利计算--结对
    input上传按钮的优化
    avalon.js与 ajax使用的一个错误实例
    去除list集合中重复项的几种方法
    mvc学习记录
    常用js正则
  • 原文地址:https://www.cnblogs.com/maofa/p/6407022.html
Copyright © 2011-2022 走看看