Mysql 基础 高级查询

nation ----  province

info-----people

DROP TABLE IF EXISTS `province`;
CREATE TABLE `province` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`code` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `province` VALUES (NULL, '北京市', '1100');
INSERT INTO `province` VALUES (NULL, '上海', '1113');
INSERT INTO `province` VALUES (NULL, '安徽省 ', '1112');
INSERT INTO `province` VALUES (NULL, '福建省 ', '1111');
INSERT INTO `province` VALUES (NULL, '重庆市 ', '1110');
INSERT INTO `province` VALUES (NULL, '江西省 ', '1109');
INSERT INTO `province` VALUES (NULL, '河南省', '1108');
INSERT INTO `province` VALUES (NULL, '广东省', '1107');
INSERT INTO `province` VALUES (NULL, '海南省', '1106');
INSERT INTO `province` VALUES (NULL, '四川省', '1105');
INSERT INTO `province` VALUES (NULL, '贵州省', '1104');
INSERT INTO `province` VALUES (NULL, '辽宁省', '1103');

DROP TABLE IF EXISTS `people`;
CREATE TABLE `people` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`birthday` int(10) unsigned NOT NULL,
`code` int(10) unsigned NOT NULL,
`sex` tinyint(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of people
-- ----------------------------
INSERT INTO `people` VALUES (NULL, '小红', '976057200', '1100', '2');
INSERT INTO `people` VALUES (NULL, '小明', '1039129200', '1103', '1');
INSERT INTO `people` VALUES (NULL, '青丝茧', '660438000', '1104', '1');
INSERT INTO `people` VALUES (NULL, '明若轻兮', '723596400', '1105', '2');
INSERT INTO `people` VALUES (NULL, '稀梦', '818204400', '1111', '2');
INSERT INTO `people` VALUES (NULL, '夜琴灵', '881362800', '1109', '2');
INSERT INTO `people` VALUES (NULL, '梦太美', '628902000', '1106', '1');
INSERT INTO `people` VALUES (NULL, '相思雨', '944434800', '1106', '');
INSERT INTO `people` VALUES (NULL, '高轩', '660438000', '1108', '2');
INSERT INTO `people` VALUES (NULL, '高扬', '660438000', '1106', '1');

 

1.无论 高级查询还是简单查询   都用  select.. from..语句   from  后面 加表名  可以使一张表也可以是多张表   表和表之间用逗号隔开

2. 简单查询和高级查询 不是 独立的   高级查询里面 同样可以用到 简单查询  

3.简单查询与复杂查询的联系: 简单查询里面 后面的条件 未知时 需要用另一个 查询来代替  这样就变成了高级查询

4.链接查询  和  联合查询的区别:

   a. 链接查询 连接两张以上的表  输出时 显示在一张表里 ; 联合查询 以另一张表为条件  只输出 一张表的内容 

              联合查询时注意 相关查询  : 子查询 和父查询的关系     父查询的条件时子查询  子查询的条件同样引用子查询

            b.相同点 关联在一起时 表示必须建立外键关系;

 

一.链接查询

 

1.链接查询 对结果集列的扩展   

 

select*from  表名

 

查询多张表 查询结果 在一张表中显示

 

select * from info,nation  #形成笛卡尔积   缺点  查询速度慢(产生大量冗余数据)

 

select * from 表1名, 表1名where 表1名.列名=表2名.列名

 

select * from info,nation where info.code=nation.code

 

select info.code, info. namebirthday  from info,nation where info.code=nation.code

 

因为 birthday 在两张表里  没有重复  所以可以直接写  (比如简单查询里面)

 

select * from info join nation on info.nation=nation.code

 

二.联合查询   union   UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。 语法如下:

                  select 列名列名 from 表1名

                  union

                  select 列名列名 from 表2名

三.  子查询(查询效率高 重要)

父查询 : 外层查询  

子查询: 里层查询

子查询 查询出的结果作为父查询的条件

 

  1. 无关子查询  

子查询和父查询没有关系  子查询可以单独执行

父查询:select *from info where nation=()

子查询: select code from nation where name=’汉族’

select *from info where code=(select code from nation where name=’汉族’)

②.查询系列名为‘宝马5系’的所有汽车信息
select * from car where brand=(select brand_code from brand where brand_name='宝马5系')

 

  1. 相关子查询

子查询在执行的时候 和父查询有关系   子查询不能单独执行

1.查询汽车表中 油耗小于平均油耗的所有汽车信息

父查询: 汽车的信息: select * from car where oil<平均油耗

子查询: 平均油耗;  select avg(oil) from car where brand =该系列

 select * from car as a where oil<(select avg(oil) from car as b where b.brand=a.brand)

 

posted @ 2017-06-20 09:14  千牛一刀  阅读(99)  评论(0)    收藏  举报