Oracle数据库基础知识+sql语句练习

文章目录

    • 四、数据库
      • 4.1 Oracle
        • 准备知识
        • SQL基本分类
        • Oracle数据类型
        • 基本用法
        • 事务
          • 事务特性:
          • 隔离性问题:
          • 隔离级别:
          • 锁的介绍
          • 锁的分类
          • 锁的类型
          • 锁等待和死锁
          • 查看是否有死锁
          • 查看死锁的语句
          • 解决死锁:
        • 函数
        • 约束 constraint
        • 伪表
        • 联合关键字
        • 零碎知识点
      • 4.2 Mysql
          • oracle和mysql的区别
      • 欢迎点赞加评论

四、数据库

4.1 Oracle

准备知识

Oracle=神谕=他的第一个客户CIA

版本:11g

服务=services.msc 注册表=regedit

sqlplus=与Oracle数据库相互通讯的工具

两个用户:system(系统管理员)/scott[被锁定的普通用户]

启动的服务:Oracleservice,TNS

匿名登录

  1. win+R输入sqlplus/nolog
  2. conn/as sysdba//系统管理员登录
  3. alter user system identified by etoak//修改系统用户密码
  4. conn system/etoak//系统用户登录

常见用法

切换用户:conn scott/etoak

用户解锁:alter user scott account unlock;

用户加锁:alter user scott account lock;

授权:grant dba to scott;

创建新用户:create user 用户名 identified by 密码;[前提:创建新用户的用户必须授权或者有权力]

撤销授权:revoke dba form scott;

查看当前用户:show user;

更改密码:alter user scott identified by et;

卸载步骤

  1. 打开注册表-》LOCAL_MACHINE-》system-》services—》ControlSet001-》删除所有Oracle开头的文件
  2. 重启
  3. C盘-》programes-》删除oracle
  4. C盘-》app删除

SQL基本分类

定义:SQL: Structured Query Language =结构化查询语言

  1. DDL:Data Defination Language = 数据定义语言

    create 创建 alter 修改 drop 删除 truncate 截断

  2. DML:Data Manipulation Language =数据操纵语言

    insert 增加 delete 删除 update 修改

  3. DQL: Data Query Language =数据查询语言

    select 查询

  4. DCL: Data Control Language =数据控制语言

    grant 授权 revoke 取消授权

  5. TCL:事务控制语言

    commit 提交 rollback 回滚 savepoint 保存还原点

小练习

请输入用户名:  scott
输入口令:

连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> grant dba to scott;

授权成功。

SQL> create user et identified by et;

用户已创建。

SQL> grant dba to et;

授权成功。

SQL> conn et/et
已连接。
SQL> create user et2106 identified by et2106;

用户已创建。

SQL> drop user et2106;

用户已删除。

SQL>

Oracle数据类型

字符型:

varchar2(20) 可变字节0-4000字节

char(6) 固定字节 0-2000字节

数值型:

number()

number(5) :五位整数

number(5,1) :一共五位数1234.5 0.1000 1234.0

number(5,-1) :将数值最后一位变为0 存进去12345会变成12340

日期型:

date 年月日 时分秒

timestamp 包含毫秒数

基本用法

创建表:

create table  student(
name varchar2(20),
birthday date,
salary number(5)
);

改表名:

alter table student rename to stu;//把student改为stu

查看当前用户下有哪些表:

select table_name form user_tables;

添加字段:

alter table student add email varchar2(20);

更改列名:

alter table student  rename column email to youxiang;

删除列名:

alter table student drop column youxiang;

修改数据类型:

alter table student modify name  varchar2(50);

删除表结构:[删除表结构和表数据]

drop table student;
drop table student purge;//将垃圾站的student表删除(永久删除)

查看表:

desc student;

截断表:[删除表数据和表空间]

truncate table student;

新增数据:

insert into student(name,birthday,salary) values('zs',sysdate,5000);

删除数据:

delete from student;
delete from student where name = 'ls';

修改数据:

update student set salary=salary+200 where name='zs';
update student set salary=salary+200,name='ZS' where name='zs';//更改两个值
update student set salary=salary+200,name='ZS' where name='zs' and name='ls';

查询数据:

select * from student;
select name,salary from student;
select name,salary from student where name=‘zs’ and salary=5000;
select s.name,s.salary*3 as sal from student s;//查询student(重新命名为s)表里的姓名和薪资(薪资显示为原来的三倍并把列名改为sal【as通常省略】)查询只是显示数据,怎么显示数据可以自定义,但不会对真实的数据表修改。

模糊查询:like

%:代表任意位的任何字符

_:代表一位上的任意字符

select name from student where name like 'ET%';//ET开头的
select name from student where name like 'ET_';//ET开头后面只有一个字符的
select name from student where name like 'ET_%';//查询ET开头并且后面至少有一个字符的

escape:逃离符

通过指定一个字符进行逃离,来保证like后面的字符是普通字符

select name from student where name like 'ET,_,%' escape ',';//查出来的结果是ET_%
select name from student where name like 'ET._.%' escape '.';//查出来的结果是ET_%

判断空:is (not)null 是(非)空

select * from student where birtdhay is not null;

相关知识

运算符:±*/

比较:> < >= <= != Oracle中的不等于为<>

条件:and or between and闭合区间

select name,salary from student where salary between 5000 and  6000;

优化写法:

select name,salary from student where salary >=5000 and salary<=6000;

事务

TCL:事务控制语句
*:事务只会影响DML操作

事务:在一些列操作中有多个步骤,只有所有的步骤成功执行那么整个操作才算完成,如果有其中一个环节失败,那么整个操作都算失败。

Oracle中在sqlplus中开启事务:
set autocommit off; – 关闭自动提交
set autocommit on; – 开启自动提交
提交操作:将受影响的数据持久化到数据库中

事务特性:

原子性:事务不可再分
一致性:数据类型保持一致
持久性:事务能够将数据持久化到数据库中
隔离性:多个事务之间可能会产生一些隔离性问题

隔离性问题:

脏读:事务B读取到事务A中未提交的数据,然后事务A对刚才的操作进行了回滚操作,那么事务B读取到的数据就无效了,也就是脏数据
– 读到了其他事务未提交的数据

不可重复读:事务A对表内数据修改提交后,事务B再次读取数据,发现和之前读取到的数据不一样
– 一次读取到的数据其他事务对数据进行了修改,再次读取数据不一致

幻读:事务A对表新增数据并提交以后,事务B再次读取这张表,就会发现数据多了,就像发生了幻觉一样
– 相同的查询条件,在别的事务添加或者删除数据后,再次查询不一致

隔离级别:

数据库事务的隔离级别一共有4个,由低到高依次为Read uncommitted
,Read committed,Repeatable read,Serializable,这四个隔离级别可以逐个解决脏读,不可查重复读,幻读这几个问题。

脏读 不可重复读 幻读
未提交读 Read uncommitted
提交读 Read committed 不会
可重复读 Repeatable read 不会 不会
序列化 Serializable 不会 不会 不会
  1. ISOLATION_READ_UNCOMMITTED:【很少应用,效果很差,效率也没高哪去】
    这个是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
  2. ISOLATION_READ_COMMITTED:【Oracle默认的隔离级别 大多数数据库默认】
    保证一个事务修改的数据只有在提交以后别的事务才能读取。
  3. ISOLATION_REPEATABLE_READ:【Mysql默认的隔离级别】
  4. ISOLATION_SERIALIZABLE:【根治所有问题 但是牺牲效率】
    花费高代价但是最可靠的事务隔离级别,事务被处理为顺序执行

Oracle中的提交读级别:(默认)
set transaction isolation level read committed;

*:更改数据库的隔离级别必须在开启事务的第一句话来更改

commit:提交 将数据持久化到数据库中
rollback:回滚 将事务中的操作回滚到第一步操作之前,就当什么都没发生
savepoint:还原点 可以回退到指定的位置

显示提交:在事务中手动commit
隐式提交:在事务中,如果正在执行DML操作,突然做了一个DDL操作,数据库会自动在DDL操作之前隐式的做一个commit操作当发生以下操作时,事务将结束
1.利用commit/rollback进行事务提交和回滚
2.执行DDL语句时,事务将自动提交
3.如果使用sqlplus时,正常退出事务会自动提交,非正常退出事务回滚

锁的介绍

锁可以防止事务之间的破坏性交互,约束了最大程度的并发性,数据的完整性

锁的分类
  1. 排他锁(X锁)防止资源共享,也就是当一个事务正在操作数据时,其他事务不可以操作这个事务的数据。

  2. 共享锁(S锁)被锁住的数据只能被读取,但是不能修改。

锁的类型

DML锁:也就数据锁,用于保护数据,事务在最开始时添加,通过commit或者rollback释放。
DDL锁:可以保护数据对象的结构。Oracle自动的施加的释放。
内部闩锁:保护数据库的内部结构,完全自动调用。

行级锁:也叫事务锁,防止数据被同时多个事务进行修改,直到commit或者rollback。
表级锁:防止在修改数据的时候,表结构发生变化。

select name,salary from student for update;
会对student表进行加锁,此时只允许当前session对已经存在的数据进行更新,其他session仍可以进行insert操作。

锁等待和死锁

锁等待也叫锁冲突,锁等待会严重影响数据库的性能和日常工作。
死锁,也就锁等待的一种,但是死锁会让事务一直处于锁等待的状态。

查看是否有死锁

select sid,serial#,username from v s e s s i o n w h e r e s i d i n ( s e l e c t b l o c k i n g s e s s i o n f r o m v session where sid in (select blocking_session from v sessionwheresidin(selectblockingsessionfromvsession);

查看死锁的语句

select sql_text from v s q l w h e r e h a s h v a l u e i n ( s e l e c t s q l h a s h v a l u e f r o m v sql where hash_value in (select sql_hash_value from v sqlwherehashvaluein(selectsqlhashvaluefromvsession where sid in(select session_id from v$locked_object));

解决死锁:

https://localhost:1158/em
性能–>其他监视链接–>实例锁

函数

  1. 聚组函数(组函数、聚簇函数):(group by分组)

    max() 最大值 min() 最小值 avg() 平均值 sum() 求和 count() 求记录数

  2. 单行函数

    ceil() 向上取整 floor() 向下取整 abs() 求绝对值 sign() 求符号位(正数返回1,负数返回-1、0返回0)power(a,b) 求a的b次方 sqrt() 求正平方根

    round() 求四舍五入

    select round(3.141592654) from dual;--保留整数3
    select round(3.141592654,3) from dual;--保留三个小数3.142
    

    trunc() 求直接截断

    select trunc(3.141592654) from dual;--3
    select trunc(3.141592654,3) from dual;--3.141
    
  3. 日期函数

    两个日期可以相减,单位是天

    sqlplus中

    alter session  set nls_data_format ='yyyy-mm-dd  hh24:mi:ss';
    

    永久修改方式:配置环境变量

    yyyy 年 year
    mm 月 month 带’月’的月份
    ddd 日 年中的日
    dd 日 月中的日
    d 日 周中的日
    hh24 24小时制
    hh12 12小时制
    mi 分
    ss 秒
    xff 毫秒
    ff3 毫秒保留三位

    add_months() 在某个日期上添加月份

    select add_months(sysdate,3) from dual;
    

    months_between() 两个日期之间存在多少个月

    select months_between(sysdate,to_date('20210609','yyyy-mm-dd')) from dual;
    

    next_day() 下个周几的具体日期

    select next_day(sysdate,'星期一') from dual;
    

    last_day() 给定日期所在月份的最后一天

    select last_day(sysdate) from dual;
    
  4. 转换函数

    to_number() 将一个字符类型的数转换成数值类型的

    select name,email from student where to_number(email) = 1;
    

    to_char()

    a.将数值类型的转换成字符类型的

    select name,sal from student where to_char(sal) = '6000';
    

    b.格式化字符串,常用在货币单位

    select to_char('10000000','999,999,999,999.99') from dual;
    

    c.将日期类型转换成字符类型

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss:ff3') from dual;
    

    to_date() 将字符类型的日期转换成日期类型的日期

    select to_date('20210809115050','yyyy-mm-dd hh24:mi:ss') from dual;
    

在这里插入图片描述

  1. 字符函数

    lower() 转换成小写 upper() 转换成大写 initcap() 首字母大写

    length() 求长度

    substr(原字符串,截取位置[最小位为1],截取长度) 截取参数

    repalce(原字符串,要替换的字符串,替换成新的字符串) 完全替换

    instr(原字符串,想要找到的字符,查找位置,第几次出现) 索引字符串

    concat(字符串1,字符串2) 拼接字符串

    lpad(原字符串,以什么补,补到多少位) 左侧补全

    rpad(原字符串,以什么补,补到多少位) 右侧补全

    trim() 默认去除两侧的空格

    trim(字符串1 from 原字符串) 将原字符串两侧的字符串1去掉

    select trim('a' from 'aaababaaa') from dual;
    

    ltrim():左侧去除
    rtrim():右侧去除
    select ltrim(’ abc’) from dual;
    select ltrim(’ abc’,‘a’) from dual;

  2. 通用函数

nvl(原字符串,是空展示什么) 空值处理

nvl2(原字符串,不是空展示什么,是空展示什么) 空值处理二代

decode(c1,c2,c3,c4,c5…cx,cx+1)

c1是原字符串,从第二个参数开始,每两个参数看作是一组,拿每组的第一个参数和c1进行比较,如果相同则返回该组的第二个参数

相当于:
第一次比较:c2 == c1 ? c3 :
第二次比较:c4 == c1 ? c5 :

如果参数个数是奇数个,并且最终判断没有相同的值,则返回空
如果参数个数是偶数个,并且最终判断没有相同的值,则返回最后一个参数的值

条件取值语句:
(case – 拿来做比较的值
when – 如果…
then – 则…
else – 否则…
end) – 结束

 select  ename,job,sal,(case job when 'CLERK' then sal+500 when 'SALESMAN'then sal-500 else sal-300 end) total from emp;

Oracle数据库基础知识+sql语句练习_第1张图片

分组:group by

将一张表中某个列上或者多个列上相同的值划分为一个组,那么这个表就被分为多个组

*:如果根据字段A分组那么只能查询字段A,如果想展示其他字段需要以组函数的形式出现

having :条件

distinct :去重

order by:排序【asc升序[默认]、desc降序】

查询关键字的优先级:

select 列名 --优先级高于order by

from 表名 --优先级最高

where 条件 --优先级次高

group by 分组 --优先级次于where

having 条件 --优先级在group by 之后

order by 排序 --优先级最低

约束 constraint

主键约束:primary key

​ 主键:在一张表中唯一能定位一条数据的列,称为主键

​ 特点:非空且唯一

*:建表时添加主键

create table test(id number(5) primary key,name varchar2(20));

​ *:建表时未添加主键,后期添加主键

	create table test2(id number(5),name varchar2(20));
	alter table test2 add constraint zj primary key(id);

外键约束:foreign key *:references

​ 外键:在子表中有一个列引用了母表中的主键列,那么这个列在子表中称为外键

​ 特点:一张表里面可以有多个外键

唯一约束:unique

检查约束:check

非空约束:not null

查看当前用户下有哪些约束:

select constraint_name,constraint_type,table_name from user_constraints;

如何删除约束:

alter table test2 drop constraint zj;

注意:
常用约束:主键约束,外键约束
约束越多,表越健壮,效率越低

子查询=嵌套查询= 某些条件是通过查询得出来的

select子查询 from 子查询 where 子查询

自查询:

select student.name,school.name from student,school
where student.sid = school.id;

连表查询

内连接:inner join on=join on

​ *:两张表有关联关系的数据

​ *:from 表 join 表 on 关联关系

select student.name,school.name from student
	join school on student.sid = school.id;

外连接:不仅包含有关联关系的数据,还包含没有关联关系的数据

​ 左外连接:left join on

*:以左表为主,左表的所有数据都展示,右表对应不上的以空展示
*:左表关联上右表的数据 + 关联不上的左表的数据
*:from 左表 left join 右表 on 关联关系

	select school.name,student.name from school
	left join student on student.sid = school.id;

​ 右外连接:right join on

*:以右表为主,右表的所有数据都展示,左表对应不上的以空展示
*:左表关联上右表的数据 + 关联不上的右表的数据
*:from 左表 right join 右表 on 关联关系

	select student.name,school.name from student
	right join school on student.sid = school.id;

​ 全外连接:full join on

*:两张表的数据都展示
*:左表关联上右表的数据 + 关联不上的左表的数据 + 关联不上的右表的数据

	select student.name,school.name from student
	full join school on student.sid = school.id;

交叉连接:cross join

*:两张表的数据一一对应,交叉形成最后结果

select student.name,book.bname from student
	cross join book;

伪表

伪列:

rownum

*:oracle分页的依据,每多一条数据自动加一

*:不能使用表名.rownum的写法

*:如果rownum用在where之后,rownum>=1 rownum<=任意值

  1. 实现第一页分页,编号1-10
select content from lyric where rownum between 1 and 10;
  1. 实现第二页分页,编号11-20
SELECT content FROM (select rownum rn ,content from lyric where rownum <=20) a
where a.rn>=11;
  1. 实现第三页分页,编号21-30
SELECT content FROM (select rownum rn ,content from lyric where rownum <=30) a
where a.rn>=21;
  1. 实现带有排序的分页效果
SELECT content FROM (select rownum rn ,content from (select * from lyric order by content desc) where rownum <=30) a
where a.rn>=21;

当前页:curpage 每页条数:pagesize

当前页的开始数:curpage-1)*pagesize+1 当前页截止数:curpage 乘 pagesize

rowid

数据库会在添加数据的时候给每一条数据增加的物理地址唯一标识

*:适用于删除完全重复的数据

delete from lyric where rowid not in
(select min(rowid) from lyric group by content);

in:表示是查询结果中的任意一个值

字段 in (值1,值2,值3)

字段<>值1 or 字段<> 值2 or 字段<> 值3

select id,name from school where id in (select sid from student);

not in:表示不能是查询结果中任意一个值

字段 not in (值1,值2,值3)

字段<>值1 and 字段<> 值2 and 字段<> 值3

select id,name from school where id not in (select sid from student);

some/any:用法与in相同,in用在无符号的情况,some/any用在有符号的情况

大于any = 大于min

小于any = 小于max

select id,name from school where id = some (select sid from student);	
select id,name from school where id > any (select sid from student);

all:比所有的值都大,比所有的值都小

大于all = 大于 max

小于all =小于min

select ename,sal from emp where sal >any (select sal from emp where deptno=20);
select ename,sal from emp where sal >all(select sal from emp where deptno=30);

exists:存在

not exists:不存在

select id ,name from school where exists (select sid from student where student.sid=school.id);

联合关键字

union:结果唯一【效率低】

结果进行合并,去重,排序【默认升序】

select id,name from school where name like '山东%'
union
select id,name from school where name like '%大学';

union all:结果不唯一【效率高】

拼合两个结果

select id,name from school where name like '山东%'
union all
select id,name from school where name like '%大学';

intersect:求交集

select id,name from school where name like '山东%'
intersect
select id,name from school where name like '%大学';

minus:第一个结果集中减去第二个结果集重复的数据

select id,name from school where name like '山东%'
minus
select id,name from school where name like '%大学';

零碎知识点

视图:view

将查询结果保存在数据库中,下次查询不需要编译直接从数据库中获取

经过函数修饰过的列名,需要重命名,不能重名

创建视图:

create view 视图名 as 查询语句

视图可以提高查询效率,避免没有权限的用户查看隐私字段

简单视图数据可以来源于原表,复杂视图需要手动编译(alter view 视图名 compile )

create view v_emp as select empno,ename,to_char(hiredate,'yyyy') year,sal from emp where sal>2000 order by sal desc;//创建视图
select * from v_emp;//查看视图
drop view v_emp ;//删除视图

序列:sequence

*:一个有序的整数列值,Oracle通过调用序列来实现主键自增
*:在一个新的会话中必须调用序列的下一个值,才能查看序列当前值
*:调用序列的下一个值会作为下一次调用序列的初始值

创建序列:

create sequence seq_test
increment by 1    -- 一次增长1
start with 1          -- 从1开始
minvalue 1           -- 最小值
maxvalue 100      -- 最大值
cycle                    -- 循环       默认不循环
nocache;              -- 不缓存   默认缓存20
  1. 消除延迟段创建特性
alter system set deferred_segment_creation = false;
  1. 创建表
create table test2(id number(5),name varchar2(20));
  1. 创建序列
create sequence seq_test2;
  1. 新增数据
insert into test2 values(seq_test2.nextval,'橘子');
insert into test2 values(seq_test2.nextval,'西瓜');
  1. 查询数据
select * from test2;

查看当前用户下有哪些序列:

select * from user_sequences;

查看序列的当前值:

select seq_test.currval from dual;

查看序列的下一个值:

select seq_test.nextval from dual;

删除序列:

drop sequence seq_test;

表空间tablespace

在一段内存中多数存储的是表,所以称为表空间

用户的表空间
普通用户的表空间
管理用户的表空间

为什么要给普通用户分配属于自己的表空间?
在项目中会出现多个项目访问同一个数据库的情况,会产生资源争用问题,给用户分配属于自己的表空间,就能解决资源争用问题。

创建表空间:

create tablespace table_user   -- 表空间的名字
datafile 'D:/table_user.dbf'      -- 表空间的位置
size 5M                                    -- 初始大小
autoextend on next 5M          -- 下一次自动拓展多少
maxsize 100M;                        -- 最大值

创建用户并给分配默认的表空间:

create user ET identified by etoak default tablespace table_user;

创建用户未指定表空间:

create user ET2 identified by etoak;

给用户修改表空间:

alter user ET2 default tablespace table_user;

删除表空间:
如果删除用户指定的表空间,该用户仍指向原表空间位置,需要手动指定一个有效的表空间位置

drop tablespace table_user including contents and datafiles;

索引:index[最有效的优化代码方式]

*:数据库会给唯一约束的列添加唯一索引

适用场景:数据量大 ,频繁查找的字段,外键

特点:提高查询效率,数据量大,查询多的列适合添加索引
增删改数据的时候数据库会耗费资源去维护索引

创建索引:

create index 索引名 on 表名(列名)

create index ind_name on student(name);

删除索引:

drop index 索引名

drop index ind_name ;

索引类型:

  1. 普通索引 normal
create index 索引名 on 表名(列名);
create index ind_name on student(name);
  1. 唯一索引 unique
create unique index 索引名 on 表名(列名);
create unique index ind_sid on student(sid);
  1. 位图索引 bitmap

分类索引

数量比较大,基数比较小

create bitmap index 索引名 on 表名(列名);
create bitmap index ind_cid on student(cid);
  1. 函数索引
create index 索引名 on 表名(函数(列名));
create index ind_lengthname on school(length(name));

删除索引:

drop index ind_sid;

什么情况会使索引失效?

  1. 使用like关键字模糊查询时,% 放在前面索引不起作用,只有“%”不在第一个位置,索引才会生效(like ‘%文’–索引不起作用)
  2. 使用联合索引时,只有查询条件中使用了这些字段中的第一个字段,索引才会生效
  3. 使用OR关键字的查询,查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,索引才会生效,否则索引不生效。
  4. 尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
  5. 对查询进行优化,应尽量避免全表扫描,首先应考虑在where以及order by涉及的列上建立索引。
  6. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
      select id from t where num/2=100
      应改为:
      select id from t where num=100*2
  7. 尽量避免在where子句中对字段进行函数操作,将导致引擎放弃使用索引而进行全表扫描。
  8. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
  9. 并不是所有的索引对查询都有效,sql是根据表中的数据来进行查询优化的,当索引列有大量数据重复时,sql查询不会去利用索引。
  10. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,
      因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,
      若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
  11. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
      这是因为引擎在处理查询和连接时会 逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

sql语句优化:

  1. 建议少用‘*’代替列名
  2. 用exists代替in
  3. 多表连接时,尽量减少表的查询次数
  4. 删除全表数据的时候用truncate代替delete
  5. 合理使用索引(详见索引)
  6. sql语句尽量大写,Oracle会默认把小写转换成大写在执行
  7. 在保证语句完整的情况下,多使用commit(begin…end)
  8. 优化group by,将不需要的数据尽量在分组之前过滤掉
  9. 连表查询的时候尽量使用表的别名,减少解析时间
  10. 表连接在where之前,where条件过滤顺序,能够更多的过滤数据的放在前面

4.2 Mysql

MySQL是一个关系型数据库管理系统,是由瑞典的MySQLAB公司研发,之后被Oracle 公司收购,
目前是甲骨文旗下的产品。
MySQL是目前最流行的关系型数据库管理系统之一在小型的web应用中,
MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个
大仓库内,这样就增加了速度并提高了灵活性。
但是注意,MYSQL中存在大量的database,用户首先选择database,之后在database中
建立表,这一点与Oracle不同。

MySQL同样使用SQL语言,此语言是用于访问数据库的最常用标准化语言。

MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,
尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

由于其社区版的性能卓越,安装简便,搭配Apache旗下的Tomcat等工具可以组成良好的开发环境。

1:使用CMD连接mysql mysql -u root -p etoak

*:在cmd中使用mysql命令时,我们可以直接指定要连接的数据源
mysql -u root -p etoak test

2:在开始菜单中连接mysql
开始->mysql->Line Client->enter password

查看当前有哪些可用的数据源:

	show databases;

创建数据源:

create database etoak;

使用某个数据源:

use etoak;

查看当前数据源下有哪些表:

show tables;

查看表结构:

desc 表名;
explain test;
show colums from test;

mysql中的自动增长:

create table test(
tid int primary key auto_increment,
tname varchar(10),
birth date
);

增加:

insert into test(tid,tname,birth) values(null,'葫芦娃','2018-04-16');
insert into test values(null,'金刚','2018-04-16');
insert into test(tid,tname,birth) values(null,'喜洋洋','2018-04-16');
insert into test(tid,tname,birth) values(null,'美羊羊','2018-04-16');
insert into test(tid,tname,birth) values(null,'懒洋洋','2018-04-16');
insert into test(tid,tname,birth) values(null,'沸羊羊','2018-04-16');
insert into test(tid,tname,birth) values(null,'灰太狼','2018-04-16');
insert into test(tid,tname,birth) values(null,'暖洋洋','2018-04-16');
insert into test(tid,tname,birth) values(null,'慢羊羊','2018-04-16');
insert into test(tid,tname,birth) values(null,'潇洒哥','2018-04-16');
insert into test(tid,tname,birth) values(null,'黑大帅','2018-04-16');

删除:

delete from test where tid=3;

修改:

update test set tname = '金刚' where tid = 2;

删除表:

drop table if exists test;

删除数据保留表结构:

truncate test;

分页:
如果limit之后只有一个值,从第一条开始数五条数据

select * from test limit 5;

如果有两个参数:第一个数为>5开始,第二个数多少个条数

select * from test limit 5,5;

拿取表中记录数:

select count(*) from test;
-- 复制表结构和表数据
create table emp2 as select * from emp;
-- 复制表结构
create table emp3 as select * from emp where 1 = 2;
-- 复制指定列的表结构和表数据
create table emp4 as select empno,ename from emp;
-- 在新表中给列以新的列名出现
create table emp5(id,name) as select empno,ename from emp;
-- 一次性添加多条数据
insert into emp3 select * from emp;
oracle和mysql的区别

1.Oracle基于用户的,表是属于某个用户的。所以,查看表首先需要登录到某个用户下;MySQL基于
Database的,表是存在于某个Database中的,所以要想查看表,首先打开某个database;
2.Oracle是不支持auto_increment自动增长列,【oracle数字主键可以使用序列生成主键】MySQL支持
auto_increment自动增长的。
3.Oracle不支持if [not] exists 子句,mysql支持的
4.Oracle分页使用关键字 rownum,MySQL分页 关键字 limit
5.oracle中sqlplus这个客户端是需要手动提交的,当执行完insert /update /delete语句时需要手动
commit;mysql的客户端自动提交的。

  1. 主键
    mysql:一般使用自动增长类型,在创建表的时候只要指定表的主键为auto_increment,
    插入记录时,不需要再指定该记录的主键值;
    oracle:没有自动增长类型,主键一般使用序列,插入记录时将序列号的下一个值赋给
    该字段即可。

  2. 分页
    mysql:limit开始位置,记录个数;
    oracle:通过rownum字段标明位置进行分页。

  3. 引号
    mysql:单引号,双引号都可以;
    oracle:一般不准使用双引,用了会报error。

  4. 分组
    mysql:group by 语句可以select 没有被分组的字段;
    group_concat()
    select tname,group_concat(tid)
    from test group by tname;
    oracle:select语句后必须有group by后分组的字段。
    wm_concat()

  5. 转换数据
    mysql:case when;
    oracle:decode();

  6. 空值处理
    mysql:非空字段也有空的内容;
    oracle:定义了非空字段就不容许有空的内容。
    按照mysql的not null来定义oracle的表结构,导数据时候会产生错误;
    因此导数据时要对空字符进行判断,如果为null或空字符,需要把它改成一个空格的字符串。

  7. 提交问题
    oracle中sqlplus这个客户端是需要手动提交的,当执行完insert /update/delete语句时需要手动commit;
    mysql的客户端自动提交的

  8. exists
    Oracle不支持if [not] exists 子句,mysql支持的

  9. 表的所属者
    Oracle基于用户的,表是属于某个用户的。所以,查看表首先需要登录到某个用户下;MySQL基于
    Database的,表是存在于某个Database中的,所以要想查看表,首先打开某个database;

欢迎点赞加评论

Oracle数据库基础知识+sql语句练习_第2张图片

你可能感兴趣的:(数据库,java,oracle,sql,锁)