数据库学习(十)— 查询演练
查詢演練的數(shù)據(jù)表以及相應(yīng)數(shù)據(jù)創(chuàng)建?
drop table if exists goods; create table goods (id int unsigned primary key auto_increment,name varchar(150),cate varchar(40),brand_name varchar(40) ,price decimal(10,3) default 0, is_show bit default 1,is_saleoff bit default 0 );insert into goods values(0,'r510vc 15.6英寸筆記本','筆記本','華碩','3399', default, default); insert into goods values(0, 'y400n 14.0英寸筆記本電腦','筆記本', '聯(lián)想', '4999', default, default); insert into goods values(0, 'g150th 15.6英寸游戲本', '游戲本', '雷神', '8499', default, default); insert into goods values(0, 'x55occ 15.6英寸筆記本', '筆記本', '華碩', '2799', default, default); insert into goods values(0, '×240超級(jí)本', '超級(jí)本', '聯(lián)想', '4999', default, default); insert into goods values(0, 'u330p 13.3J寸超級(jí)本', '超級(jí)本', '聯(lián)想', '4299', default, default); insert into goods values(0, 'swp13226scb 觸控超極本', '超級(jí)本',"索尼", "7999" ,default,default); insert into goods values(0, 'ipad mini 7.9英寸平板電腦', '平板電腦', '蘋果', '1998', default, default); insert into goods values(0, 'ipad air 9.7英寸平板電腦', '平板電腦', '蘋果', '3388', default, default); insert into goods values(0, 'ipad mini 配備 retina 顯示器', '平板電腦', '蘋果', '2788', default, default);insert into goods values(0, 'ideacentre c340 20英寸一體電腦', '臺(tái)式機(jī)', '聯(lián)想', '3499', default, default);insert into goods values(0, 'vostro 3860-r1286臺(tái)式電腦', '臺(tái)式機(jī)', '戴爾', '2899', default ,default); insert into goods values(0, 'imac meo86ch/a 21.5英寸一體電腦', '臺(tái)式機(jī)','蘋果','9188',default ,default);insert into goods values(0, 'at7-74141p 臺(tái)式電腦 linux ', '臺(tái)式機(jī)', '宏基', '3699', default, default); insert into goods values(0, 'z220sff f4f86pa工作站', '服務(wù)器/工作站','惠普', '4288', default, default); insert into goods values(0, 'poweredge ii服務(wù)器', '服務(wù)器/工作站', '威爾', '5388', default, default); insert into goods values(0, 'mac pro專業(yè)級(jí)臺(tái)式電腦', '服務(wù)器/工作站','蘋果', '28888' ,default, default); insert into goods values(0, 'hmz-t3w頭戴顯示設(shè)備', '筆記本配件', '索尼', '6999', default,default); insert into goods values(0, '高務(wù)雙肩背包', '筆記本配件', '索尼', '99', default,default); insert into goods values(0, 'x3250m4機(jī)架式服務(wù)器', '服務(wù)器/工作站', ' ibm', '6888', default,default); insert into goods values(0, 'hz-t3w頭戴顯示設(shè)備', '筆記本配件', '索尼', '6999', default , default); insert into goods values(0, '高務(wù)雙肩背包', '筆記本配忤', '索尼', '99', default, default);1.1 查詢演練
?🧐例1: 求所有電腦產(chǎn)品的平均價(jià)格,并保留2位小數(shù)
select round(avg(price), 2) from goods?🧐例2: 查詢所有價(jià)格大于平均價(jià)格的商品,并且按價(jià)格降序排序
select * from goods where price > (select avg(price) from goods) order by price desc??🧐例3: 查詢類型為超級(jí)本的商品價(jià)格
select price from goods where cate = '超級(jí)本'?🧐例4: 查詢價(jià)格大于或等于’超級(jí)本‘的商品價(jià)格,并且按價(jià)格降序排序
select * from goods where price >=any(select price from goods where cate = '超級(jí)本' ) order by price desc?
💦知識(shí)點(diǎn):
子查詢返回的結(jié)果
- 只有一個(gè)值: 用比較符號(hào)
- 返回多值:用in, some,any?
1.2? 數(shù)據(jù)分表——更新商品表
💦知識(shí)點(diǎn):
????????我們創(chuàng)建的數(shù)據(jù)表等數(shù)據(jù)庫(kù)數(shù)據(jù)都被放在電腦硬盤中:
?????????若表中寫一堆重復(fù)數(shù)據(jù),也會(huì)存在硬盤中,就會(huì)造成空間的浪費(fèi),及造成數(shù)據(jù)冗余(數(shù)據(jù)重復(fù))。如圖:
????????數(shù)據(jù)冗余:易造成空間浪費(fèi),若該字段的某個(gè)字符更新,對(duì)其重復(fù)數(shù)據(jù)修改耗時(shí)。不利于管理
????????對(duì)于冗余的數(shù)據(jù):不會(huì)與常規(guī)數(shù)據(jù)寫一起,而是單獨(dú)列表,以后修改重復(fù)字段的內(nèi)容,只對(duì)單獨(dú)表進(jìn)行修改,不會(huì)造成原表的大幅度修正。如圖:
創(chuàng)建表并且插入語(yǔ)句
㈠、創(chuàng)建類型表并將數(shù)據(jù)插入語(yǔ)句。(方法一)
①、創(chuàng)建類型表?
-- 創(chuàng)建類型表 -- create table goods_cate( -- cate_id int unsigned primary key auto_increment, -- cate_name varchar(10) -- )②、去重
-- 去重,查詢goods表中的所有焦慮,并且按’類別‘分組 -- select distinct cate from goods select cate from goods group by cate?
?③、將分組結(jié)果,插入到數(shù)據(jù)表
-- 插入數(shù)據(jù),將分組結(jié)果寫入到goods_cate數(shù)據(jù)表 insert into goods_cate(cate_name) select cate from goods group by cate㈡、 創(chuàng)建品牌表(用另外一種方法,方法二)
????????創(chuàng)建品牌表的同時(shí)插入數(shù)據(jù),根據(jù)相同名稱插入字段,若字段名稱不同不能直接插入到表中。
????????通過create ——slect 來創(chuàng)建數(shù)據(jù)表并且同時(shí)寫入記錄,一步到位
?
💦知識(shí)點(diǎn):
????????創(chuàng)建表若創(chuàng)建只2個(gè)字段,若在創(chuàng)建表語(yǔ)句的尾部添加select,select意思是把查詢出來的數(shù)據(jù)插入到表中:插入時(shí)就會(huì)根據(jù)select查詢返回的列名,到表中找對(duì)應(yīng)的字段看能不能找到相同的字段,若無法找到新建一列,若找到相同字段則直接插入到原先創(chuàng)建的。
? ? ? ? 此處:
????????????????查詢時(shí)返回的字段名稱必須與創(chuàng)建表中的字段一樣,跟誰(shuí)一樣查詢的數(shù)據(jù)就插入到那個(gè)字段中
?㈢、方法三:快速備份表
①、若對(duì)品牌表進(jìn)行備份,快速備份一張表
-- 若對(duì)品牌表進(jìn)行備份,快速備份一張表 create table brand_bak select * from goods_brands②、 第二步:
商品表還是記錄著還是名稱還沒有變化,接著更改商品表,將冗余字段的數(shù)據(jù)變成編號(hào)
-- 通過goods_cate數(shù)據(jù)表來更新商品表 通過連接查詢,把類型所對(duì)應(yīng)的編號(hào)查出來,只需要把select * from改為update select * from goods inner join goods_cate on goods.cate = goods_cate.cate_nameupdate goods inner join goods_cate on goods.cate = goods_cate.cate_name set goods.cate = goods_cate.cate_id -- 通過goods_brands數(shù)據(jù)表來更新商品表的品牌信息 update goods inner join goods_brands on goods.brand_name = goods_brands.brand_name set goods.brand_name = goods_brands.brands_id🗒小技巧
?????????查看goods的數(shù)據(jù)表結(jié)構(gòu)會(huì)發(fā)現(xiàn)cate 和brand_name對(duì)應(yīng)的類型為 varchar但是存儲(chǔ)的都是字哥串修改數(shù)據(jù)表結(jié)構(gòu), 因?yàn)橹皇前裧oods表中類型和品牌的值改了,若讓一般人來看,就不知道是什么意思了,就需要把冗余字段名修改成相應(yīng)的cate_id, brands_id。
把cate字段改為cate_id且類型為int unsigned。把brand_name字段改為brands_id且類型為int unsigned
?
?參考:mysql修改字段名稱的方法 - MySQL數(shù)據(jù)庫(kù) - 億速云
1.3 更新完后查詢 --連接查詢
若需要商品的所有信息,就需要連接查詢。
select goods.name, goods_cate.cate_name, goods_brands.brand_name from goods inner join goods_cate on goods_cate.cate_id = goods.cate_id inner join goods_brands on goods_brands.brands_id = goods.brands_id說明:?
????????此處使用左連接和右連接的數(shù)據(jù)結(jié)果與內(nèi)連接一樣,
對(duì)于左連接,沒有商品是對(duì)應(yīng)不到品牌或類型。沒有存在商品里面有的類型在類型表找不到
對(duì)于右連接一樣,沒有品牌或類型對(duì)應(yīng)不到商品。也沒有類型表里面有多余的類型在商品里面沒有。
對(duì)于左連接和右連接看效果,分別在good_scates 和 goods_branwus表中插入記錄
insert into goods_cate(cate_name) values('路由器'),('交換機(jī)'),('網(wǎng)卡'); insert into goods_brands(brand_name) values('海爾'),('清華同方'),('神舟');在goods數(shù)據(jù)表中寫入任意數(shù)據(jù)。
insert into goods(name, cate_id, brands_id, price) values('LaserJet Pro P1606dn 黑白激光打印機(jī)', '12', '4', '1894');🧐例1: 查詢所有商品的詳細(xì)信息(通過內(nèi)連接)
select goods.name, goods_cate.cate_name, goods_brands.brand_name from goods inner join goods_cate on goods_cate.cate_id = goods.cate_id inner join goods_brands on goods_brands.brands_id = goods.brands_id🧐例2: 查詢所有商品的詳細(xì)信息(通過左連接)
select goods.name, goods_cate.cate_name, goods_brands.brand_name from goods left join goods_cate on goods_cate.cate_id = goods.cate_id left join goods_brands on goods_brands.brands_id = goods.brands_id🧐例3: 查詢所有商品的詳細(xì)信息(通過右連接)
select goods.name, goods_cate.cate_name, goods_brands.brand_name from goods right join goods_cate on goods_cate.cate_id = goods.cate_id right join goods_brands on goods_brands.brands_id = goods.brands_id🍇知識(shí)點(diǎn):?
多個(gè)表在連接的時(shí)候,最終數(shù)據(jù)到底把哪個(gè)顯示的更全一些,對(duì)于整體來說,看最后一個(gè)join,
????????寫right把最后一個(gè)數(shù)據(jù)表全部展示出來,
? ? ? ? 寫left把除了最后一個(gè)數(shù)據(jù)表,之前數(shù)據(jù)表連接的結(jié)果作為整體表看具體情況全部展示出來
? ? ? ? 最后看,具體要查詢的情況。
總結(jié)
以上是生活随笔為你收集整理的数据库学习(十)— 查询演练的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2007最新瑞星杀毒软件绿色版免费下载
- 下一篇: Go 异常捕获处理: panic(er