mysql-forth day

-- 自关联 自己关联自己 a inner join a


-- 通过 source 指令导入一个sql文件
-- 省级联动 url:http://demo.lanrenzhijia.com/2014/city0605/
-- 查询所有省份


-- 查询出广东省有哪些市
广东省 广州市
广东省 深圳市
...
select p.atitle,c.atitle from areas as p inner join areas as c on c.pid = p.aid where p.atitle = '广东省';
-- 需要有想象力, 将areas 想象成两张表 , 一张是省表, 一张是市表\

-- 查询出广州市有哪些区县
select p.atitle,s.atitle from areas as p inner join areas as s on s.pid = p.aid where p.atitle = '广州市';

-- 子查询
-- 查询班级最高身高的学生的名字
select name from students where height = 185;
select name from students where height = (select max(height) from students);


子查询语句按照查询的结果可以分为四种类型的子查询
-- 标量子查询: 子查询语句查询的结果是一行一列(就是一个最基本的结果)
select name from students where height = (select max(height) from students);

-- 列级子查询 子查询语句查询的结果是一列多行(就是一个最基本的结果)
select * from students where age in (18, 20, 30);
select * from students where age in (select age from students where age in (18, 20, 30))
select classes.name from classes where id in (select cls_id from students);
select classes.name from classes where id = (select cls_id from students); # 错误
select classes.name from classes where id = any(select cls_id from students); # 正确

-- 行级子查询
-- 实现行子子查询, 需要构建行元素
-- 查找班级年龄最大,身高最高的学生
select * from students where (age, height) = (select max(age), max(height) from students);

-- 表级子查询 查询的结果是多行多列, 充当的是数据源
select * from students;
select * from (select * from students) tmp;
select * from (select * from students) as tmp;
select tmp.* from (select students.* from students) as tmp;

# 终端备份
-- 需要退出mysql连接再执行mysqldump命令
mysqldump -uroot -p python_test_1 > python_res.sql

-- 恢复数据之前先创建数据表
mysql -uroot -p yyyy < python_res.sql

练习题:

1、查询类型cate_name为"超级本"的商品名称、价格

select name,price from goods where cate_name="超级本";

2、显示商品的种类

select distinct  cate_name from goods;

select cate_name from goods group by cate_name;

3、求所有电脑产品的平均价格并且保留两位小数

select round(avg(price),2) from goods as avg_price where name like "%电脑";

4、显示每种商品的平均价格

select  cate_name,round(avg(price),2)  from goods group by cate_name;

5、查询每种类型的商品中最贵、最便宜、平均价、数量

select cate_name,  max(price),min(price),round(avg(price),2),count(*) from goods group by cate_name;

6、查询所有价格大于平均价格的商品、并按照价格降序排序

select id,name,price from goods where price > (select avg(price) from goods) order by price desc;

7、查询每种类型中最贵的商品信息

select id,name,max(price) from goods group by cate_name;错误!!!

表级子查询:

select * from goods inner join (select cate_name,max(price) as price from goods group by cate_name) as tmp on goods.cate_name = tmp.cate_name and goods.price = tmp.price;

或:select * from goods
inner join
(
select
cate_name,
max(price) as max_price,
min(price) as min_price,
avg(price) as avg_price,
count(*) from goods group by cate_name
) as goods_new_info
on goods.cate_name=goods_new_info.cate_name and goods.price=goods_new_info.max_price;

将goods表中按brand_name分组,将分组的结果插入到goods_brands表中

create table goods_brands (
id int unsigned primary key auto_increment,
name varchar(40) not null) select brand_name as name from goods group by brand_name;

将goods表中brand_name的字段内容改为goods_brands表中相应内容的编号:

update goods inner join  goods_brands on goods.brand_name=goods_brands.name set goods.brand_name=goods_brands.id;

create table goods_cates (
id int unsigned primary key auto_increment,
name varchar(40) not null) select cate_name as name from goods group by cate_name;

update goods inner join  goods_cates on goods.cate_name=goods_cates.name set goods.cate_name=goods_cates.id;

修改表字段:

alter table goods change cate_name cate_id int unsigned not null;

查看表结构:desc goods;

查看商品的完整信息:(多表连接 )

select* from goods as go inner join goods_brands as gb on go.brand_id = gb.id inner join goods_cates as gc on go.cate_id =gc.id;

7.外键:设置cate_id字段引用goods_cates表中的id字段就可以添加外键约束,一旦添加外键约束,以后在goods表中添加数据,设置的cate_id 地段都会去goods_cates 表中检查对应的id在goods_cates表中是否存在,如果id存在,数据就可以输入,否则失败。 使用外键约束会极大降低表的更新效率--任何数据更新都要检查一下

alter table goods add forgien key (brand_id) references goods_brands (id);给goods表中brand_id列添加外键,外键引用的是goods_brands 表中的id字段

添加外键约束语句能够执行的前提是goods_brands已经建好,并且有id字段


查询所有商品的详细信息 (通过内连接)
select g.id,g.name,c.name,b.name,g.price from goods as g
inner join goods_cates as c on g.cate_id=c.id
inner join goods_brands as b on g.brand_id=b.id;

查询所有商品的详细信息 (通过左连接)
select g.id,g.name,c.name,b.name,g.price from goods as g
left join goods_cates as c on g.cate_id=c.id
left join goods_brands as b on g.brand_id=b.id;

注意: goods 中的 cate_id 的类型⼀定要和 goods_cates 表中的 id 类型⼀致
create table goods(
id int primary key auto_increment not null,
name varchar(40) default '',
price decimal(5,2),
cate_id int unsigned,
brand_id int unsigned,
is_show bit default 1,
is_saleoff bit default 0,
foreign key(cate_id) references goods_cates(id),
foreign key(brand_id) references goods_brands(id)
);

猜你喜欢

转载自www.cnblogs.com/zxw2016208120/p/11360984.html