sql inner join 连接查询


--求姓名长度至少是三个汉字(使用字符串函数)
--且倒数第二个汉字必须是“吉”的员工姓名所销售的商品名称;
use test000
go
select Employees.ENAME,GOODS.GNAME from Employees,SELL,GOODS where Employees.ENO = SELL.ENO 
and GOODS.GNO=SELL.GNO and len(Employees.ENAME)>=3  and substring(Employees.ENAME,len(Employees.ENAME)-1,1)='吉';
go
--查询不姓“陈”的员工销售的商品信息以及销售员工的姓名、销售数量和销售日期,按商品零售价排降序;
select Employees.ENAME,GOODS.GNO,GOODS.GNAME,SELL.SSUM,SELL.STIME from GOODS,Employees,SELL
where Employees.ENO = SELL.ENO and GOODS.GNO=SELL.GNO and Employees.EADDRESS not like '陈%';
go
--查询与冯晓丹同一部门的员工信息;
select * from Employees where Edept in 
(
	select Edept from Employees where ENAME = '冯晓丹' group by Edept
)

go
--求年龄大于’ 冯晓丹’ 的所有员工的姓名、部门和年龄;
select ENAME,Edept,EAGE from Employees where EAGE > 
(
	select EAGE from Employees where ENAME = '冯晓丹'
) 


go
--查询销总共售出20件商品以上的员工的姓名;
select DISTINCT Employees.ENAME from Employees,SELL where Employees.ENO = SELL.ENO and SELL.SSUM>20 
select Employees.ENAME,SUM(SELL.SSUM) as '销总共售出' from Employees
inner join SELL on SELL.ENO = Employees.ENO
group by SELL.ENO,Employees.ENAME 

go
--查询所有商品及其销售情况(也显示没有销售记录的商品信息);
Select GOODS.GNO,GOODS.GNAME,SUM(SELL.SSUM) as '销售总数' from Goods 
Left Join SELL on Goods.GNO = SELL.GNO  group by Goods.GNO,GOODS.GNAME
go
--在第6个查询的基础上实现:查询没有销售过的商品;
select GNO,GOODS.GNAME from GOODS where GOODS.GNO not in( select GNO from SELL);
go
--查询1301号员工所售商品是由谁来进货的,输出姓名和部门名;
select Employees.ENAME,Employees.Edept from Employees
inner join Purchase on Purchase.Eno = Employees.ENO
inner join SELL on SELL.GNO=Purchase.Gno
where SELL.ENO = '1301' group by Employees.ENAME,Employees.Edept


go
--查询销售了“笔记本电脑”的员工姓名;
select DISTINCT Employees.ENAME from Employees 
inner join SELL on SELL.ENO = Employees.ENO
inner join GOODS on GOODS.GNO = SELL.GNO
where GOODS.GNAME = '笔记本电脑'


go
--查询赵飞燕所进货物的总金额,按进货价计算
select Purchase.Gno,Purchase.Pnum*GOODS.GINPRICE from Purchase 
inner join GOODS on Purchase.Gno=GOODS.GNO 
inner join Employees on Employees.ENO = Purchase.Eno where Employees.ENAME = '赵飞燕'
go
--查询冯晓丹当年当月的销售总金额,按零售价*数量计算,getdate()函数取当前时间
select Employees.ENAME,SUM(GOODS.GOUTPRICE * SELL.SSUM) as '销售总金额' from Employees 
inner join SELL on Employees.ENO=SELL.ENO inner join GOODS on GOODS.GNO=SELL.GNO 
where Employees.ENAME = '冯晓丹' and YEAR(SELL.STIME)=YEAR(GETDATE()) and MONTH(SELL.STIME)=MONTH(GETDATE())
group by Employees.ENAME

### 隐式连接INNER JOIN 的区别 #### 定义与语法结构 隐式连接(Implicit Join),也称为旧风格的连接,在 `FROM` 子句中通过多个表名并列来指定参与查询的数据源,并利用 `WHERE` 条件表达式定义这些表之间的关系。这种方式源自早期版本的标准 SQL 语句。 ```sql SELECT * FROM employees, departments WHERE employees.department_id = departments.department_id; ``` INNER JOIN 是显式的 ANSI 标准语法的一部分,用于指明两个或更多个表之间基于某些条件进行匹配的方式。这种形式更加直观易读,推荐现代开发人员采用此方法编写 SQL 查询。 ```sql SELECT * FROM employees INNER JOIN departments ON employees.department_id = departments.department_id; ``` #### 性能差异 对于大多数数据库管理系统而言,优化器能够识别这两种写法并将它们转换成相同的执行计划[^1]。然而,由于 INNER JOIN 明确表达了意图,因此更有利于代码维护者理解逻辑以及后续可能涉及的性能调优工作。 #### 可读性和可维护性 使用 INNER JOIN 能够使 SQL 更加清晰地展示各个表间的关系,特别是当涉及到多张表联合操作时尤为明显。而隐式连接容易造成复杂的 WHERE 子句难以阅读和调试的情况发生。 #### 支持的功能特性 值得注意的是,只有 INNER JOIN 和其他类型的显示连接才允许使用额外功能选项,比如 LEFT/RIGHT OUTER JOIN 或 FULL OUTER JOIN 等高级用法[^3]。相比之下,隐式连接仅限于实现简单的笛卡尔积加上过滤条件的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值