查询函数的相关使用

本文详细介绍了SQL在emp表和salary表上的基本操作,包括日期比较、LIKE模糊查询、排序(升序和降序)、分页查询、多表查询、自连接、子查询(单行和多行)、ALL和ANY的区别以及笛卡尔集的概念。
摘要由CSDN通过智能技术生成

注:emp表和salary表源码在文末 

查询增强联系

下列内容对emp,salary表进行操作

日期可以进行比较

查找在1992.1.1以后入职的员工

select * from emp
	where hiredate > '1992-01-01'

LIKE模糊查询

%:表示0到多个字符,_:表示单个任意字符

显示以S开头的的员工的信息

SELECT * FROM emp WHERE enmae LIKE 'S%'

查询第三个字符为O的员工的信息

SELECT * FROM emp WHERE ename LIKE'__O%'

查询没有上级的员工的信息(mgr为NULL)

SELECT * FROM emp WHERE mgr IS NULL

注:

判断字段值是否为NULL用IS NULL 或 IS NOT NULL

查询表的结构(DESC)

DESC emp

请将员工记录以deptno,sal进行升序,降序排列

SELECT * FROM emp 
	ORDER BY deptno ASC,sal DESC

分页查询

语法

SELECT ... limit start,rows

表示从start+1行开始取,取出rows行,start从0开始计算【类似于Java数组的下标】

实例:

将empno升序取出,每页显示3条记录

-- 第一页
SELECT * FROM emp
	ORDER BY empno
	LIMIT 0,3
-- 第二页
SELECT * FROM emp
	ORDER BY empno
	LIMIT 3,3
-- 第三页
SELECT * FROM emp
	ORDER BY empno
	LIMIT 6,3

注:

其实本质上就是一个公式:

SELECT ... limit (每页显示的记录数)*(第几页-1),每页显示记录数

多表查询

实例:

查询各个员工的姓名/薪水/部门

分析:

姓名/薪水 enmp表

部门 dept表

在默认情况下,当查询两个表时,规则

1. 从第一张表中,取出一行和第二张的每一行进行组合,返回结果[含有两张表的所有列]

2. 一共返回的记录数 第一张表的行数*第二张表的行数

这样多表查询默认处理返回的结果称为笛卡尔集

注:

多表查询的条件不能少于表的个数-1,否则会出现笛卡尔集

实操如下:

SELECT ename,sal,dname FROM emp,dept WHERE emp.deptno = dept.deptno

自连接

如图所示可知在emp表中,emp表所显示的信息不仅仅是员工而且还有员工的上司(mgr) ,若想在同一个表中显示职员名(ename)及其上司(mgr)就需要用到别名,实操如下

SELECT worker.ename AS '职员名' , boss.ename AS '上级名'
	FROM emp worker ,emp boss
	WHERE worker.mgr = boss.empno

 

子查询

介绍

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

- 单行子查询

单行子查询是指只返回一行数据的子查询语句

- 多行子查询语句

多行子查询语句指3返回多行的子查询 使用关键字in

实例:

单行子查询

查询跟SMITH在同一个部门的员工

SELECT * FROM emp
	WHERE deptno = (
	SELECT deptno
	FROM emp
	WHERE ename = 'SMITH')

多行子查询(返回多行结果 使用 in)

查询和部门10的工作相同的雇员的名字/岗位/工资/部门号/但是不含部门自己的雇员

SELECT ename,job,sal,deptno 
	FROM emp
	WHERE job IN (
		SELECT DISTINCT job
		FROM emp
		WHERE deptno = 10) AND deptno != 10

子查询临时表

实例:

查询每个部门的最高薪资的员工的姓名和工作

-- 临时表:查找每个部门的最高薪资
SELECT MAX(sal),deptno FROM emp GROUP BY deptno
SELECT emp.deptno,ename,job,sal 
	FROM (SELECT MAX(sal) AS msal,deptno FROM emp GROUP BY deptno)temp,emp
	WHERE emp.deptno = temp.deptno AND emp.sal = temp.msal

ALL和ANY

 实例:

查询出工资比部门30的所有员工的工资高的员工的姓名/工资/部门

SELECT ename,sal,deptno
	FROM emp
	WHERE sal>ALL(
		SELECT sal
			FROM emp
			WHERE deptno = 30)

相同代码:

SELECT ename,sal,deptno
	FROM emp
	WHERE sal>(SELECT MAX(sal)
			FROM emp
			WHERE deptno = 30)

查询比30号部门其中一个员工工资高的员工姓名/工资/部门

SELECT ename,sal,deptno
	FROM emp
	WHERE sal>ALL(
		SELECT sal
			FROM emp
			WHERE deptno = 30)

相同代码:

SELECT ename,sal,deptno
	FROM emp
	WHERE sal>(SELECT MIN(sal)
			FROM emp
			WHERE deptno = 30)

多列子查询

介绍

查询返回多个列数据的子查询语句

实例:

查询与ALLEN在相同部门并且有相同工作的员工的记录,但不含ALLEN

分析1:查询ALLEN的工作和部门

select deptno,job
	from emp
	where ename = 'ALLEN'

分析二:查询与ALLEN在相同部门并且有相同工作的员工,但不含ALLEN

SELECT * FROM emp 
	WHERE (deptno,job) = (
		SELECT deptno,job
		FROM emp
		WHERE ename = 'ALLEN') AND ename !='ALLEN'

emp表

CREATE TABLE emp(
    empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
    ename VARCHAR(20) NOT NULL DEFAULT '',
    job VARCHAR(9) NOT NULL DEFAULT '',
    mgr MEDIUMINT UNSIGNED,
    hiredate DATE NOT NULL,
    sal DECIMAL(7,2),
    comm DECIMAL(7,2),
    deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0
);
INSERT INTO emp VALUES
(7369,'SMITH','CLERK',7902,'1990-12-17',800.00,NULL,20),
(7400,'ALLEN','SALESMAN',7698,'1991-2-20',1600,300.00,30),
(7521,'WARD','SALESMAN',7698,'1991-2-22',1250.00,500.00,30),
(7566,'JONES','MANAGER',7839,'1991-4-2',2975.00,NULL,20),
(7654,'MARTIN','SALESMAN',7698,'1991-9-28',1250.00,1400.00,30),
(7698,'BLAKE','MANAGER',7839,'1991-5-1',2850.00,NULL,30),
(7782,'CLARK','MANAGER',7839,'1991-6-9',2450.00,NULL,10),
(7788,'SCOTT','ANALYST',7566,'1997-4-19',3000.00,NULL,30),
(7839,'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10),
(7844,'TURNER','SALESMAN',7698,'1991-12-3',1500.00,NULL,30),
(7900,'JAMES','CLERK',7698,'1991-12-3',950.00,NULL,20),
(7902,'FORD','ANALYST',7566,'1991-12-3',3000.00,NULL,20),
(7934,'MILLER','CLERK',7782,'1992-1-23',1300.00,NULL,10);

salgrade表

CREATE TABLE salgrade(
	grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,-- 工资级别
	losal DECIMAL(17,2) NOT NULL,-- 该级别最低工资
	hisal DECIMAL(17,2) NOT NULL -- 该级别最高工资
);
INSERT INTO salgrade VALUES(1,700,1200),
			(2,1201,1400),
			(3,1401,2000),
			(4,2001,3000),
			(5,3001,9999);
SELECT * FROM salgrade;

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值