2.1 SELECT练习 01

数据表图片示例:

这里测试以mysql为主 如有ORACLE示例会额外标记

EMP表
在这里插入图片描述
DEPT表
在这里插入图片描述
查询DEPT表中的所有信息

SELECT * FROM DEPT;

查询雇员表中所有员工的员工编号,员工姓名,上级编号

-- 要查询的数据: EMPNO,ENAME,MGR
-- 数据的来源:EMP
SELECT EMPNO,ENAME,MGR FROM EMP;

查询所有员工的部门标号

SELECT DEPTNO FROM DEPT;

去除EMP表重复员工

--完全相同的数据才能去重
SELECT DISTINCT EMPNO , ENAME FROM EMP;

简易计算器

SELECT DISTINCT 1+1 FROM DEPT;
SELECT EMPNO,ENAME,123*456 FROM EMP;

别名练习

-- 别名  字段 (as) 别名  表名 别名
SELECT EMPNO AS 员工编号,ENAME "员工 姓名",1+1 "getSum" FROM EMP e;
-- 原样输出 双引号(中文常用) " "  小写别名,中文中带有空格...非标准写法
-- ' '字符串

字符串拼接

--ORACLE字符串拼接   ||
SELECT 'SQL'||ENAME FROM EMP;
--mysql字符串拼接 CONCAT
SELECT CONCAT('MYSQL+',ENAME) FROM EMP;
-- 伪列:表中不存在的列  :字符串,表达式...
-- 虚表:没有任何数据  dual
SELECT DISTINCT 456*789,SYSDATE() FROM EMP;
SELECT SYSDATE() FROM DUAL;
-- MYSQL --- SYSDATE()
-- ORACLE --- SYSDATE

查询员工姓名,员工的薪资,员工的奖金

SELECT ENAME,SAL,COMM FROM EMP;

null 与 数字 求和

-- ORACLE
-- null和数字运算,结果还是null
-- null和字符串运算,结果是原串,null相当于空串
给公司的每个员工+100鼓励金
SELECT ENAME,SAL,COMM "原奖金",COMM||'100' "新奖金" FROM EMP;
--处理null值  nvl(参数1,参数2)  如果参数1为null,函数的返回值结果为参数如果参数1不为null,函数的返回值结果为参数1
SELECT ENAME,SAL,COMM "原奖金",NVL(COMM,0)+100 "新奖金" FROM EMP;

-- Mycle
-- 未整理

强化练习

查询所有员工的名字, 工种, 年薪(不带奖金)

SELECT ENAME "姓名",JOB "工作",12*SAL "年薪" FROM EMP;

查询所有员工的名字,工种,年薪(带12月奖金的)

SELECT ENAME "姓名",JOB "工作",IFNULL(12*SAL+12*COMM,12*SAL) "年薪+奖金" FROM EMP;
--这里使用了 IFNULL(参数,默认值) 函数 一旦参数为null则使用默认值

查询所有员工的名字, 工种, 年薪(带一次奖金的)

SELECT ENAME "姓名",JOB "工作",IFNULL(12*SAL+COMM,12*SAL) "年薪+奖金" FROM EMP;

查询30部门的员工

SELECT * FROM EMP WHERE DEPTNO=30;

查询员工名字为SMITH的员工信息

SELECT * FROM EMP WHERE ENAME='SMITH';

查询除了SMITH之外的所有员工的员工姓名和员工编号

--比较条件  = 、>、 <、 >=、 <=、 !=、 <>
SELECT ENAME,DEPTNO FROM EMP WHERE ENAME!='SMITH';
SELECT ENAME,DEPTNO FROM EMP WHERE ENAME<>'SMITH';
SELECT ENAME,DEPTNO FROM EMP WHERE NOT ENAME='SMITH';

查询月薪资大于800的员工信息

SELECT * FROM EMP WHERE SAL>800;

查询工种为CLERK的,并且是30部门的员工信息

--and且、 or或、 not非
SELECT * FROM EMP WHERE JOB='CLERK' AND DEPTNO=30;

查询工种为CLERK的,或者是30部门的员工信息

SELECT * FROM EMP WHERE JOB='CLERK' OR DEPTNO=30;

查询不是工种为CLERK的,也不是30部门的员工信息

SELECT * FROM EMP WHERE NOT JOB='CLERK' AND NOT DEPTNO=30;
SELECT * FROM EMP WHERE NOT (JOB!='CLERK' OR DEPTNO!=30);
SELECT * FROM EMP WHERE JOB!='CLERK' AND DEPTNO!=30;

查询没有奖金的人

SELECT * FROM EMP WHERE COMM IS NOT NULL;
SELECT * FROM EMP WHERE NOT COMM IS NULL;
--查询有奖金的人
SELECT * FROM EMP WHERE COMM IS NULL;

查询工资在1500~2500之间的姓名 员工工种和工资

--查询的内容:ename,sal,job
--来源:emp
--条件:sal>1500 and sal<2500
SELECT ENAME,JOB,SAL FROM EMP WHERE SAL>=1500 AND SAL<=2500;
SELECT ENAME,JOB,SAL FROM EMP WHERE SAL BETWEEN 1500 AND 2500;
 --范围区间 从小到大 (BETWEEN AND 闭区间)

查询销售部的部门编号
查询 销售部(SALES) 中 工资大于1500的员工信息

--子查询
SELECT DEPTNO FROM DEPT WHERE DNAME='SALES';
SELECT * FROM EMP WHERE SAL>1500 AND DEPTNO=30;
SELECT * FROM EMP WHERE SAL>1500 AND DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES');

查询工资比SMITH高的同一部门的员工信息

--SELECT SAL FROM EMP WHERE ENAME='SMITH'; --SMITH的薪资
--SELECT DEPTNO FROM EMP WHERE ENAME='SMITH'; --SMITH的部门编号
SELECT * FROM EMP WHERE 
SAL>(SELECT SAL FROM EMP WHERE ENAME='SMITH')
 AND DEPTNO=(SELECT DEPTNO FROM EMP WHERE ENAME='SMITH');   
--数据来源 也可以是一个结果集 ,可以是表.. 

查询工资大于1500 或 含有佣金的人员姓名

SELECT ENAME FROM EMP WHERE SAL>1500 OR COMM IS NOT NULL;
--对结果集求和|并集  相同的数据保留一个   Union
SELECT ENAME FROM EMP WHERE SAL>1500 
UNION 
SELECT ENAME FROM EMP WHERE COMM IS NOT NULL;
--Union All,全集(两表数据不去重)
SELECT ENAME FROM EMP WHERE SAL>1500 
UNION ALL
SELECT ENAME FROM EMP WHERE COMM IS NOT NULL;

查询显示不存在雇员的所有部门号

--查询所有部门编号
--select deptno from dept;
--查询有员工存在的部门编号
--select distinct deptno from emp;
--差集  Minus,差集(去重)
--ORACLE
SELECT DEPTNO FROM DEPT
MINUS
SELECT DISTINCT DEPTNO FROM EMP;
--MYSQL 
SELECT DEPTNO FROM DEPT
WHERE DEPTNO NOT IN
(SELECT DISTINCT DEPTNO FROM EMP);
--上述方式 对于大型数据查询时效率低下 不推荐

查询工资大于1500 且 含有奖金的人员姓名

SELECT ENAME FROM EMP WHERE SAL>1500 AND COMM IS NOT NULL;
--ORACLE --Intersect,交集(找出重复)
SELECT ENAME FROM EMP WHERE SAL>1500
INTERSECT
SELECT ENAME FROM EMP WHERE COMM IS NOT NULL;
--MYSQL
--写不出来(꒦_꒦) 

模糊匹配

--模糊查询|匹配 like %任意个任意字符  _一个任意字符
---查询姓名以'A'开头的员工信息
SELECT * FROM EMP WHERE ENAME LIKE 'A%';
--查询姓名里边有‘A’的员工信息
SELECT * FROM EMP WHERE ENAME LIKE '%A%';
--查询名称中第二个字母为‘A’的员工信息
SELECT * FROM EMP WHERE ENAME LIKE '_A%';
--查询名称以'H'结尾的员工信息
SELECT * FROM EMP WHERE ENAME LIKE '%H';

查询姓名中含有%的员工信息(转义字符+模糊匹配)

SELECT * FROM EMP WHERE ENAME LIKE  '%A%%' ESCAPE('A'); 
--A为转义字符,转义A后面的字符
--可以修改表中数据再进行测试

查询工资为 1500, 2000, 2500, 5000的员工的信息

SELECT * FROM EMP WHERE SAL=1500 OR SAL=2000 OR SAL=2500 OR SAL=5000;
--多个定值之间满足任意一个就可以   
SELECT * FROM EMP WHERE SAL IN(1500,2000,2500,5000);

部门名称为 SALES 或 ACCOUNTING 的雇员信息

--部门对应编号
--SELECT DEPTNO FROM DEPT WHERE DNAME IN('SALES','ACCOUNTING'); 
--查询编号对应部门的员工信息
SELECT * FROM EMP WHERE DEPTNO IN
(SELECT DEPTNO FROM DEPT WHERE DNAME IN('SALES','ACCOUNTING') );

如果DEPT表中存在工种为SALES 则查询所有员工信息

--EXISTS(类似boolean 只做是否执行sql的判定条件)
SELECT * FROM EMP WHERE EXISTS (SELECT DEPTNO FROM DEPT WHERE DNAME = 'SALES');

查询’SALES’, 'ACCOUNTING’部门的员工信息

SELECT * FROM EMP WHERE DEPTNO
IN(SELECT DEPTNO FROM DEPT WHERE DNAME IN('SALES','ACCOUNTING'));
--查询除了'SALES', 'ACCOUNTING'部门的员工信息
SELECT * FROM EMP WHERE DEPTNO
IN(SELECT DEPTNO FROM DEPT WHERE DNAME NOT IN('SALES','ACCOUNTING'));

所有有奖金的员工信息empno,ename,sal,comm

SELECT EMPNO,ENAME,SAL,COMM FROM EMP WHERE COMM IS NOT NULL;

有奖金的员工所在的部门中的所有员工的信息

SELECT * FROM EMP WHERE DEPTNO
IN(SELECT DEPTNO FROM EMP WHERE COMM IS NOT NULL);

按雇员表编号降序排列EMP表

--排序 order by 字段 desc(降序)|asc(升序),字段 排序方式  默认升序  nulls last(所有的null值在最后显示)|fist
SELECT * FROM EMP ORDER BY EMPNO DESC;

查询30部门的所有员工,根据薪资升序排序 (默认升序)

SELECT * FROM EMP WHERE DEPTNO=30 ORDER BY SAL ASC;
SELECT * FROM EMP WHERE DEPTNO=30 ORDER BY SAL; 

查询10,30部门的所有员工,根据薪资降序排序,如果薪资相同根据员工编号降序排序

SELECT * FROM EMP WHERE DEPTNO=10 OR DEPTNO=30 ORDER BY SAL DESC,EMPNO DESC;

--select *|字段1.. from 表|结果集 where 行记录条件 order by 排序字段 排序方式,...;
--执行顺序: from--where--select--order by
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值