mysql学习-select查询,子查询,联…


我已经把此篇博客重新编辑。修正了几处错误,并用Markdown重新改了格式。
传送门:(http://blog.youkuaiyun.com/alps1992/article/details/44180187)







先设定两个表格:
第一个表格user包含:user_id、username、age、sex
第二个表格toy包含:user_id、toyname

普通查询:
查询关键字:AS, SUM, DESC, GROUP BY, ORDER BY, AVG,MIN, MAX, COUNT, LIMIT;
select * from user as u order by age limit5; // as 用来做别名, order by用来排序(从小到大,从大到小是DESC), limit用来取结果的条数。
select sum(age) fromuser group by sex; // sum分别求出user中男性年龄的和,还有女性的年龄和,groupby分组。
avg是求平均, min是求最小值,max是最大值,和sum用法一样
selectcount(user_id) from user;//返回user_id个数,也就是表中人数。

查询所有人的信息,并按照年龄排序:
select * from user order by age;

查询名叫chen的信息:
select * from user where username='chen';

查询年龄为18的人的姓名,并让id从大到小排序
select username from user where age=18 order by user_idDESC;

子查询:
关键字:IN, NOT IN,EXISTS, NOT EXISTS。
查询所有拥有toyname为pig的人的姓名:
select username from user where user_id in (select user_idfrom toy where toyname='pig');

联接查询:
首先交叉连接:cross join
select u.username, t.toyname from user as u cross join toy ast;
交叉连接就是把所有第一个表和第二个表的值一一对应
例如:假如第一个表格有5个值,第二个表有4个值,这个结果就应该有20条记录。

内联接:inner join
相等连接:(equijoin)
select u.username, t.toyname from user as u inner join toy ast on(也可以用where) u.user_id = t.user_id;
这个的结果就是各自拥有的玩具了。

不等连接:(non-equijoin)
select u.username, t.toyname from user as u innerjoin toy as t on(也可以用where)  u.user_id<> t.user_id  orderby u.username;
这个的结果是各自没有的玩具

自然连接:(natural join)
这个是有在连接的两个表格中的列名称相等的时候才能用。
select u.username, t.toyname from user as u natural join toyas t;
和上面的相等连接的结果是一样的。

外连接:outer join
左外联接、右外联接比较相似:left outer join ; right outer join;
select u.usrename, t.toyname from user u inner join toy twhere u.user_id = t.user_id;
这个是查询用户姓名和他所拥有的玩具名字

select u.username, t.toyname from user u left outer join toy twhere u.user_id = t.user_id;
这个是以左表(user)为基准,来查询所有用户姓名和他所拥有的玩具名字。

select u.username, t.toyname from user u right outer join toyt where u.user_id = t.user_id;
这个是以右表(toy)为基准,来查询所有玩具的拥有者姓名,对于没有拥有者的为NULL

联合:UNION,INTERSECT, EXCEPT
联合查询就是合并几次的查询结果到一张表里
select user_id from user union select user_id from toy orderby user_id;
联合的两个查询语句的列必须相同, union可以连接多个, 假如排序在最后一条语句后面加orderby;(重复自动去除)

union all:
select user_id from userunion all select user_id from toy order by user_id;
和union的运作方式一样,就是unionall的结果里会返回所有值,而不是每个值的复制,包裹重复的也会列出来。

用union来创建表格:
create table m_union as select user_id from user union selectuser_id from toy;

INTERSECT,EXCEPT
INTERSECT是交集,EXCEPT是差集的意思
select user_id from user intersect select user_id fromtoy;
就是返回这两个select查询相同的部分.(这里就是有玩具的孩子的user_id)

select user_id from user except select user_id from toy;
就是返回第一个select 减去第二个select 结果的部分。(这里就是没有玩具的孩子的user_id)

大致先这么多,以后再说联接转换子查询

### MySQL 子查询的使用方法与示例 #### 一、子查询的基本定义 子查询是指在一个SQL语句中嵌套另一个查询语句的技术。它允许将一个查询的结果作为另一个查询的输入,从而实现更加灵活和复杂的查询需求[^3]。 #### 二、子查询的分类 根据功能和用途的不同,MySQL中的子查询主要分为以下几类: 1. **标量子查询** 标量子查询返回单个值,通常用于替换某个字段或表达式的值。例如,在WHERE子句中可以直接引用标量子查询的结果。 2. **多行子查询** 多行子查询返回多个值,通常配合IN、ANY、ALL等关键字一起使用。这类子查询适用于处理集合型的数据匹配问题[^4]。 3. **多列子查询** 当子查询返回两个或更多列时,则被称为多列子查询。此类查询主要用于涉及多字段比较的操作场景。 4. **相关子查询** 相关子查询的特点在于它的执行依赖于外部查询传递过来的具体记录信息。这意味着对于每一条外层查询的数据行,都需要重新运行一遍内层的相关子查询逻辑[^5]。 5. **非相关子查询** 非相关子查询独立完成自身的运算过程后再将其结果提供给上一层级调用者使用;也就是说在整个过程中仅需计算一次即可满足后续所有的参照请求。 #### 三、实际应用案例分析 ##### 示例一:查找工资高于平均薪资水平的所有员工姓名 ```sql SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 此段代码展示了如何利用标量形式的子查询来获取超过公司整体平均水平报酬额人员名单的情况[^1]。 ##### 示例二:找出部门编号为'01'且职位等级最高的雇员ID列表 ```sql SELECT emp_id FROM employee WHERE dept_no='01' AND job_level=(SELECT MAX(job_level) FROM employee WHERE dept_no='01'); ``` 这里运用到了单行比较操作符等于号以及最大函数MAX()共同构建而成的一个典型例子。 ##### 示例三:展示那些至少拥有一名下属经理级别的职员详情资料 ```sql SELECT * FROM staff s1 WHERE EXISTS ( SELECT 1 FROM staff s2 WHERE s2.manager_id=s1.staff_id ); ``` 上述片段体现了存在性检测EXISTS关键词搭配关性质询结构组合起来解决问题的方法论思路。 --- #### 四、性能考量因素 尽管子查询提供了极大的灵活性,但在某些情况下可能会带来性能瓶颈。因此,在设计查询方案时应充分考虑以下几个方面的影响: - 尽可能减少不必要的重复扫描动作; - 对频繁访问的关键路径索引加以优化设置; - 利用临时表或者视图预先存储中间状态降低实时负载压力等等措施均有助于提升最终效果表现[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值