MySql && Oracle

了解MySql & Oracle


mysql

  • 研发公司 : MySql --- 开源
  • 现公司 : Oracle --- 收费(部分功能)

oracle

  • 研发公司 : oracle

mysql --- oracle

  • 基础SQL一样 , 具体一些功能有所不同

MySql 普通操作


命名规则

  • 关键词大小写不敏感

注释

单行注释

--

-- 单行注释

多行注释

/**/

/*
多
行
注
释
*/

算术运算符

  • 加、减、乘、除、取余
-- 加
Select 2.5+8;

-- 减
Select 8-2.5;

-- 乘
Select 2.5*8;

-- 除
Select 8/2.5;  -- 保留小数位
Select 8 div 2.5;    -- 取整

-- 取余
Select 8%2.5;
Select 8 mod 2.5;

比较运算符

  • 大于、小于、等于、不等、多对判断
-- 大于
Select 8>1; -- 符合返回1

-- 小于
Select 8<1; -- 不符合返回0

-- 等于
Select 8=1;
Select 'a'='a';
Select null = null; -- 结果为空 ,判断空不能用等号
Select null is null; -- 判断结果是否为空
Select null <=> null; -- 安全等于,与普通等于区别于 判断null返回1或0

-- 不等
Select 8 != 1;
Select 2 <> 6;

-- 与 null 判断时 无论是否相同都返回 null
Select 8 != null; -- 结果为 null
Select 2 <> null; -- 结果为 null

Select 2 is not null; -- 判断结果是否不为空

-- 多对判断
Select 2 in (1,7,32,8,23,2); -- 一对多判断
Select 10 between 0 and 50;  -- 判断区间
Select 10 not between 0 and 50; -- 判断区间(否定)

逻辑运算符

  • and (与)
  • or (或)
  • not (非)

MySql 数据库操作


定义语言 (DDL)

  • create
  • drop
  • alter

创建表(Create)

数据类型

  • int
  • double
  • char(必须给长度) --- 按照定义长度存储
  • varchar(必须给长度)--- 按照实际长度存储
  • text(文本)
  • datetime(时间)
  • timestamp(时间戳类型)--- 默认值 CURRENT_TIMESTAMP
create table xxx -- (表名)
(
  -- 字段名称  类型(字符类型需要给初始长度)  约束条件  (int类型可以制定自增,一张表只有一个自增),
  -- 字段名 ... ,
  -- ...
);

主键

  • primary key
  • 唯一并且不为 null,一般情况 一表只有一主键

外键

  • foreign key
  • 连接其他表的主键

唯一

  • unique
  • 不能为 null

约束

  • CONSTRAINT

创建表格

  • 当存在外键时,删除表时需要先删除外键表,再删除该表
  • 创建时,需要县创建主表,再创建外键表
  • 外键名称为自定义名称,为了方便阅读信息 可写为 fk_xx_YY_yy fk为foreign key xx为本表中的需设为外键的字段 YY另一表格,yy连接外键的字段
Create table stu -- 创建 名为 stu 的表格
(
  -- 字段名称 id 数据类型 int 设置主键 自增
  id int primary key auto_increment,
  
  -- 字段名称 name 数据类型 varchar 数据长度 10 不为空
  name varchar(10) not null,
  
  -- 字段名称 sex 数据类型 char 数据长度 2 默认值为 男
  sex char(2) default '男',
  
  -- 字段名称 addtime 数据类型 datetime 默认值为 当前时间
  addtime datetime default NOW()
);

Create table child
(
  -- 字段名称 id 数据类型 int 设置主键 自增
  id int primary key auto_increment,
   
  -- 字段名称 cid 数据类型 int
  cid int,
  
  -- 字段名称 cname 数据类型 varchar 数据长度 10
  cname varchar(10),
  
  -- 约束条件 设置外键 本表中 cid 字段与外表 stu 中 id 字段 外键名称 child_cid_stu_id
  CONSTRAINT child_cid_stu_id foreign KEY(cid) REFERENCES stu(id) 
);

create table 表名
(select ... from 已有表) -- 根据结果集创建表
  • 根据结果集创建表

删除表(Drop)

DROP table child; -- 先删除外键表
DROP table stu; -- 再删除主表

区分 delete drop truncate

删除数据
  • delete truncate
  • delete 删除可以回滚(取消删除),处理速度慢
  • truncate 删除是没有回滚,处理速度快
删除表结构
  • drop

修改表(Alter)

  • modify --- 修改字段的 数据类型
  • change --- 修改字段的 名称 和 数据类型
  • rename --- 修改表的名字
  • add column --- 添加字段
  • add CONSTRAINT --- 添加约束
alter table stu
modify name int; -- 将字段 name 的类型修改为 int

alter table stu
change name sname varchar(5); -- 将字段 name 名称变成 sname 并将类型修改为 varchar

alter table stu
rename student;  -- 将表 stu 名称更改为 student

alter table student
add column score double(5,2); -- 添加字段 score 字段,长度为 5位 其中小数占 2位 整数占 3位

alter table student
add CONSTRAINT fk_id_child_cid foreign key(id) REFERENCES child(cid); -- 添加约束 外键

alter table student
drop score; -- 删除字段

alter table student
drop foreign key fk_id_child_cid; -- 删除外键

查询语言 (DQL)

  • Select

单表查询(Select)

  • ' * ' --- 通配符,表示所有
  • where --- 过滤 --- 其身后不能接聚合函数
  • like --- 模糊查询 , % --- 占位符 , _ --- 占位符
  • group by --- 分组 --- 其身后不能接聚合函数
  • max、min、avg、count --- 最大、最小、平均、求个数 (聚合函数) --- 聚合函数不能互相嵌套
  • having --- 与where作用相似 --- 身后可跟聚合函数
  • order by --- 排序(默认从小到大)倒序 desc
  • limite --- 截取数目 --- limit a,b 从 a开始 去不包括a , 取b条
  • current --- 当前页数
  • page --- 每页显示数据 --- page page*(current - 1),page
  • year(字段名) --- 截取到年
  • month(字段名) --- 截取到月
  • day(字段名) --- 截取到日
  • between a and b --- a-b之间
  • distinct --- 去重
  • concat(aaa,bbb) --- 字符串拼接
  • as --- 使用别名
  • union --- 去重(主键)
  • union all --- 不去重连接,显示所有内容
  • 执行顺序 from --- where --- group by --- having --- order by --- limit
-- 查询整表
Select * from job;
Select id,recDate,source,position,name,age,tel,sex from job;

-- 查询年龄大于18的女生
Select * from job where age > 18 and sex = '女';

-- 模糊查询
Select * from job where name like '张%';

-- 以 8 结尾的电话号
Select * from job where tel like '%8';

-- 包含 8 的电话号
Select * from job where tel like '%8%';

-- 查询两个字名字
Select * from job where name like '张_';

-- 查询三个字,中间为 海
Select * from job where name like '_海_';

-- 查询男女各多少人
Select count(sex) from job where sex = '男';
Select count(sex) from job where sex = '女';
-- 分组函数 
Select count(*),sex from job group by sex;

-- 查询最大、小、平均年龄
Select MAX(age) from job;
Select MIN(age) from job;
Select AVG(age) from job;

-- 查询岗位申请人数,排序
Select count(*),position from job group by position order by count(*) desc;

-- 最受欢迎岗位
Select count(*),position from job group by position order by count(*) desc limit 1;

-- 查询出都有哪些岗位提供给求职者
select position from job group by position;

-- 去重
select distinct position from job;

-- 每一年的求职者人数有多少,现实要求 xxxx 年, n 人
select concat(year(recDate),'年') as '年份', concat(count(*), '人')
from job group by year(recDate);

-- 字段别名
select year(recDate) as '年份' , count(*) as '人数' 
from job group by year(recDate);

select year(recDate) '年份' , count(*) '人数' 
from job group by year(recDate);

多表查询

自连接 自查询

  • 嵌套
-- 本表中年龄最大的求职者
select name,age,from job where age =
select max(age),name from job;

外连接

左外连接
  • left join
  • 显示左表格全部信息
select d.com_id,d.com_name,e.com_id from dept d left join emp e on d.com_id = e.comid
右外连接
  • right join
  • 显示右表格全部信息
select d.com_id,d.com_name,e.com_id from dept d right join emp e on d.com_id = e.comid
左 --- 右 外连接
  • 左连接是以左表格为基础向右表进行查询,显示左表全部信息
  • 右连接是以右表格为基础向左表进行查询,显示右表全部信息
  • 左外连接 与 右外连接可以穿插使用
全外连接
内连接
  • inner join
  • 显示两张表公共信息
select d.com_id,d.com_name,e.com_id from dept d inner join emp e on d.com_id = e.com_id;
环绕连接
  • cross join
  • 两张没有关联的表的信息,信息条数是两张表数量的乘积 --- 笛卡尔积
  • 用于求有多少条数据
select d.com_id,d.com_name,e.com_id, from dept d cross join emp e;
不使用关键词
  • 内连接
select * from emp e,dept d where e.com_id = d.com_id

操作语言 (DML)


  • insert
  • update
  • delete
  • merge

添加操作(Insert)

用法

  • 字段赋值必须和数据中类型、数量、位置一一对应
insert into 表名 values();

根据查询结果添加数据

  • 结果集字段类型、数量、位置需要保证一致
insert into 表1
(select ... from 表2 where 条件); -- 使用结果集添加

修改更新(Update)

  • 注意 :修改数据不给条件会将所有信息进行修改

用法

update 表名 set 修改内容; -- 全部修改

update 表名 set 修改内容 where 修改条件; -- 精确修改

删除操作(Delete)

  • 注意 :删除数据不给条件会将所有信息进行修改

用法

delete from 表名; -- 全部删除

delete from 表名 where 删除条件; -- 精确删除

视图 (view)

  • 不直接存入内存(不占内存)
  • 面向用户,将表以视图形式展示给用户,避免用户看到表结构

创建视图

create view 视图名 as
(select * from 表名);

事务(autocommit)

  • 保存点 (savepoint)
  • 提交(commit)
  • 回滚(rollback)

用法

set autocommit 0; -- 非自动提交(可回滚)
delete from stu where name = '李四';
rollback; -- true

set autocommit 1; -- 自动提交(回滚无效)
delete from stu where name = '李四';
rollback; -- false

-- -----------------------------------------------

set autocommit 0; -- 非自动提交(可回滚)
delete from stu where name = '李四';
commit; -- 先保存后回滚
rollback; -- false

set autocommit 1; -- 自动提交(回滚无效)
delete from stu where name = '李四';
rollback; -- true
commit; -- 先回滚后保存(无提交内容)

-- -----------------------------------------------

set autocommit 0; -- 非自动提交(可回滚)
delete from stu where name = '李四';
savepoint a; -- 保存点
delete from stu where name = '张三';
rollback to a;
commit -- 张三未删除,李四删除

只适用于有回滚的删除(delete)

Orical 操作

创建表

  • mysql 为 char,varchar
  • Oracle为 varchar ,varchar2
  • 添加当前时间方式与 mysql 不同
  • 无自动递增
create table username
(
    id int primary key,
    name varchar2(10) default'',  -- varchar varchar2 相当于Mysql char varchar
    sex varchar2(5),
    tel varchar2(11) unique,
    addtime date default sysdate  --  sysdate 默认系统时间,年月日,时分秒
);

添加数据

  • 每次只能添加一组数据
  • 年月日插入需要通过 to_date 方法
  • 24H / 12H 方法也不是用大小写区别
  • 分钟也变成了 mi
  • 表后接括号,就可以只添加需要输入的字段(其他字段有默认值情况下),Mysql 和Oracle 都适用
  • 多了个根据变量添加数据
-- 添加数据 一次只能插入一个数据
insert into username values
(1,'张三','男','123456',to_date('1997-10-1','yyyy-mm-dd'));  --  年月日的插入方法

insert into username values
(2,'李四','男','654321',to_date('1997-10-1 14:12:56','yyyy-mm-dd,hh24:mi:ss'));  --  24H时间插入方法

insert into username values
(3,'王五','男','142536',to_date('1997-10-1 3:12:56','yyyy-mm-dd,hh:mi:ss')); -- 12H时间插入方法

insert into username(id,tel) values  -- 括号内添加需要输入的字段(两个数据库都适用)
(4,'635241');

-- 根据变量添加数据
insert into username(id,tel) values
(&id,&tel);

insert into username(id,tel,addtime) values
(&id,&tel,to_date('&addtime','yyyy-mm-dd'));

insert into username values
(&id,'&name','&sex',&tel,to_date('&addtime','yyyy-mm-dd'));
  • 其余操作和Mysql没有太大区别

检查(check)

  • 限制写入信息
create table username1
(
    id int primary key,
    name varchar2(10) default'',  -- varchar varchar2 相当于Mysql char varchar
    sex varchar2(5) check (sex in ('男','女')), -- 限制写入男女
    tel varchar2(11) unique,
    addtime date default sysdate  --  sysdate 默认系统时间,年月日,时分秒
    constraint check_sex check (sex in ('男','女'))
);

create table username2
(
    id int primary key,
    name varchar2(10) default'',  -- varchar varchar2 相当于Mysql char varchar
    sex varchar2(5),
    tel varchar2(11) unique,
    addtime date default sysdate,  --  sysdate 默认系统时间,年月日,时分秒
    constraint check_sex check (sex in ('男','女'))  -- 通过约束限制写入男女
);

伪列(rownum)

  • 相当于 mysql 的 Limite
  • 查询非第一条数据的范围、精确条数数据需要嵌套查询
select * from username where rownum = 1; -- 取第一条

select * from username where rownum >= 1; -- 取所有

select * from username where rownum <= 4; -- 取前五条

select * from username where rownum >= 4; -- false

-- 查询非第一条数据需要嵌套查询 不能直接查*,否则报 表达式缺省 错
select * from (select rownum r ,id,name from username) where r = 3; -- 可以读取每一条信息
select * from (select rownum r ,id,name from username where rownum <= 5) where r >=2; -- 第二条到第四条

序列(sequence)

  • 用于sql 优化: 给表添加序列,检索速度更快
-- 序列
create sequence seq_a
increment by 1 -- 每次递增数量
start with 1   -- 开始数
maxvalue 999   -- 当前序列最大值 nomaxvalue 没有最大值
minvalue 1     -- 当前序列最小值 nominvalue 没有最小值
cycle -- 是否循环 是 cycle 否 nocycle
cache 10-- 是否有缓存 是 cache + 缓存数 否 nocache

drop sequence seq_a; -- 删除序列

alter system flush shared_pool-- 清除缓存

insert into T_USER values(seq_a.nextval,'张三','男','123312',sysdate);
posted @ 2021-09-28 11:18  YoursEntice  阅读(78)  评论(0)    收藏  举报
TOP 底部