mysql 单表查询多表查询
1.数据库的核心就是关联,多表查询首先就是要抓住各个表之间的关联部分,两个表联系起来后,再写条件,写查询什么就很简单了
2.and 和 or 之间的关系要搞清楚。
3.基本表达式记住
- 一:单表查询
-- 1:查询单个表的所有数据,显示所有字段
-- select * from 表名;
-- select * from member; -- *代表所有字段
-- 2:查询单个表的所有数据库,显示部分字段
-- select <字段1,字段2,...> from < 表名 >;
-- 查询所有的会员信息,显示用户名,手机号,可用余额
-- select RegName,MobilePhone,LeaveAmount from member;
-- 3: 查询部分数据-- where 字句
-- select <字段1,字段2,...> from < 表名 > where 条件表达式1 and/or 条件表达式2...;
-- 条件表达式1:筛选条件
-- = > < >= <= != == :比较表达式
-- 查询id为3的会员信息
-- select * from member where id=3;
-- 查询id为3,用户名为大树的信息
-- and :并且,需要满足其中所有条件
-- select * from member where id=3 and RegName='大树';
-- or:或者,只要满足多个条件中一个条件即可
-- select * from member where id=3 or RegName='大树';
-- select * from member where id>10;
-- 不等于
-- select * from member where id<>10;
-- select * from member where id!=10;.
-- 二:多表查询
对于不同类型的信息放在一个表的缺点:
1.字段过多
2.难以维护
3.表数据庞大
4.数据冗余,重复数据多
既然不同类型的数据放在了不同的表,那原本有联系的数据怎么保持原来的联系呢
设计表的时候两个表之间维持一个关联即可
-- Oracle、MySQL、SQL Server...关系数据库:表与表存在关系、存在联系
-- 笛卡尔积、叉乘 --》结果集(虚表、缓存表)->存在无效数据的
-- select * from member,invest; -- 5964
-- select * from member; -- 42
-- select * from invest; -- 142
-- 幼儿园两个班,交朋友(条件握手)
-- A B
-- 10 20
-- -- 只有什么样的数据是有效的?? 通过关联条件:member.Id=invest.MemberID
-- select * from member,invest where member.Id=invest.MemberID;
-- 查询投资金额大于10000的信息,显示用户名、手机号、投资金额、投资时间 -- invest member
/*
select member.RegName,member.MobilePhone,invest.Amount,invest.CreateTime
from member,invest
where member.id = invest.MemberID -- 条件1:关联条件
and invest.Amount>10000;-- 条件2
*/
-- 别名
/*
select t1.RegName,t1.MobilePhone,t2.Amount,t2.CreateTime
from member as t1,invest as t2
where t1.id = t2.MemberID
and t2.Amount>10000;
*/
/*
select t1.RegName,t1.MobilePhone,t2.Amount,t2.CreateTime
from member t1,invest t2
where t1.id = t2.MemberID
and t2.Amount>10000;
*/
/*
select t1.RegName as 用户名,t1.MobilePhone as 手机号码,
t2.Amount as 投资金额 ,t2.CreateTime as 投资时间
from member as t1,invest as t2
where t1.id = t2.MemberID
and t2.Amount>10000;
*/
-- 四:排序
-- 查询投资金额大于10000的信息,显示用户名、手机号、投资金额、投资时间 ,按投资金额降序、升序排序
-- 降序:DESC、升序: ASC(默认为ASC)
select t1.Id as 用户id,t1.RegName as 用户名,t1.MobilePhone as 手机号码,
t2.Amount as 投资金额 ,t2.CreateTime as 投资时间
from member as t1,invest as t2
where t1.id = t2.MemberID
and t2.Amount>10000
order by 投资金额 DESC;
左连接右连接
、select * from girls t1 inner join boys t2 on t1.matchNum = t2.matchNum;
select * from girls t1 join boys t2 on t1.matchNum = t2.matchNum;
select - from girls cross join boys //笛卡儿积 叉乘
连接两个语句连接用union,且字段名要相同才可以显示 所以要取别名
select t1.id,t1.girjNum num from girls t1 left join boys t2 on t1.matchNum = t2.matchNum where t2.id is null
union
select t2.id,t2.boyNum num from girls t1 right join boys t2 on t1.matchNum = t2.matchNum where t1.id is null;
子查询
子查询概念:一个select语句嵌套在另一个select 语句中
子查询也可以称为内部查询,而包含子查询的语句又成为外部查询或主查询
子查询可分类:
非相关子查询 :独立于外部查询,子查询只执行一次,执行完将结果传递给外部查询,子查询可以单独运行
相关子查询:依赖于外部查询的数据,外部查询每执行一次,子查询就执行一次
子查询自身可以包含一个或多个子查询 一个查询语句中可以嵌套任意数量的子查询
比较大小
max是纵向比较,GREATEST是横向比较
Greatest(1,2,3)