学习笔记 | 生活平淡又惊奇

SQL操作

2022.07.20

注意事项

SQL语言对字段的大小写敏感
在SQL限定查询中where子句的运行顺序优先于select子句,where子句先确定行,然后select子句再确定列

运行顺序:

  1. 确定数据源:from
  2. 筛选数据行:where
  3. 选出所需要的数据列:select [distinct]
  4. 数据排序:order by ASC/DESC

SQL操作

  • 当前可登录用户名及密码
    用户名:SCOTT;密码:TIGER
    用户名:sys/as sysdba;密码:change_on_install
  • 查看所有用户列表
SQL> select username from dba_users;

image-1658281474045

  • 显示当前登录的用户
SQL> show user;

image-1658281885083

  • 返回一个用户所有的数据表
SQL> select * from tab;

image-1658282397927

  • 查看数据表的结构
SQL> DESC dept;
SQL> DESC 表名;

image-1658282501510

  • 查看数据表内容
SQL> select * from dept;

image-1658282648901

  • 别名显示设置
SQL> select empno,ename,sal*12 income from emp;  

image-1658283822008

SQL> select empno 员工编号,ename 姓名,sal*12 年薪 from emp;

image-1658285409289

  • 实现格式化输出
SQL> select '编号:' || empno || '  姓名:' ||  ename from emp;

image-1658287019118

  • 删除重复项
SQL> select distinct job from emp;

image-1658287141764

  • 关系运算符
    常用的关系运算符包括>,=,<,>=,<=,!=(<>)
SQL>  select * from emp where sal<1200;

image-1658294397196

  • 逻辑运算
    连接主要使用AND、OR完成
SQL> select * from emp where job!='CLERK' and sal<3000;
SQL> select * from emp where job!='CLERK' and job!='SALESMAN';
SQL> select * from emp where job='CLERK' OR sal<1200;
SQL> select * from emp where not sal>2000;
  • 范围运算:between…and
SQL> select * from emp where sal between 1500 and 3000;
SQL> select * from emp where sal>=1500 and sal<=3000;
  • 空判断
SQL> select * from emp where comm is not null;
  • IN操作符,根据一个指定的范围进行数据查询
SQL> select * from emp where empno=7369 or empno=7566 or empno=7788;
SQL> select * from emp where empno in (7369,7566,7788);
SQL> select * from emp where empno not in (7369,7566,7788);

image-1658295140596
❗观察IN和NOT IN中出现null的情况
image-1658295585705

  • 模糊查询
    LIKE可以实现数据的模糊查询操作,如果想要使用LIKE则必须使用如下的两个匹配符号
    “-”匹配任意的一位符号
    “%”匹配任意的符号(包含匹配0位、1位、多位)
姓名中以字母A开头:
SQL> select * from emp where ename like 'A%';
姓名中第二个字母是A:
SQL> select * from emp where ename like '_A%'
姓名中任意位置上存在字母A:
SQL> select * from emp where ename like '%A%';
  • 查询排序
    ASC表示升序,DESC表示降序
SQL> select * from emp order by sal DESC;
SQL> select * from emp order by hiredate ASC;
混合排序操作:
SQL> select * from emp order by sal DESC,hiredate ASC;
oeder by可以使用别名:
SQL> select empno 编号,job 工作,sal*12 年薪 from emp where job='CLERK' order by 年薪 DESC;

image-1658300310560

复杂范例

  • 找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料
SQL> select * from emp where (deptno=10 and job='MANAGER') or (deptno=20 and job='CLERK') ;

image-1658300931230

  • 找出部门10中所有经理和部门20中所有办事员,和既不是经理又不是办事员但其薪资大于或等于2000的所有员工的详细资料
    (使用IN在写法上会简洁一点)
SQL> select * from emp where (deptno=10 and job='MANAGER') or (deptno=20 and job='CLERK') or (job!='MANAGER' and job!='CLERK' and sal>=2000);

image-1658302366122

SQL> select * from emp where (deptno=10 and job='MANAGER') or (deptno=20 and job='CLERK') or (job not in('MANAGER','CLERK') and sal>=2000);

image-1658302425435

  • 找出收取佣金的员工的职位
SQL> select distinct job from emp where comm is not null;

image-1658302616060

  • 找出不收取佣金或收取佣金低于100的员工职位
SQL> select distinct job from emp where (comm is null) or (comm<100);

image-1658302723805

  • 显示姓名字母中不带有R的员工的姓名
SQL> select ename 姓名 from emp where ename not like '%R%'; 

image-1658302909922

  • 显示姓名字段的任何位置包含“A”的所有员工的名字,显示的结果按照基本工资由高到低排序,如果基本工资相同,则按照雇佣年限由早到晚排序,如果雇佣日期相同,则按职位排序
SQL> select ename 姓名, sal 基本工资 from emp where ename like '%A%' order by sal DESC,hiredate ASC,job 
ASC;

image-1658303435507