1.数据库
1.登陆数据库
使用windows+r健,然后输入cmd,进入命令框,连接用户,sqlplus+用户名/密码
把会话环境改成中文模式:
alter session set nls_language='simplified chinese';
把会话环境改成英文模式:
alter session set nls_language=english;
然后导入数据表: @表名.sql.
sql语句的分类:
1.DQL:主要是查询语句语言———主要是select语句
2.DML:数据操纵语言———改变数据库中的是数据,
主要是insert,update,delete语句
3.DDL:数据定义语言———主要是建立修改删除数据库中的对象,
主要是create,alter,drop,truncate语句
4.TCL:事物控制语句,用来维护事物的一致性,
主要是commit,rollback,savapoint语句
5.DCL:数据控制功能
用来执行权限授予和权限收回操作,
主要是grant,revoke语句
1.单行函数
select语句基础
举几个例子:
1.查看s_dept中所有的记录
select *
from s_dept;
2.查看s_dept中的指定字段
select id,name,salary
from s_dept;
2.运算:
1.查看每个员工的id,年薪和名字,(但是不会对原始数据做修改)
select id,last_name,salary*12
from s_emp;
2.查看每个员工的员工id,名字和月薪涨100以后的年薪
select id,last_name,(salary+100)*12
from s_emp;
3.起别名
1.查看员工的员工id,名字和年薪,年薪列名为annual
select id,last_name,salary*12 [as] annual
from s_emp;
或者是
select id,last_name,salary*12 annual
from s_emp;
4.拼接语法
1.查看员工的员工id,全名
select id,firat_name||last_name
from s_emp;
2.查看员工的员工id,全名和职位名称,全名和职位名称合并成一列显示,且格式为:姓名,职位名称
select id,first_name||' '||last_name||','||title tiltename
from s_emp;
5.nvl:使用nvl函数可以对null进行替换
例:查看所有员工的员工id,名字和提成,如果提成为空,显示成0
select id,last_name,nvl(commission_pct,0) commission_pct
from s_emp;
6.distinct:该可以将重复数据去除,
如果后面出现多列,就是代表多列去重,就是多列的值都相同才会认为是重复的数据。
select distinct dept_id,title
from s_emp;
7.fommat:可以将查询的结果显示的宽度进行调整
例如:将id设置成宽度为15的_的个数。
col id for a15
2.sqlplus相关的命令:
常用的命令:
l 查看缓存中的sql语句
a 在[定位]的那一行后面追加新的内容
i 在[定位]的那一行下面插入新的一行
c 替换[定位]的那一行中的某些字符串 ,格式为:c/老的字符串/新的字符串
del 删除[定位]的那一行内容
n 后面加内容可以重写这一行
$ 后面跟一个终端命令,例如$cls清屏,linux中使用!
/ 执行缓存sql命令
特殊的spool命令:可以记录操作的过程
3.排序:
例:查看员工的id,名字和薪资,按照薪资的降序排序显示,工资相同就按名字升序排序
select id,last_name,salary
from s_emp
order by salary desc, last_name [asc];
4.条件查询:
格式:
select 列名…
from 表名…
where 操作的列名 比较操作表达式
例:查看员工工资小于1000的员工id和名字
select id,last_name,salary
from s_emp
where salary <1000;
常用操作符:
1.between and
查看员工工资在700到1500之间的
select id,last_name,salary
from s_emp
where salary between 700 and 1500;
2.in():表示值在一个指定的列表中
例:查看员工id=1,3,5,9的员工工资
select id,salary
from s_emp
where id in(1,3,5,9);
3.like:模糊查询,表示在值不精确的时候用
%:代表0-多个字符
_:代表一个字符
:转义字符 ,需要escape关键字,后面加的字符代表本来的意思
例:
查看员工名字以C字母开头的员工的id,工资
select id,last_name,salary
from s_emp
where last_name like 'C%';
查看员工名字包含c字母开头的员工的id,工资
select id,last_name,salary
from s_emp
where last_name like '%c%';
查看员工名字长度不小于5,且第四个字母为n字母的员工id和工资
select last_name,salary
from s_emp
where last_name like '_ _ _ _ n _%';
查看员工名字中包换一个_的员工id和工资
select id,last_name
from s_emp
where last_name like '%\_%' escape '\';
代表\后面的字符要恢复原本的意思(恢复_的意思)
4.is null ,判断值为null的时候使用,null的值不能使用=
查看员工提成为空的名字和id
select id,last_name
from s_emp
where commission_pct is null;
查看员工提成—不为空的名字和id
select id,last_name
from s_emp
where commission_pct is not null;
and/or,当条件需要的时候多次使用
查看员工部门id为41且职位名称为Stock Clerk(存库管理员)的员工id和名字
select dept_id,title,last_name
from s_emp
where dept_id=41
and
title ='Stock Cleck';
查看员工部门为41 或者 44号部门,且工资大于1000的员工id和名字
select dept_id,salary,last_name
from s_emp
where (dept_id =41 or dept_id=44)
and
salary>1000;
以上就是单行函数用到的
2.聚合函数
多行函数,可以结合组函数,group ,分组函数。
查询id小于5的所有员工的平均工资
select avg(salary)
from s_emp
where id<5;
使用单行函数,将上面的结果中每一个last_name转换为大写
select id,upper(last_name),salary
from s_emp
where id<5;
查询每个部分的员工人数、以及该部门的平均工资,并且按照平均工资的降序排序
select dept_id,avg(salary) avs,count(*)
from s_emp
group by dept_id
order by avs desc;
1.哑表
Dual表主要用来选择系统变量或求一个表达式的值,因为要使用dual来构造完成的查询语法1.单行函数
也可以称为单值函数,每操作一行数据(某个字段值),都会返回一个结果。
1.字符函数:
ASCII(X) ,返回字符X的ASCII码
select ascii('a') from dual;//a的asc码
CONCAT(X,Y) ,连接字符串X和Y
select concat('hello','world')
from dual;
INSTR(X,STR[,START][,N) ,从X中查找str,可以指定从start开始,也可以指定从n开始
select instr('hello world','o',2)
//从前往后查找这个字符串中第二个位置开始
from dual;
select inste('hello world ','o',-1)
//从后往前面查找,从最后一个查找
查询id小于5的员工信息(id、last_name、salary)
select id ,last-name,salary
from s_emp
where id<5;
LENGTH(X) , 返回X的长度
select length('hello world')
from dual;
LOWER(X) ,X转换成小写
select lower('HELLO THE WORLD')
from dual;//hello the world
UPPER(X) ,X转换成大写
select upper('hello')
from dual;//HELLO
INITCAP(X) ,X首字母转换为大写,其他字母小写
select initcap('bbbbb ccccc')
from dual;//Bbbbb Ccccc
LTRIM(X[,TRIM_STR]) ,把X的左边截去trim_str字符串,缺省截去空格
select ltrim('==hello==','=') from dual;
//hello==
RTRIM(X[,TRIM_STR]) ,把X的右边截去trim_str字符串,缺省截去空格
select rtrim('==hello==','=') from dual;
//==hello
TRIM([TRIM_STR FROM]X) ,把X的两边截去trim_str字符串,缺省截去空格
select trim('=' FROM '==hello==')
from dual;//hello
REPLACE(X,old,new) ,在X中查找old,并替换成new
select replace('hello tt world','tt','theeee')
from dual;//hello theeee world
SUBSTR(X,start[,length]) ,返回X的字串,从start处开始,截取length个字符,缺省length,默认到结尾
select substr('abcdefg',2,4)
from dual;//bcde
2.数字函数
常用的数字函数:
ROUND(X[,Y]) ,X在第Y位四舍五入,Y代表要保留到哪一位
//保留到小数点后面俩位
select round(45.953,2)
from dual;//45.95
//保留到个位(小数点后面零位)
select round(45.923,0)
from dual;//46
//如果是保留到10位就是-1,百位就是-2,依次类推
TRUNC(X[,Y]) ,X在第Y位截断
//截取到小数点的后面俩位
select trunc(45.929,2)
from dual;
//45.92
MOD(X,Y) ,X除以Y的余数
select mod(10,3)
from dual;
//(10除以3取余)
3.日期函数
sysdate,表示的是当前的时间
sysdate 参与时间的加减操作的时候,单位是天
select sysdate from dual;//显示的是当前的时间
select sysdate+1 from dual;//显示的是明天的这个时候
常见的日期函数:
months_between:俩个日期之间相差几个月
例:
30天之后和现在相差多少个月
select months_between(sysdate+30,sysdate)
from dual;
add_months:现在的日期/指定的日期往后推2个月
select add_months(sysdate,2) from dual;
select add_months('01-11月-2020',2) from dual;
next_day:离当前时间最近的下一个星期5是哪一个天
select next_day(sysdate ,'星期五')
from dual;
last_day:当前日期所在月份的最后一天(月底)
select last_day(sysdate)
from dual;
round:
把当前日期四舍五入到月(如果日期超过16号,那么进一个月)
select round(sysdate,'month')
from dual;
把当前日期四舍五入到年
select round(sysdate,'year')
from dual;
trunc 对日期进行截取,和round类似,但是只舍弃不进位(不管当前日期到没到16号,都舍去当前月份)
select trunc (sysdate,'month')
from dual;
2.转换函数
1.to_char:把一个数字或者是日期转换成字符(varchar2)
例:
select to_char(salary,$999,999,00)
from s_emp;
------
$2,500.00
$1,450.00
日期转为字符的常用格式:
内容 | 意义 |
---|---|
rrrr | 四位数的年份 |
yyyy | 四位数的年份 |
yy | 俩位数的年份 |
rr | 俩位数的年份 |
mm | 两位数的月份(数字) |
D | 一周的星期几 |
DD | 一个月的第几天 |
DDD | 一年的第几天 |
year | 英文的月份 |
month | 英文全称的月份 |
mon | 英文简写的月份 |
ddsp | 英文的第几天(一个月的) |
ddspth | 英文序列数的第几天(一个月的) |
day | 全英文的星期 |
dy | 简写的英文的星期 |
hh | 小时 |
mi | 分钟 |
ss | 秒 |
例: |
select to_char(sysdate,'yyyy mm MONTH mon MON D DD DDD DAY DY')
from dual;
------结果-------
2020 11 11月 11月 11月 1 22 327 星期日 星期日
select to_char(sysdate,'yy/mm/dd')
from dual;
2.to_number:把varchar2类型转换成数字
select to_numbe('1100')
from s_emp;
3.to_date:把varchar2转换成日期
select to_date('10-12月-2020','dd/mm/yyyy')
from dual;
3.多表查询:
1.笛卡尔积
举例:s_emp表中25条数据,s_dept表中12条数据,查询俩张表,数据俩俩组合,会得到300条数据
2.连接查询:(为了避免笛卡尔积的产生)
1.等值查询:
例如:
查询员工的名字、部门编号、部门名字
select last_name,dept_id,s_dept.id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id;
2.不等值连接:在俩个表中拿数据类型相同的去比较
3.外连接(左外,右外,全连接)
1.左外连接:把左边的表当成基础表,左表在右表中查询的数据,不管有没有都要显示出来。
例:查询所有员工,以及对应的部门名字,没有部门名字的也要显示出来。
select id,last_name,dept_id
from s_emp left outer join s_dept
on s_emp.dept_id=s_dept.id;
简写:
select last_name,id,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_emp.id(+);
//意思就是想把左边的表多出来的数据也显示查询出来,那么就在右边加上一个加号。
2.右外连接:要把右边的表的数据都要查询出来
例:查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来
select last_name,dept_id,name
from s_emp right [outer] join s_dept
on s_emp.dept_id =s_dept.id;
简写:
select last_name,dept_id,name
from s_emp,s_dept
on s_emp.dept_id(+)=s_dept.id;
3.全连接
查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来,没有部门的员工也要显示出来
select dept_id,id,last_name,name
from s_emp full join s_dept
on s+emp.dept_id=s_dept.id;
// dept_id,id,last_name,name这四项内容只要有一项就都必须显示出来
4.自连接:自己和自己连接
查询每个员工的名字以及员工对应的管理者的名字
select s1.last_name,s2.last_name manger
from s_emp s1,s_emp s2
where s1.manager_id=s2.id;
4.操作结果集
1.union:取俩个结果集的并集
2.union all :;把俩个结果集合在一起显示(可重复)
3.minus:第一个结果去除第二个结果中和他相同的部分
4.intersect:求俩个结果集的交集
5.伪列:rownum
只要数据库中才会有rownum,就像表中的列一样,但是在表中真实的不存在
伪列在数据库中只能用来查询,并不能像真实的列一样随意操作(加减运算)
伪列可以根据查询结果的条数,自动生成,并且一定是从1开始连续不断的数字
伪列rownum的本质就是给查询的一行行结果标上行号
伪列只能等于1,如果等于其他值查不到任何结果;只能大于0,不能大于其他结果。否则查不到。还可以小于任何数。
例:
select last_name
from s_emp
where rownum<7;
在实际的使用中,Oracle数据库中伪列rownum最核心的作用就是:完成分页查询。