进入DOS按: win+R 输入sqlplus 回车
username: sys as sysdba 回车
password : 密码为空不写直接回车
检查当前登录的用户: show user
(1)conn[ect]
用法: conn 用户名/密码@网络服务名 [as sysdba/sysoper]
当用特权用户身份连接时,必须带上 as sysdba 或是 as sysoper
案例: conn scott/123456
(2)disc[onnect]
说明:该命令用来断开与当前数据库的连接
(3)passw[ord]此命令只适用于SYSTEM
说明:该命令用于修改用户的密码.如果要想修改其它用户的密码,需要用sys/system登陆.
(4)show user
说明:显示当前用户名
(5)exit
说明:该命令会断开与数据库的连接,同时会退出sql*plus
修改权限设置一般情况下使用dba用户
语法:alter user 用户名 identified by 新密码;
案例:alter user system identified by 123456;
锁定用户
语法:alter user 用户名 account lock;
案例:alter user scott account lock;
解除锁定
语法:alter user 用户名 account unlock;
案例:alter user scott account unlock;
显示和设置环境变量
概述:可以用来控制输出的各种格式。
(1)linesize
说明:设置显示行的宽度,默认是80个字符
sql>show linesize 显示宽度
sql>set linesize 90 设置宽度
(2)pagesize
说明:设置每页显示的行数目,默认是14,用法和linesize一样。
至于其它环境参数的使用也是大同小异
Spool c:/笔记.txt
Spool off (结束)
“/”执行上一条语句
Edit(修改错误的语句)修改完成输入“/”执行
“--”单行注释
/**/多行注释
查看表结构:desc emp(常用)
清屏 host cls
set timing on/off(on表示开启Oracle中语句执行时间的计算)
管理员用户使用普通用户的表
语法: select * from 用户名.表名
语法:create user 用户名 identified by 密码
案例: create user scxh identified by 123456;
备注: 新创建的用户,没有任何的权限,包括登录都没有
给用户修改密码
概述:如果给自己修改密码可以直接使用
sql>password 用户名
如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限
sql>alter user 用户名 identified by 新密码
例子: sql> create user dongshao identified by m123
default tablespace users
temporary tablespace temp
quota 3m on users;
identified by 表明该用户dongshao 将用数据库方式验证
default tablespace users //用户的表空间在users上
temporary tablespace temp //用户dongshao的临时表健在temp 空间
quota 3m on users //表明用户dongshao 建立的数据对象(表,索引,视图,pl/sql块..)最大只能是3m
刚刚创建的用户是没有任何权限的,因此,需要dba给该用户授权.
sql>grant connect to dongshao
如果你希望该用户建表没有空间的限制
sql>grant resource to dongshao
如果你希望该用户成为dba
sql>grant dba to dongshao
删除用户
概述:一般以dba的身份去删除某个用户,
如果用其它用户去删除用户则需要具有 drop user的权限。
比如 drop user 用户名 【cascade】
案例: drop user scxh cascade;
cascade: 如果这个用户下面创建了表,则使用这个
System给东少权限时
Grant connect to dongshao with admin option
create session:登录
create table :创建表
create view:试图
1.创建2个用户
Create user dongshao1 identified by 123456;
Create user dongshao2 identified by 123456;
2.给dongshao1这个用户添加权限,并且让其可以继续授予其他用户的权限
grant create session,create table to dongshao1 with admin option;
grant create view to dongshao1;
3.使用dongshao1用户给dongshao2用户授权.
grant create session,create table to dongshao2 with admin option;
4.使用dongshao1用户给dongshao2授权视图权限的时候,会提示权限不足
grant create view to dongshao2;
5.回收权限
revoke create session from dongshao1; --这个是冬哥哥
1.创建两个用户 qq , tt.初始阶段他们没有任何权限,如果登陆就会给出错误的信息
1.1创建两个用户,并指定密码.
2.给用户qq授权:
2.1:授予create session 和create table权限时 带with admin option
2.2 授予create view 时不带with admin option
给用户设置对象权限
grant 权限 on 对象 to 用户名 with grant option
grant select on emp to monkey
设置用户访问权限更加精细控制.(授予列权限)
语法: grant update on 表名(列名称) to 用户名
案例: grant update on emp(sal) to monkey;
㈠建立角色(不验证)
如果角色是公用的角色,可以采用不验证的方式建立角色.
语法:create role 角色名 not identified;
案例:create role mydongshao1 not identified; 没有任何权限
㈡建立角色(数据库验证)
语法:create role 角色名 identified by 口令
案例:create role 角色名 identified by dongshao
指定scott这个用户最多只能尝试3次登陆,锁定时间为2天,让我们看看怎么实现
创建profile文件
语法:create profile pro名称 limit failed_login_attempts 3次 password_lock_time 2天;
sql> create profile lock_account limit failed_login_attempts 3 password_lock_time 2;
给用户设置profile
语法: alter user 用户 profile pro名称;
sql> alter user scott profile lock_account;
语法:
create table 表名(
字段名称1 字段类型,
字段名称2 字段类型
...
)
创建一个表,对这个表进行CRUD
案例: 创建一个wwdz,然后对这个进行表增删改查
create table wwdz(
id number, --编号
name varchar2(20), --姓名
tel char(11), --电话
datetime date default sysdate --时间
);
语法: select * from 表名
案例: select * from wwdz
对wwdz这个表添加一条数据
语法: insert into 表名(字段名称1,字段名称2,字段名称3,...) values(值1,值2,值3,...);
案例: insert into wwdz(id,name,tel) values(2,'还厉害哦',12312312312);
案例: insert into wwdz(id,name,tel) values(2,'还厉害哦','12312312312');
案例: insert into wwdz(id,name,tel) values('三','你真的很厉害哦','12312312312'); 错误的
修改wwdz表中的某一行数据
语法: update 表名 set 字段名称1=值1,字段名称2=值2 备注: 如果执行这个语句,整个表都将被修改(慎用)
语法: update 表名 set 字段名称1=值1,字段名称2=值2 where 条件
案例: 修改编号2这个用户的电话号码为:13888888888,姓名: 方志华
案例: update wwdz set name='方志华',tel=138888888888 where id=2;
删除wwdz表中某一条数据
语法: delete from 表名 如果执行这个语句,整个表的数据都没有了(慎用)
语法: delete from 表名 where 条件
案例: delete from wwdz where id=3;
删除表:
语法:drop table 表名
案例:drop table wwdz
表:
语法:
create table 表名(
字段1 类型1,
字段2 类型2,
)
添加
insert into 表名(字段1,字段2) values(值1,值2,)
修改
update 表名 set 字段1=值,字段2=值 where 条件
删除:
delete from 表名 where 条件
查询:
查询表中的所有数据:select * from 表名
带条件查询: select * from 表名 where 条件
单独查询指定字段: select 字段1,字段2,... from 表名 where 条件
varchar2(20) 变长
char(20) 定长
字符类型,并且长度为20字符(10个中文)
面试题: 请问varchar2和char之间有什么区别? 谁的查询速度更快
答: varchar2是变长,保存的值实际的长度,但是char是定长,如果保存的值没有达到
指定的长度,则使用空格填充,反之超出则会报错(自动截取到指定长度然后保存)
char的查询速度比varchar2更快,因为在进行查询的时候char不需要计算长度直接
进行对比,而varchar2首先进行长度的计算,然后在进行值的查询.
number : 数值
语法: number(p,s)
案例: number(5,2);
解释: 代表数值类型,有五个有效位,两个小数位(最大位:999.99)
子查询创建表
根据一个表来创建另外的一个表:(表结构和表内容一起被复制)
语法: create table 新表名 as select * from 旧表名
案例: create table dongshao as select * from emp;
查看结果: select * from dongshao;
只复制表的结构
语法:create table 新表名 as select * from 旧表名 where 1=2
案例:create table dongge as select * from emp where 1=2
查看结果:select * from dongge;
查看结构: desc dongge;
复制表内容(将一个原有表中的数据,复制到另一个表中,不指定字段,全部复制)
语法:insert into 目标表 select * from 原表
案例:insert into dongge select * from emp
查看结果: select * from dongge;
复制表内容(将一个原有表中的数据,复制到另一个表中,并且指定字段)
语法:insert into 目标表(字段1,字段2) select 字段1,字段2 from 原表
案例:insert into tongzhai(id,name) select empno,ename from emp
创建一个tongzhai表
create table tongzhai(
id int,
name varchar(30)
)
查看结果
select * from tongzhai;
mysql命令
查看所有的数据库
show databases;
查看所有的表
show tables;
创建数据库
create database 库名
在mysql中创建emp表
create table emp(
empno int,
ename varchar(20),
job varchar(20),
mgr int,
hiredate Date,
sal double(7,2),
comm double(7,2),
deptno int
)
desc emp;
INSERT INTO EMP
VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20);
INSERT INTO EMP
VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
INSERT INTO EMP
VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
INSERT INTO EMP
VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, NULL, 20);
INSERT INTO EMP
VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
INSERT INTO EMP
VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, NULL, 30);
INSERT INTO EMP
VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, NULL, 10);
INSERT INTO EMP
VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, NULL, 20);
INSERT INTO EMP
VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO EMP
VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
INSERT INTO EMP
VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, NULL, 20);
INSERT INTO EMP
VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, NULL, 30);
INSERT INTO EMP
VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, NULL, 20);
INSERT INTO EMP
VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, NULL, 10);
select * from tongzhai;
insert into tongzhai(id) values(1);
desc tongzhai
追加新列
语法:alter table 表名 add 字段名 类型;
案例:alter table tongzhai add age tinyint;
tinyint: 范围: -128到127
修改列
语法:alter table 表名 modify 字段名 类型;
案例:alter table tongzhai modify age int;
修改默认值的设置:
语法:alter table 表名 modify 字段名 类型 default 默认值;
案例:alter table tongzhai modify age int default 11;
删除列(不要轻易删除一个字段)
语法:alter table 表名 drop column 字段名
案例:alter table dongshao drop column address
重命名列
语法:alter table 表名 rename column 旧名称 to 新名称
案例:alter table dongshao rename column name to a_name
修改表的名称(表的名称也不要修改)
语法:rename 旧表名 to 新表名;
案例:rename student2 to do;
创建约束:
语法:
create table 表名(
字段名称 字段类型 constraint 约束名称 约束
字段名称 字段类型 constraint 约束名称 约束 约束
......
)
案例:
create table myperson(
id varchar2(18) constraint myperson_PK primary key, --primary key主键约束
name varchar2(40) constraint myperson_Name_notnull not null, --not null不能为空
gender varchar2(4) constraint myperson_Gender check (gender in ('男','女')), --check查验
email varchar2(40) constraint myperson_Email_unique unique --unique唯一
constraint myperson_Email_notnull not null, --not null不能为空
deptno number constraint myperson_FK references dept(deptno) ON DELETE CASCADE
--references外键约束
);
删除约束:
语法:alter table 表名 drop constraint 约束名称;
案例:alter table myperson drop constraint myperson_PK;
给列添加约束
语法:alter table 表名 add(constraint 约束名称 约束(字段))
案例:alter table dongge add(constraint pk_id primary key(id))
创建一个表
create table bb(
id number primary key,
name varchar2(20) default '成都新华高级技工学校',
age number(2) not null,
zhc varchar2(20) default '' not null,
status number, --1: 正常,0:非正常
create_time number --时间戳:1232654553 时间:'2022-12-12 12:12:12'
)
创建一个表,要求有(编号,姓名,性别,时间,年龄,电话,描述)
create table db(
id number,
name varchar2(20),
sex varchar(2),
time date,
nianling varchar(2),
tel char(11),
miaosu varchar(40));
给表中的编号设置主键约束
alter table db add(primary key(id));
给表中的姓名设置不能为空
alter table db modify name not null;
给表中的性别设置只能选择男或者女
alter table db add(constraint xb check(sex='男' or sex='女'));
给表中的时间设置默认为系统时间
alter table db modify time default sysdate;
给表中的年龄设置一个范围18--22之间
alter table db add(constraint nianling_check check(nianling>=18 and nianling<=22));
alter table db drop constraint nianling_check;
alter table db add(constraint nianling_check check(nianling between 18 and 22));
给表中的电话设置唯一
alter table db modify tel unique;
添加表注释
语法:comment on table 表名 is '注解名称';
案例:comment on table student is '学生表';
添加每个字段的注释
语法:comment on column 表名.字段名称 is '注解名称';
案例:comment on column db.tel is '电话号码';
添加语句:
语法1: insert into 表名(字段1,字段2,..) values(值1,值2,..) 字段和值一一对应
语法2: insert into 表名 values(值1,值2,..) 一一对应
插入之前改变日期表达式的方法:(日-月-年) '15-3月-2022' '2022-03-15'
alter session set nls_date_format='yyyy-mm-dd';
插入数据时修改时间表达式
insert into emp(empno,hiredate) values(9527,to_date('1990-02-03','yyyy-mm-dd'));
修改数据
语法: update 表名 set 字段=值,字段=值 where 条件
删除
语法: delete from 表名 where 条件
查询表中所有数据
select * from 表名
查询表中指定列
select 列1,列2,.. from 表名
根据条件查询指定的数据
select * from 表名 where 条件
where: 条件查询,根据指定的条件进行查询
emp表中的字段的解释
EMPNO : 编号
ENAME : 姓名
JOB : 职位
MGR : 领导的编号
HIREDATE : 入职日期
SAL : 工资
COMM : 奖金
DEPTNO : 部门编号
?显示每个雇员的年工资
select sal12 from emp;
使用列的别名: as 设置别名
语法: select 字段 as 别名 from 表名;
语法: select 字段 别名 from 表名;
select sal12 as "年薪" from emp;
select sal12 "年薪" from emp;
select sal12 year_money from emp;
如何处理null值
select ename,(sal12)+comm from emp; 这里我们使用年薪+null = null
使用nvl函数来处理
语法: nvl(字段,默认): 如果字段不为null,则使用字段的值,否则使用默认值(默认值为自定义)
语法案例:select nvl(字段名称,默认值) from emp;
sql案例:select ename,(sal12)+nvl(comm,0) from emp;
如何连接字符串(||)(输出: XXX姓名的工资的多少)
语法: 字段名称 || 字段名称
select ename||'的薪资为:'||sal from emp;
select ename||sal from emp;
?如何显示某人是什么岗位
select ename,job from emp where ename='黄木城';
使用where子句
?如何显示工资高于3000的员工
select * from emp where sal >= 3000;
?如何查找1982.1.1后入职的员工
select * from emp where hiredate >= '1982';
?如何显示工资在2000到3000的员工情况
select * from emp where sal >= 2000 and sal <= 3000;
between——在某个范围:
语法: 字段名称 between 起始值 and 结束值
select * from emp where sal between 2000 and 3000;
?如何显示工资不在2000到3000的员工情况
select * from emp where sal not between 2000 and 3000;
?查询SMITH 的薪水,工作,所在部门
select ename,sal,job,depeno from emp where ename='SMITH';
1、distinct——过滤掉多余的重复记录只保留一条
select distinct deptno from emp; 这里,distinct deptno会过滤掉重复的deptno
select distinct comm from emp; distinct也可以过滤掉重复的null,或者说如果有多个null,只输出一个
select distinct comm, deptno from emp; 把comm和deptnor的组合进行过滤
select deptno, distinct comm from emp; 逻辑上有冲突
select ename, * from emp; 这个在SqlServer里正确,在Oracle里不正确
in(属于若干个孤立的值)
语法: 字段 in(值1,值2,值3);: 如果没有查询到,则返回空,不显示
语法: 字段 not in(值1,值2,值3);: 不在这个范围内的所有数据
案例: empno in(6666,7777,8888,9999)
表案例: select * from emp where ename in('大哥','黄木城');
数据库中的 and和&&一个意思 or和||一个意思
表案例: select * from emp where ename='大哥' or ename='黄木城';
表案例: select * from emp where empno in(6666,7777,8888,9999);
不在这个范围内的所有数据 not in
表案例: select * from emp where empno not in(6666,7777,8888,9999);
null 空 ,没有值
零和null是不一样的,null表示空值,没有值;零表示一个确定的值
null不能参与如下运算:<> != =
null可以参与如下运算:is is not
语法: select * from 表名 where 字段 is null
语法: select * from 表名 where 字段 is not null
select * from emp where comm <> null; --错误
select * from emp where comm != null; --错误
select * from emp where comm is not null; --正确
select * from emp where comm = null; --错误
select * from emp where comm is null; -- 正确
select * from emp where comm is null; --输出奖金为空的员工的信息
select * from emp where comm is not null; --输出奖金不为空的员工的信息
思考:如何显示没有上级的雇员的情况
select * from emp where mgr is null;
如果不指定排序的标准,则默认是升序,升序用asc表示,默认可以省略不写,降序用desc表示
为一个字段指定的排序标准并不会对另一个字段产生影响
强烈建议为第一个字段都指定排序的标准
语法: select * from 表名 order by 字段 asc; 默认为升序asc(可以不写)
语法: select * from 表名 order by 字段1,字段2; 都是升序
语法: select * from 表名 order by 字段1,字段2 desc; 先升后降
语法: select * from 表名 order by 字段1 desc, 字段2; 先降后升
语法: select * from 表名 order by 字段1 desc, 字段2 desc; 都降
备注: 在进行排序时,如果设置了多个,当第一个有相同排序时,则继续执行第二排序规则
语法:
select * from 表名 where 字段 like '%值%'; 匹配带有该值的所有字段的值
select * from emp where ename like '%S%'; 匹配ename字段所有值中带有S的名字
select * from 表名 where 字段 like '值%'; 匹配以该值开头的所有字段的值
select * from emp where ename like 'S%'; 匹配ename字段以S开头的所有字段值
select * from 表名 where 字段 like '%值'; 匹配以该值结尾的所有字段的值
select * from emp where ename like '%S'; 匹配ename字段以S结尾的所有字段值
何波提问: 万一别人的名称里面就有'_'怎么办??
select * from 表名 where 字段 like '值%'; 第一个''占位符,查询字段值的第二个值相同的字段值
select * from 表名 where 字段 like '_S%'; 匹配ename第二个值为s的所有字段值
select * from 表名 where 字段 like '__值%'; 前两个'_'占位符,查询字段值的第三个值相同的字段值
select * from emp where ename like '__S%'; 匹配ename第三个值为s的所有字段值
思考:在 emp 表中查询工资高于500或是岗位为MANAGER的雇员,
同时还要满足他们的姓名首字母为大写的 J。
select * from emp where sal>500 or job='MANAGER' and ename like 'J%';
1.找出佣金高于薪金的雇员
select * from emp where comm>sal;
2.找出佣金高于薪金60%的雇员
select * from emp where comm>sal*0.6;
3.找出部门10中所有经理和部门20中的所有办事员的详细资料
select * from emp where (job='MANAGER' and deptno='10') or (job='CLERK' and deptno='20');
4.显示不带有'R'的雇员姓名
select * from emp where ename not like '%R%';
5.显示雇员姓名,根据其服务年限,将最老的雇员排在最前面
select ename,hiredate from emp order by hiredate;
6.显示所有雇员的姓名、工作和薪金,按工作的降序顺序排序,而工作相同时按薪金升序
select ename,job,sal from emp order by job desc,sal;
AVG(字段) 数字表达式中所有值的平均值
SUM(字段) 表达式中所有值的和
COUNT(字段) 表达式中值的个数
COUNT(*) 统计总条数
MAX(字段) 表达式中的最高值
MIN(字段) 表达式中的最低值
?如何显示所有员工中最高工资和最低工资
select max(sal),min(sal) from emp;
?显示所有员工的平均工资和工资总和
select avg(sal),sum(sal) from emp;
?计算共有多少员工
select count(*) from emp;
扩展要求:
?请显示工资最高的员工的名字,工作岗位
???想想应该怎么写
?请显示工资高于平均工资的员工信息
这个我也不会?????
分组: 面试题哦!
group by 和 having子句
group by用于对查询的结果分组统计,
having子句用于限制分组后显示结果.
查询出emp表中有哪些职位
select * from emp order by job;
select job from emp group by job;
select distinct job from emp;
select comm from emp group by comm;
?如何显示每个部门的平均工资和最高工资
select deptno,max(sal) ,avg(sal),sum(sal) from emp group by deptno;
?显示每个部门的每种岗位的平均工资和最低工资
select job,max(sal) ,avg(sal),min(sal) from emp group by job;
?显示平均工资低于2000的部门号和它的平均工资
select avg(sal),deptno from emp group by deptno having avg(sal) < 2000 ;
扩展要求:
显示工资低于2000,部门平均工资低于1000的部门号和部门平均工资
select deptno,avg(sal) from emp where sal<2000 group by deptno having avg(sal)<1000;
语法: select * from 表名1,表名2 where 条件(条件是两个表都满足的情况下)
显示所有员工的姓名,工资,部门号和部门名称
?查询雇员姓名,工资以及工资等级
select e.ename, e.sal, s.grade from emp e,salgrade s
where e.sal between s.losal and s.hisal;
?如何显示部门号为10的部门名、员工名和工资
select d.dname,e.ename,e.sal from emp e,dept d where e.deptno=d.deptno and e.deptno=10;
扩展要求:
?显示雇员名,雇员工资,工资等级及所在部门的名字,并按部门排序.
select e.ename,e.sal,s.grade from emp e,dept d,salgrade s where
(e.sal between s.losal and s.hisal)and e.deptno=d.deptno order by d.dname;