MySQL之进化篇

6FA9B8E3BCE0D776AFF401DB9ADC30FC.jpg

MySQL之实用篇
MySQL之牛刀小试

子查询是指出现在其他SQL语句内的SELECT子句.
例如:
SELECT * FROM t1 WHERE column1 = (SELECT column2 FROM t2)
其中 SELECT * FRIN t1 称为outerQuery
SELECT column2 FROM t2 称为subQuery
注意:子查询指嵌套在查询内部,且必须始终出现在圆括号内.
子查询可以包含多个关键字或者条件,如 DISTINCT , GROUP BY, ORDER BY,函数等.
子查询的外层查询可以是SELECT , INSERT, UPDATE,SET 或DO.
子查询可以返回标量,一行,一列或子查询.

下面是我创建的goods表结构以及添加的一些数据

表结构图.png
数据图.png

子查询

查询商品价格的平均值
SELECT AVG(goods_price) FROM goods
查询商品价格的平均值并对值进行四舍五入取两位小数
SELECT ROUND(AVG(goods_price),2) FROM goods
子查询 查询出价格大于平均值得商品
 SELECT goods_id,goods_name,goods_price FROM goods WHERE goods_price > ANY (SELECT goods_price FROM goods WHERE goods_cate = '超级本') ORDER BY goods_price DESC
 SELECT goods_id,goods_name,goods_price FROM goods WHERE goods_price  NOT IN (SELECT goods_price FROM goods WHERE goods_cate = '超级本') ORDER BY goods_price DESC
  • AVG,MAX,MIN、COUNT、SUM为聚合函数(平均值,最大值,最小值,行数,求和)
  • ROUND 是四舍五入 2代表保留两位小数
  • 用ANY,SOME或ALL修饰比较运算符 (ANY,SOME 代表的满足任意一个就可以,ALL代表必须全部满足)
  • [NOT] IN ,[NOT] EXISTS

多表插入

INSERT [INTO] table_name[(column_name,....)] SELECT ...

再创建一个新的表

CREATE TABLE IF NOT EXISTS goods_cates(cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, cate_name TEXT NOT NULL)
查询商品的分类
SELECT goods_cate FROM goods GROUP BY goods_cate
插入所有商品的分类到goods_cate分类的表中
INSERT INTO goods_cates(cate_name) SELECT goods_cate FROM goods GROUP BY goods_cate

多表更新

UPDATE table_references SET column_name1 = {expr1 | DEFAULT} [, column_name2 = {expr2 | DEFAULT}] ...... [WHERE where_condition]

for example:

UPDATE goods INNER JOIN goods_cates ON goods_cate = cate_name SET goods_cate = cate_id

CREATE ...SELECT

创建数据表的同时将查询结果写入到数据表
CREATE TABLE [IF NOT EXISTS] table_name [(create_definition,....)] select_statement

for example:

CREATE TABLE goods_brands (brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, brand_name TEXT NOT NULL) SELECT brand_name FROM goods GROUP BY brand_name
再进行刚刚的多表更新
UPDATE goods INNER JOIN goods_brands ON goods.brand_name = goods_brands.brand_name SET goods.brand_name = goods_brands.brand_id

连接

MySQL在SELECT 语句,多表更新,多表删除语句中支持JOIN 操作
语法结构
table_reference {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN} table_reference ON conditional_expr
A表 + 连接类型{INNER JOIN | LEFT JOIN | RIGHT JOIN} + B表 ON + 连接的条件
数据表参照

table_reference

table_name [[AS] alias] | table_subquery [AS] alias
  • 数据表可以使用table_name AS alias_name 或 table_name alias_name 赋予别名
  • table_subquery可以作为子查询使用在FROM子句中,这样的子查询必须为其赋予别名
连接类型
  • INNER JOIN (内连接) 在MySQL中,JOIN , CROSS JOIN 和 INNER JOIN 是等价的
  • LEFT [OUTER] JOIN (左外连接)
  • RIGHT [OUTER] JOIN (右外连接)
注意:使用ON关键字来设定连接条件,也可以使用WHERE来代替通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤
内连接
内连接.png

for example:

SELECT goods_id, goods_name, cate_name FROM goods INNER JOIN goods_cates ON goods_cate = cate_id

外链接

  • 如果使用内连接查找的记录在连接数据表中不存在,并且在WHERE子句中尝试一下操作: column_name IS NULL 时,如果column_name被定义为NOT NULL, MySQL将在找到符合连接条件的记录后停止搜索更多的行
  • A LEFT JOIN B join_condition
  • 数据表B的结果集依赖数据表A
  • 数据表A的结果集根据左连接条件依赖所有数据表(B表除外)
  • 左外连接条件决定如何缩减数据表B(在没有指定WHERE条件的情况下)
  • 如果数据表A的魔调记录符合WHERE条件,但是在数据表B不存在连接条件的记录,将会生成一个所有列为空的额外的B行
左外连接
左连接.jpg

for example:

SELECT goods_id, goods_name, cate_name FROM goods LEFT JOIN goods_cates ON goods_cate = cate_id
右外连接
右连接.png

for example:

SELECT goods_id, goods_name, cate_name FROM goods RIGHT
多表连接
我们先把goods表的两个字段名称以及类型修改一下
ALTER TABLE goods CHANGE brand_name brand_id SMALLINT NOT NULL UNSIGNED
ALTER TABLE goods CHANGE goods_cate cate_id SMALLINT NOT NULL UNSIGNED

for example :

SELECT goods_id,goods_name, goods_price, cate_name ,brand_name FROM goods AS good 
INNER JOIN goods_cates AS cate ON good.cate_id = cate.cate_id 
INNER JOIN goods_brands AS brand ON good.brand_id = brand.brand_id

无限分类的数据表设计

 CREATE TABLE goods_types (
type_id SMALLINT UNSIGNED PRIMARY KEY           AUTO_INCREMEN
type_name TEXT NOT NULL,
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
) 
  • INSERT goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT);

  • INSERT goods_types(type_name,parent_id) VALUES('电脑、办公',DEFAULT);

  • INSERT goods_types(type_name,parent_id) VALUES('大家电',1);

  • INSERT goods_types(type_name,parent_id) VALUES('生活电器',1);

  • INSERT goods_types(type_name,parent_id) VALUES('平板电视',3);

  • INSERT goods_types(type_name,parent_id) VALUES('空调',3);

  • INSERT goods_types(type_name,parent_id) VALUES('电风扇',4);

  • INSERT goods_types(type_name,parent_id) VALUES('饮水机',4);

  • INSERT goods_types(type_name,parent_id) VALUES('电脑整机',2);

  • INSERT goods_types(type_name,parent_id) VALUES('电脑配件',2);

  • INSERT goods_types(type_name,parent_id) VALUES('笔记本',9);

  • INSERT goods_types(type_name,parent_id) VALUES('超级本',9);

  • INSERT goods_types(type_name,parent_id) VALUES('游戏本',9);

  • INSERT goods_types(type_name,parent_id) VALUES('CPU',10);

  • INSERT goods_types(type_name,parent_id) VALUES('主机',10);

查询父类下边的子类
SELECT s.type_id,s.type_name,p.type_name FROM     goods_types AS s LEFT JOIN goods_types AS p 
ON s.parent_id = p.type_id
查父类下的父类的子类
SELECT p.type_id,p.type_name,s.type_name FROM goods_types AS p LEFT JOIN 
goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id

SELECT p.type_id,p.type_name,s.type_name child_count FROM goods_types AS p LEFT JOIN 
goods_types AS s ON s.parent_id = p.type_id

多表删除

DELETE table_name [.*] [table_name[.*]]..... FROM table_references [WHERE where_condition]

for example:

SELECT goods_id,goods_name FROM goods GROUP BY goods_name HAVING count(goods_name) >= 2;

DELETE t1 FROM goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM goods GROUP BY goods_name HAVING count(goods_name) >= 2) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目录结构 (2)MySQL配置向导文件(安装后配置...
    凛0_0阅读 771评论 1 0
  • 1、MySQL启动和关闭(安装及配置请参照百度经验,这里不再记录。MySQL默认端口号:3306;默认数据类型格式...
    强壮de西兰花阅读 632评论 0 1
  • 数据准备 回顾 记录操作:写操作:INSERT,UPDATE,DELETE读取操作:SELECT 这章主要学习:子...
    齐天大圣李圣杰阅读 1,049评论 0 4
  • 1. firstly, a mesos development environment should be bui...
    chjhaijiang阅读 134评论 0 0
  • * 如果有一天,我能够拥有一个大果园,* 我愿放下所有追求,做个农夫去种田,* 每一个早晨,我耕耘在绿野田园,* ...
    一直在变的风阅读 395评论 0 0