SQL语句01

时间:2022-01-23 21:12:32

SQL(Structured Query Language):结构化查询语言

SQL分类:
    数据操纵语言DML(Data Manipulation Language)
        SELECT   INSERT   UPDATE    DELETE
    数据定义语言DDL(Data definition language)
        CREATE   ALTER   DROP   RENAME    TRUNCATE
    数据控制语言DCL (Data Control Language)
        GRANT   REVOKE

select关键字
--select[列1,列2,...列N]from 表
--oracle中,列名和表名默认不区分大小写,数据是区分大小写的
作用:检索“列”

注意:1.select后面的列可以起别名(查询的显示结果)
        1) 列名后面一个空格后添加别名(别名中不许有“空格”)
        例:select ename,sal*12 "年薪" from emp;
        2) 列名后面一个空格后使用双引号添加别名
        例:select ename,sal*12 "ysal" from emp;
        3) 列名后面一个空格后使用as关键字,在as后面添加别名
        例:select ename,sal*12 as "ysal" from emp;
    2.distinct用于对显示结果的去重
        1) distinct必须放在select后面
        2) 如果查询有多列,必须满足多列值都相同时,方可去重。
        --例子:查询公司有哪些职位
select job from emp;
select distinct job from emp;

--错误的SQL:select ename,distinct job from emp;
from关键字

作用:检索“表”

注意:检索的表后可以添加别名(别名不需要被双引号引起)
--给表取别名
select ename,sal,e.deptno from emp e,dept d;

where关键字

作用:过滤“行”记录(record)
--例:查询大于2000的员工信息
select * from emp where sal <= 5000;
用法:
    1.=,!=,<>,<,>,<=,>=,any,some,all
    例子:查询员工信息:条件:薪水大于1500,薪水还要大于2000
    select * from emp where sal != any(1000,1500,2000);
    some和any用法一样,all表示所有
    2. is null,is not null
    例子:
select * from emp where comm is not null;
select * from emp where comm is null;
    3.between x and y
    例子:查询员工薪水在2000-3000的员工信息
    select * from emp where sal between 2000 and 3000;
    4.and(都满足) 、 or(满足其一) 、 not
    例子:
select * from emp where sal >= 2000 and sal <=3000;
select * from emp where sal >= 1000 or sal >=2000;
    5.in(list),not in(list)
    例子:
    --查询职务为MANAGER和ANALYST的员工信息
select * from emp where job in('MANAGER','ANALYST');
--查询工资不为3000和5000的员工信息
select * from emp where sal not in(3000,5000);
    6.exists(子查询)、not exists(子查询)
    例子:
select * from emp where exists(select* from dept where deptno !=50);
select * from emp where not exists(select * from dept where deptno = 20);
    7.like模糊查询
        “%”:匹配零个或若干个字符
        “_”:匹配一个字符
        在模糊查询中,如果查询的数据中有“%”,“_”时,可以使用escape自定义转义字符
    例子:
--查询:员工姓名中含有"M"的员工信息
select * from emp where ename like '%A%';
--查询:员工姓名中第二个字母是"M"的员工信息
select * from emp where ename like '_M%';
--查询:员工姓名中第三个字母是"O"的员工信息
select * from emp where ename like '__O%';
--查询:员工姓名中倒数第二个字母为"E"的员工信息
select * from emp where ename like '%E_';
--查询:员工姓名中含有“%”的员工信息
insert into emp(empno,ename) values(9527,'huan%an');
select * from emp where ename like '%\%%' escape '\';

order by关键字

作用:用于对查询结果进行排序
select * from emp where deptno = 20 order by sal;
用法:
    1.利用asc 、desc对排序列进行升序或降序
    2.order by后可以添加多个列(逗号分隔),当一个列的值相同时,在按第二列进行排序,依次类推
    --1.如何决定升序还是降序?
select * from emp where deptno = 20 order by sal asc;--升序
select * from emp where deptno = 20 order by sal desc;--降序
--2.如果排序的列值相同时,如何处理?
select * from emp where deptno =  20 order by sal desc,ename asc;
--先按薪水降序,再按名字字典顺序升序排列

--计算字段 (列):不在于表中,通过+、-、*、/操作和列进行计算得到的列
--获取员工年薪
select (ename || '年薪为:' || sal * 12) info from emp;

--集合:每次查询结果可以看作一个集合
select * from emp where deptno = 20;
select * from emp where sal > 2000;
集合操作:
    1.union   并集
    例:
select * from emp where deptno = 20
union
select * from emp where sal > 2000;
    2.union all   全集
select * from emp where deptno = 20
union all
select * from emp where sal>2000
--union 和 union all 的区别在于:
union all 会重复显示两个集合相同的部分
    3.intersect   交集
select * from emp where deptno = 20
intersect
select * from emp where sal>2000;
    4.minus    差集
--返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。
--注意两条sql语句的顺序

注意:
    1.保证两个sql查询的列数是个数一致的
    2.保证两个sql查询的列的数据类型是一致的
    3.保证两个sql查询的列是相同的,否则查询的结果是无意义的

函数

单行函数:对单个数值进行操作,并返回一个值。
--dual是一个虚表,为了满足sql句式而设置这么一个表
要求:我讲完函数,你练习。
分类:
1.字符函数
    1)concat(a,b) 拼接a,b两个字符串数据
    例:select concat(concat(ename,'的职位是'),job) from emp;
    2)initcap(x) 将每个单词x首字母大写
    例:select initcap('reece zang')from dual;
    3)lower() / upper()  将字符串小写/将字符串大写
    例:
  select lower('REECE')from dual;
  select upper('reece') from dual;

4)length() 获取字符串的长度
    例:select ename,length(ename) from emp;

5)lpad(a,b,c) /rpad() 将a字符串左边填充至b长度,用c字符填充
    例:
  select lpad(ename,10) from emp;
  select rpad(ename,10,'*')from emp;

--注意:第二个参数要设定合理的值,否则会导致数据显示不完整
select lpad(ename,5) from emp;--只能显示从左数五个字符
 
    6)ltrim(a,b)  / rtrim()  去除a字符串左边的b字符,如果b不传参,默认去除空格
  例:
  select ltrim('a    abcd','a') from dual;
  select rtrim('   abcdef    aaaa','a f')from dual;

7)replace(a,b,c)   将a中的b字符串替换为c
    例:select replace('he love you','he','I')test from dual;

8)substr(a,b,c) 将a的字符串,从b位置开始截取,截c个长度
    例:select substr('123444567',3,4) from dual;

9)trim( a from b) 将b左右两边的a字符去除掉
    例:select trim('a'from'a  ba a') from dual;

2.数字函数
    abs() 求取绝对值
    例:    select abs(-5)from dual;

ceil() 向上取整
    例:select ceil(3.1) from dual;
 
    floor() 向下取整
    例:select floor(2.7)from dual;
 
    round() 四舍五入
    例:select round(4.6)from dual;

power(x,y)  x的y次幂
    例:select power(2,10)from dual;

3.日期函数
    sysdate 返回系统当前日期,注意没有括号
    select sysdate from dual;
 
    add_months(d1,d2) 在d1日期上,增加d2个月份
  select hiredate,add_months(hiredate,12) from emp;
  select add_months(sysdate,6)from dual;

months_between(d1,d2) 返回d1和d2之间的相隔月份
    如果d1>d2,则返回正数,如果d1<d2,则返回负数
    select months_between(sysdate,hiredate)from emp;
 
    last_day(d) 返回d日期所在月份最后一天的日期
    select hiredate,last_day(hiredate) from emp;

next_day(d,X) 返回下一个星期X的日期
    select sysdate,next_day(hiredate,'星期五')from emp;

4.转换函数
    to_char()  将数字、或日期转化为字符串
    select to_char(sal,'$9,999.00')from emp;

to_date()    将字符串转化为日期
select to_date('2019-04-16 23:16:16','yyyy-mm-dd hh24:mi:ss')from dual;

to_number()  将字符串转化为数字
    select to_number('876')from dual;

5.其他函数
    nvl(x,y) 如果x为null,则显示为y,x不为null,则返回x,x和y的类型保持一致
    select ename,nvl(comm,0)from emp;

sys_guid() 生成一个的32位随机字符串
    select sys_guid() from dual;

decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)  条件取值,类同java的switch
select ename,sal,decode(sal,800,'屌丝',2000,'白领',3000,'小资',5000,'高富帅','一般人')from emp;

case when then else end  条件取值,类同java的if-else if-else
    select ename,sal,case when sal<1000 then '屌丝'
                      when sal<2000 then '白领'
                      when sal<3000 then '小资'
                      when sal<4000 then '高富帅'
                        else '王宝强' end from emp;

【注意点】
1、以CASE开头,以END结尾
2、分支中WHEN 后跟条件,THEN为显示结果
3、ELSE 为除此之外的默认情况,类似于高级语言程序中switch case的default,可以不加
4、END 后跟别名
5、只返回第一个符合条件的值,剩下的when部分将会被自动忽略,得注意条件先后顺序

组函数
组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果

avg()求平均值,只能对数字类型进行处理,不处理空字段
例:--求20部门的平均薪水为多少?
select avg(sal) avgsal from emp where deptno = 20;

sum()求和,只能对数字类型进行处理
例:--求20部门的员工的总薪水
select sum(sal) sumsal from emp where deptno = 20;
 
count()计数,对任何类型生效,不处理空字段
例:--求20部门的员工有几个
select count(1) from emp where deptno = 20;

max() 求最大值,对任何类型生效
例:--求20部门员工工资最高的是多少
select max(sal) from emp where deptno = 20;
select max(hiredate) from emp;

min() 求最小值,对任何类型生效
例:--求20部门员工工资最低的是多少
select min(sal) from emp where deptno = 20;

group by关键字
作用:对查询结果进行分组处理
select deptno,job from emp group by deptno,job;
select deptno,avg(sal) from emp group by deptno
select deptno,count(1) from emp group by deptno;

用法:
    1.分组之后,不能将除分组字段之外的字段放在select后面
--select deptno from emp group by deptno;
--select deptno,count(1) from emp group by deptno;
    2.group by 后面可以跟多个字段,则这多个字段值都相同时,才分为一组
    --select deptno,job from emp group by deptno,job
            
    3.分组之后,可以使用组函数对每个组进行数据处理
--select deptno,avg(sal) from emp group by deptno
--select deptno,count(1) from emp group by deptno;
having 关键字
作用:用于对分组数据进行过滤
用法:
    类似于where的用法
--例:求平均薪水在2000以上的部门编号
select deptno from emp group by deptno having avg(sal)>2000;

--where 和 having关键字不冲突!
select avg(sal),deptno from emp where sal>1500
       group by deptno having avg(sal)>2500
       order by deptno desc;

-- select  from  where   group by  having  order by [asc/desc]
--where 后不能使用分组函数
--select e.deptno from emp e where avg(sal) > 1500 group by deptno;

sql顺序分为两类:

1.sql的书写顺序
select   from    where    group by   having   order by [asc/desc]

2.sql的执行顺序
from   where   group by   having    select   order by [asc/desc]