Posts SQL练习——单表查询
Post
Cancel

SQL练习——单表查询

单表查询

列的选取-投影

1
select empno, ename, deptno from emp;

开发中一般不使用 *

数据库中:列名大小写不敏感,内容大小写敏感

列别名

  • 方法1:列名+” “+别名

  • 方法2:列名 as 别名

    1
    2
    
    select empno 员工编号, ename 员工姓名 from emp;
    select empno as 员工编号, ename as 员工姓名 from emp;
    

列的算数表达式(+,-,*,/)

1
2
-- 显示年收入
select empno, ename, sal*12 年收入 from emp;
  • 处理空值得函数 nvl() : null value

    nvl(para1, para2):

    ​ para1:可能为空的值

    ​ para2:当para1为空时,则该位置的值为para2

    ​ 且两个参数的 字段类型 必须相同

    1
    2
    
    select * from emp;
    select empno, ename, sal, comm, sal+nvl(comm,0) from emp;
    
  • 连接字符串 **   ** ,与 + 不同
    1
    
    select empno, ename, empno||ename from emp;
    
  • 技巧:

    1. 想在看到所有字段的情况下,添加一个查询字段,可以给表加一个别名
    1
    
    select e.*, empno||ename from emp e;
    
    1. 修改表中的数据(Oracle特有!!!)
    1
    2
    
    --1.for update
    select * from emp for update;
    
    1
    2
    
    --2.rowid
    select rowid, e.* from emp e;
    

    一般不用 * ,在开发时会将 * 改为需要的字段

对行选取

  • 1
    2
    
    -- 选取部门号为10的所有员工
    select * from emp wheree deptno=10
    
  • 1
    2
    
    -- 查询所有岗位是 MANAGER 的员工
    select * from emp where job='MANAGER';
    

在SQL中对于字符串的引用只能是单引号,且大小写敏感

distinct关键字

  • ​ 关键字用途:将不同的显示出,相同的过滤掉

    1
    2
    
    -- 查询所有员工的岗位名称列表
    select distinct job from emp; -- 查询出所有岗位种类
    
    1
    2
    
    -- 显示部门号与岗位的名称列表对应关系
    select distinct deptno, job from emp; -- 过滤掉重复的"行"
    

between,in,like,is NULL 关键字

  • **Betwwen **

    1
    2
    3
    4
    
    -- 查询所有薪水(sal)在[1600,3000]的人员信息
    select * from emp where sal between 1600 and 3000;
    select * from emp where sal >= 1600 and sal <= 3000; 
    -- 两个语句结果相同
    
    1
    2
    
    -- 查询部门号为10或20的员工
    select * from emp where deptno = 10 or deptno = 20
    
  • Like

    1
    2
    3
    4
    5
    
    -- "_" 表示任何字符
    -- "%" 表示任何多个字符
    -- eg.查找名字中带有A的员工
    select * from emp where ename like '_A%'; -- 不常用
    select * from emp where ename like '%A%'; -- 很重要
    
  • 逃逸字符 @

    Like 短语中特殊字符的处理:escape*

    1
    2
    3
    
    -- 笔试可能会出
    select ename from emp where ename like '%@%%' escape '@';
    select ename from emp where ename like '%/%%' escape '/';
    

escape后定义的那个字符才是转义字符

  • is NULL

    “很重要”

    1
    2
    
    -- 查询所有comm为null的员工
    select t.*, comm from emp t where comm is null;
    
    1
    2
    
    -- 查询公司谁是最大boss
    select * from emp where mgr id null;
    

逻辑运算:not,and,or,in

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 所在部门编号为10、20的员工
select empno, ename, sal, deptno from emp
	where deptno = 10 or deptno = 20;
select empno, ename, sal, deptno from emp
	where deptno in (10,20);

-- 不在10,20的员工
select empno, ename, sal, deptno from emp
	where not(deptno = 10 0or deptno = 20); -- not表示非
select empno, ename, sal, deptno from emp
	where deptno <> 10 and deptno <> 20; -- <> 表示不等于
select empno, ename, sal, deptno from emp
	where deptno not in (10,20);

排序 Order by

  • ASC 升序 acend

  • DESC 降序 descend

  • 如果同时执行了两个排序方式,先执行前者,再在前者的基础上执行后者

    1
    2
    3
    
    -- **将员工姓名升序排列,或降序排列**
    select ename, job from emp order by ename ASC;
    select ename, job from emp order by ename ASC, job DESC;
    

单行函数

  • 字符函数

    1
    2
    3
    
    select upper('sql course') from dual; -- dual 为虚表(Oracle特有)
    select lower(ename), t.* from emp t;
    ...
    
    1
    2
    
    -- 姓名中含有'a'的人员信息
    select * from emp where lower(ename) like '%a%'
    

    ps:开发中like后 ‘ ‘ 里所跟字符串的大小写由后端代码负责,而字段名所匹配的数据大小写由SQL负责

    1
    2
    
    -- 子串:SUBSTR('String', 1, 3) => str
    select substr('string', 1, 3) from dual; -- 截取字符串
    
  • 日期函数

    取系统时间:sysdate Oracle特有函数

    1
    
    select sysdate from dual;
    

    日期 +/- n = n 天之后/前

    1
    
    select sysdate-5 from dual; -- 系统时间五天之前
    

    to_char: 日期,格式话字符串,是转换函数,将日期转换为字符类型

    1
    2
    
    select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
    select to_char(sysdate, 'yyyy"年"mm"月"dd"日"') from dual;
    

    ps: to_char不要在字段上使用,否则可能会导致时间数据不准

  • 组函数(聚合函数)

    1
    2
    3
    
    -- 计算机员工分布在哪几个部门
    select distinct deptno from emp; -- 有人的部门由哪些
    select count(distinct deptno) from emp; -- 有几个部门有人
    

    Ps:

    • 组函数忽略空值 null

    • select 的列如果使用了聚合函数,则后面的其他列要么放在聚合函数中,要么放在 Group By 后面

  • Group By

    1
    2
    3
    4
    5
    6
    7
    8
    
    -- 按部门分组,计算每个部门的薪水总和
    select deptno, sum(sal) from emp group by deptno;
    -- 计算每个职位的平均薪水
    select job, avg(sal) from emp group by job;
    -- 计算每个部门每个职位的平均薪水
    select deptno, job, avg(sal) from emp 
    	group by deptno, job 
    	order by deptno; -- group by deptno, job 表示先按部门排,再按职位排
    
    • Having: 表示在Group By 分组之后进一步筛选

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      -- 平均薪水大于1500元的部门号
      select deptno, avg(sal) from emp
      	group by deptno
      	having avg(sal) > 1500;
      -- 部门工资总和大于7000元的部门号
      select deptno, sum(sal) from emp
      	group by deptno
      	having avg(sal) > 7000;
      -- 按本公司岗位平均薪水大于1500元的岗位信息
      select job, avg(sal) from emp 
      	group by job
      	having avg(asl) > 1500;
      

      结论:只要是对group by的结果进行筛选,则必用having

This post is licensed under CC BY 4.0 by the author.

github-webhook与企业WeChat-webhook中间件开发(一)webhook

SQL练习——多表查询

Comments powered by Disqus.