美文网首页
mysql12 -- 快速入门mysql

mysql12 -- 快速入门mysql

作者: 潘肚饿兵哥哥 | 来源:发表于2019-09-25 22:25 被阅读0次

    from --> gude 年轻的老创业者,知乎新人

    \color{rgba(254, 67, 101, .8)}{mysql需要学的,总的来说就是通过各种命令对数据库进行增、删、改、查。}

    \color{rgba(254, 67, 101, .8)}{而大部分的职位权限仅限于“查”,所以甚至你只需要学会怎么查就行了。}

    \color{rgba(254, 67, 101, .8)}{学知识,怎么学最快,不是学知识本身,而是学知识之间的结构和关系。}

    \color{rgba(254, 67, 101, .8)}{好消息是mysql的结构非常简单而且似曾相识,所以mysql非常容易入门。}

    \color{rgba(254, 67, 101, .8)}{表格大家都知道吧。}

    \color{rgba(254, 67, 101, .8)}{a行,b列,四四方方,我一说,你就在脑子里有了画面。}

    \color{rgba(254, 67, 101, .8)}{而mysql的数据就储存在一张张表格里。}

    \color{rgba(254, 67, 101, .8)}{mysql里的数据还可以导出csv格式在Excel下操作,也可以把csv格式数据导入到}

    \color{rgba(254, 67, 101, .8)}{mysql,你可以把mysql想象成一个大型的,动态的电子表格。}
    \color{rgba(254, 67, 101, .8)}{在电脑里,我们会把很多相关的表格放在一个文件夹里}
    \color{rgba(254, 67, 101, .8)}{在mysql里也一样,只不过这个文件夹叫“Schema”。 }

    image.png

    \color{rgba(254, 67, 101, .8)}{我们要查的数据,就储存在不同schema的一个个的table里。}

    \color{rgba(254, 67, 101, .8)}{比如我要查 名字为girl的 schema('文件夹') 下的table1的全部数据 ,怎么查呢?}

    use girl;
    
    select * from table1;
    

    \color{rgba(254, 67, 101, .8)}{先use一下girl,表示我们“切换到”gril这个schema下}
    \color{rgba(254, 67, 101, .8)}{后面的所有命令,都是在这个“文件夹“下操作}

    \color{rgba(254, 67, 101, .8)}{select 代表查询 * 代表全部 查询全部,从哪查? from table1,}

    \color{rgba(254, 67, 101, .8)}{简单一句命令,就查询了表table1的全部内容。 }

    image.png

    \color{rgba(254, 67, 101, .8)}{是不是非常的简单? }

    \color{rgba(254, 67, 101, .8)}{当然,我们的查询不会都这么简单,有时候需要某段时间的数据}

    \color{rgba(254, 67, 101, .8)}{有时候需要某类客户的数据,有时候需要分类,有时候需要排名}
    \color{rgba(254, 67, 101, .8)}{这就需要更多细节的命令。}

    \color{rgba(254, 67, 101, .8)}{但万变不离其宗,道理是一样的,还是非常简单的。}
    \color{rgba(254, 67, 101, .8)}{说到这里,如果你还没有安装mysql,不妨安装一个,跟我一起操作起来。}
    \color{rgba(254, 67, 101, .8)}{直接搜索mysql,点进官网,downloads--window--[MySQL Installer]}

    \color{rgba(254, 67, 101, .8)}{安装过程基本下一步,不再赘述。}

    \color{rgba(254, 67, 101, .8)}{安装好后,在开始菜单里会出现mysql workbench}

    \color{rgba(254, 67, 101, .8)}{这就是辅助我们打代码的工具,让学习和操作MYSQL变得更加简单。}

    \color{rgba(254, 67, 101, .8)}{打开软件,再点击灰色方块中安装好的数据库。 }

    image.png

    是全英文的,不过没关系,

    image.png

    \color{rgba(254, 67, 101, .8)}{看最左边,这里白白的地方有桶一样标志的,就是schema,也就是“文件夹”。}

    \color{rgba(254, 67, 101, .8)}{前面的小三角点一下可以打开,就看到了tables}

    \color{rgba(254, 67, 101, .8)}{上面有一排带小加号的标志,就是一些常用的快捷功能按钮。}

    \color{rgba(254, 67, 101, .8)}{点击第一个带+的SQL按钮,就创建了一个新的sql文件,也就是我们写代码的地方。}

    \color{rgba(254, 67, 101, .8)}{右边还有带加号的桶、带加号的表格一类的小按钮}

    \color{rgba(254, 67, 101, .8)}{很容易就想到这就是用来创建schema和table的。}
    \color{rgba(254, 67, 101, .8)}{我们现在就创建一个新的schema,并在此之下创建新的table做练习。}
    \color{rgba(254, 67, 101, .8)}{可以用快捷按钮,也可以直接输入命令。}

    \color{rgba(254, 67, 101, .8)}{光标点到这条命令,crtl+回车运行这条命令。}

    create database new1;
    use new1;
    

    \color{rgba(254, 67, 101, .8)}{create 创建,database 数据库,名字是 new1}
    \color{rgba(254, 67, 101, .8)}{同样的create换为drop就是删除。}

    \color{rgba(254, 67, 101, .8)}{然后别忘了use 一下 new1这个schema,}

    \color{rgba(254, 67, 101, .8)}{mysql的每一条完整命令后面用; 分号作为结尾。}

    \color{rgba(254, 67, 101, .8)}{然后我们创建一个表 }

    CREATE TABLE orders 
    (   PRIMARY KEY (order_id),
        order_id INT(11) ,
        fisrt_name VARCHAR(100) ,
        last_name VARCHAR(100) ,
        province VARCHAR(100),
        city VARCHAR(100) ,
        order_pieces DECIMAL(9,2) ,
        order_value DECIMAL(9,2)
    );
    

    \color{rgba(254, 67, 101, .8)}{看起来一大团,别慌,慢慢看}

    \color{rgba(254, 67, 101, .8)}{CREATE TABLE orders的语法和创建schema一样}
    \color{rgba(254, 67, 101, .8)}{CREATE创建 -- table -- 名字是orders。}

    \color{rgba(254, 67, 101, .8)}{mysql的表格和excel不太一样,excel的表格完全是空的}
    \color{rgba(254, 67, 101, .8)}{可以随便的输入表头,列头。}

    \color{rgba(254, 67, 101, .8)}{但是mysql的table必须要在创建的时候}
    \color{rgba(254, 67, 101, .8)}{就要设置好每一列所代表的内容和数据格式。}

    \color{rgba(254, 67, 101, .8)}{而每一行,就代表一条数据。}
    \color{rgba(254, 67, 101, .8)}{一条一条的数据储存进去,就形成了数据库表单。}

    image.png

    \color{rgba(254, 67, 101, .8)}{你可以理解为是一个创建时必须要有表头}
    \color{rgba(254, 67, 101, .8)}{并且锁死每列的数据格式的Excel表格}
    \color{rgba(254, 67, 101, .8)}{这个表格里一行就代表一条数据}
    \color{rgba(254, 67, 101, .8)}{所以创建table时,就会出现了这么一团用() 括起来的}

    \color{rgba(254, 67, 101, .8)}{用来定义每一列数据名称和格式的代码}

    \color{rgba(254, 67, 101, .8)}{首先规定主key——PRIMARY KEY}

    \color{rgba(254, 67, 101, .8)}{PRIMARY KEY (order\_id),我们把ID这一列设为主KEY}
    \color{rgba(254, 67, 101, .8)}{主KEY是区分每一条数据的标识,所以必然不可以重复,并且不为空}

    \color{rgba(254, 67, 101, .8)}{主key这个概念相信大家都不会陌生}
    \color{rgba(254, 67, 101, .8)}{比如淘宝的商品ID,订单号,游戏的ID,账号,等等唯一的数据标识}

    \color{rgba(254, 67, 101, .8)}{下面几行就是创建其他列了,我们创建了:}
    \color{rgba(254, 67, 101, .8)}{order\_id,fisrt\_name,last\_name,province,city,order\_pieces,order\_value}
    \color{rgba(254, 67, 101, .8)}{这7列,分别代表了订单ID,姓,名,省,城市,订单件数,订单金额}
    \color{rgba(254, 67, 101, .8)}{可以看出,这就是一个简易的储存订单信息的表单}

    image.png

    在workbench里输入的代码,会被自动的颜色区分,一目了然。黑色的代表我们定义的名称,蓝色的部分是命令。
    \color{rgba(254, 67, 101, .8)}{mysql在创建每一列的时候,必须要设定数据格式}

    \color{rgba(254, 67, 101, .8)}{所以在每一列名称后面,空格,写上蓝色的设定数据格式的命令}

    \color{rgba(254, 67, 101, .8)}{比如 order\_id 设置为int格式,固定宽度为11}
    \color{rgba(254, 67, 101, .8)}{这样ID就是00000000001~99999999999的整数格式}

    \color{rgba(254, 67, 101, .8)}{而 first\_name 等,设置为 varchar 格式}
    \color{rgba(254, 67, 101, .8)}{这是可以储存各种字符串的格式,最大长度设为100.}

    \color{rgba(254, 67, 101, .8)}{金额和数量,设置为decimal格式(9,2)}
    \color{rgba(254, 67, 101, .8)}{表示最多可以是9位数,小数点后保留2位}

    \color{rgba(254, 67, 101, .8)}{这样我们就创建好了这个7列的table,主Key为order\_id。}

    \color{rgba(254, 67, 101, .8)}{ok,这段代码是不是读懂了?是不是也不复杂。}

    \color{rgba(254, 67, 101, .8)}{当然会有其他更复杂的设定,比如是否可以为空值,默认值是什么}
    \color{rgba(254, 67, 101, .8)}{这些其实不属于“查”这个功能的范围,所以也不是我这篇文章想要涉及的}
    \color{rgba(254, 67, 101, .8)}{只是为了创建一个数据表用来练习“查”,所以简单的带过。}

    \color{rgba(254, 67, 101, .8)}{即便这段看不懂也没关系,复制粘贴执行即可。}

    \color{rgba(254, 67, 101, .8)}{如果你们有现成的数据表练手,比如淘宝导出的订单列表等,那再好不过}
    \color{rgba(254, 67, 101, .8)}{可以直接在左边窗口,new1下的table处点右键,点击table data import Wizard}
    \color{rgba(254, 67, 101, .8)}{选择csv文件导入数据。}

    \color{rgba(254, 67, 101, .8)}{好了,表格有了,输入查询命令试试看。 }

     select * from orders;
    

    \color{rgba(254, 67, 101, .8)}{ctrl+回车}

    image.png

    \color{rgba(254, 67, 101, .8)}{可以看到在命令下面出来了一个表格窗口,里面已经有了每一列的表头}
    \color{rgba(254, 67, 101, .8)}{数据都是null,因为这还是一个空表,没有数据。现在我们填充数据}
    \color{rgba(254, 67, 101, .8)}{复制粘贴执行即可}

    insert into orders
    values
    (1,'wu','yongli','广东省','东莞市','7','2762.1'),
    (2,'wu','yongli','广东省','东莞市','6','2223.1'),
    (3,'wang','zhenzhen','广东省','深圳市','6','1802.9'),
    (4,'li','yixiao','浙江省','杭州市','5','1087.9'),
    (5,'wu','yifan','四川省','达州市','5','1097.25'),
    (6,'mei','yishu','上海','上海市','5','1398.1'),
    (7,'gu','ting','浙江省','温州市','6','1453.65'),
    (8,'zhang','jiajia','广东省','肇庆市','6','1249.05'),
    (9,'zhang','jiajia','广东省','肇庆市','5','1053.25'),
    (10,'li','feng','广东省','广州市','7','1589.5'),
    (11,'zhang','jiayi','广东省','深圳市','6','1973.4'),
    (12,'qi','sisi','重庆','重庆市','2','2786.3'),
    (13,'an','siqi','浙江省','杭州市','5','1086.25'),
    (14,'su','dongdong','江苏省','常州市','4','1152.8'),
    (15,'zhang','jingjing','江苏省','苏州市','3','1491.05'),
    (16,'Catherine','Ho ','广东省','深圳市','2','2563'),
    (17,'Catherine','Ho ','广东省','深圳市','33','9966'),
    (18,'Catherine','Ho ','广东省','深圳市','9','11726'),
    (19,'Catherine','Ho ','广东省','深圳市','2','2728'),
    (20,'Catherine','Ho ','广东省','深圳市','2','2728'),
    (21,'che','manli','湖北省','黄石市','6','1293.6'),
    (22,'wang','yixuan','浙江省','温州市','1','604.45'),
    (23,'wang','yixuan','浙江省','温州市','1','604.45'),
    (24,'wang','yixuan','浙江省','温州市','1','604.45'),
    (25,'dai','yukai','广东省','深圳市','1','1099.45'),
    (26,'wang','dong','广东省','深圳市','5','1175.9'),
    (27,'she','nan','广东省','广州市','5','1097.25'),
    (28,'wang','zhilong','浙江省','湖州市','6','2316.6'),
    (29,'cai','guoqing','北京','北京市','7','1249.6'),
    (30,'wei','min','江苏省','南通市','7','2189.55'),
    (31,'tang','chuan','广东省','深圳市','4','1647.8'),
    (32,'chen','meihong','广东省','东莞市','10','3219.7'),
    (33,'tang','jiajia','四川省','自贡市','7','1609.85'),
    (34,'chen','mingxiang','浙江省','杭州市','6','1359.6'),
    (35,'xiao','jing','四川省','成都市','5','1097.25'),
    (36,'liu','weiwei','浙江省','金华市','5','1659.35'),
    (37,'chen','jiaqi','广东省','中山市','5','1141.25'),
    (38,'xin','yiping','广东省','珠海市','2','1098.9'),
    (39,'chen','weijie','江苏省','苏州市','5','1094.5'),
    (40,'yan','lei','上海','上海市','4','1361.8'),
    (41,'gong','an','广东省','深圳市','4','1602.7'),
    (42,'wang','nan','陕西省','西安市','5','1295.25'),
    (43,'mu','ziqi','浙江省','台州市','5','1097.25'),
    (44,'xiao','zhu','广东省','深圳市','5','1061.5'),
    (45,'ji','jie','广东省','广州市','5','2011.35'),
    (46,'xu','zheng','广东省','深圳市','6','1803.45'),
    (47,'xu','zheng','广东省','深圳市','10','3158.1'),
    (48,'xu','zheng','广东省','深圳市','13','3361.6'),
    (49,'guo','zinan','上海','上海市','5','1092.3'),
    (50,'an','peipei','上海','上海市','10','2744.5'),
    (51,'zhen','nanyi','四川省','甘孜藏族自治州','2','1417.9'),
    (52,'xu','guoqiang','江苏省','常州市','10','2663.65'),
    (53,'yan','wenyan','湖北省','武汉市','8','2150.5'),
    (54,'zhu','jinxia','湖南省','株洲市','1','1094.5'),
    (55,'zhu','yasong','北京','北京市','10','2501.95'),
    (56,'ke','fufu','辽宁省','锦州市','5','1097.25'),
    (57,'yan','xiaojiang','北京','北京市','10','2444.2'),
    (58,'jiang','yiyan','浙江省','温州市','5','1097.25'),
    (59,'zhou','wanjun','湖南省','永州市','1','928.95'),
    (60,'xu','feixia','山东省','潍坊市','5','1087.9'),
    (61,'du','guifeng','内蒙古自治区','巴彦淖尔市','7','1536.15'),
    (62,'mu','naiyi','江西省','南昌市','8','2045.45'),
    (63,'hu','yuejiao','北京','北京市','5','1919.5'),
    (64,'hu','ziping','天津','天津市','1','1364'),
    (65,'xu','jia','辽宁省','鞍山市','5','1514.7'),
    (66,'che','zhicong','广东省','深圳市','1','912.45'),
    (67,'ke','bingbing','江苏省','淮安市','6','1310.65'),
    (68,'ke','bingbing','江苏省','淮安市','7','1371.15'),
    (69,'huang','feihong','湖北省','武汉市','10','3202.65'),
    (70,'bai','yulan','江苏省','盐城市','2','2107.6'),
    (71,'xu','jing','江苏省','苏州市','5','858'),
    (72,'xiao','jiajia','陕西省','西安市','7','1368.4'),
    (73,'wulan','nacha','内蒙古自治区','呼伦贝尔市','6','2098.8'),
    (74,'wulan','nacha','内蒙古自治区','呼伦贝尔市','5','1610.95'),
    (75,'bao','yue','重庆','重庆市','1','1165.45'),
    (76,'liu','xingyue','北京','北京市','9','1986.05'),
    (77,'liu','zelan','江苏省','南京市','6','1111.55'),
    (78,'long','qidan','内蒙古自治区','鄂尔多斯市','10','2152.15'),
    (79,'xie','feng','北京','北京市','5','1238.05'),
    (80,'wu','jianfeng','安徽省','合肥市','5','1094.5'),
    (81,'lou','yixiao','天津','天津市','5','1097.25'),
    (82,'li','jian','上海','上海市','2','823.9'),
    (83,'lu','na','北京','北京市','5','1094.5'),
    (84,'luo','huihui','重庆','重庆市','1','1419'),
    (85,'luo','meihong','山东省','威海市','5','1358.5'),
    (86,'ma','chunjuan','四川省','宜宾市','10','2838.55'),
    (87,'mao','tingting','四川省','宜宾市','6','1694'),
    (88,'guo','yanxin','辽宁省','大连市','5','1519.65'),
    (89,'meng','fei','四川省','成都市','8','2303.95'),
    (90,'ning','jing','四川省','南充市','5','1075.25'),
    (91,'pan','xuelian','河北省','承德市','5','1097.25'),
    (92,'bai','liang','内蒙古自治区','兴安盟','1','929.5'),
    (93,'bo','zixiao','陕西省','西安市','5','1427.25'),
    (94,'li','lijuan','河南省','洛阳市','5','1086.25'),
    (95,'wang','mengjia','河南省','郑州市','5','1097.25'),
    (96,'wang','mengjia','河南省','郑州市','5','1097.25'),
    (97,'bei','xue','北京','北京市','5','1338.7'),
    (98,'mu','chun','辽宁省','沈阳市','3','1737.45'),
    (99,'zhang','shuhua','山东省','潍坊市','5','1089'),
    (100,'zhang','shuhua','山东省','潍坊市','5','1298')
    ;
    

    \color{rgba(254, 67, 101, .8)}{填充数据的命令更好读懂了}
    \color{rgba(254, 67, 101, .8)}{insert  into 到 orders这个表,values内容是()}

    \color{rgba(254, 67, 101, .8)}{每条数据用()括起来,单块数据用逗号分割}
    \color{rgba(254, 67, 101, .8)}{VARCHAR格式的数据要用' '引号括起来}
    \color{rgba(254, 67, 101, .8)}{好了,数据导入后,练习的数据表就建立好了。}

    \color{rgba(254, 67, 101, .8)}{再运行一下上一条的 select * from orders; 查询命令,}

    image.png

    \color{rgba(254, 67, 101, .8)}{运行之后,表格的数据已经有啦}

    \color{rgba(254, 67, 101, .8)}{现在开始重头戏了,查表!}

    \color{rgba(254, 67, 101, .8)}{select * from orders; 是查询全部表,那只查2列呢,比如 只查province和city}

    \color{rgba(254, 67, 101, .8)}{简单,把*换成 province 和 city。用逗号分割即可}

    select province,city from orders;
    

    \color{rgba(254, 67, 101, .8)}{那再定位行呢,比如查order_id是15的行。}

    \color{rgba(254, 67, 101, .8)}{也很简单,在from orders之后,加上where 条件判断, 在哪?}
    \color{rgba(254, 67, 101, .8)}{在符合『 order\_id = 15 』这个条件的行}

    select province,city from orders where order_id=15;
    

    \color{rgba(254, 67, 101, .8)}{那要查多个行怎么办,比如order\_id=15、25、35的行,}

    \color{rgba(254, 67, 101, .8)}{直接 order_id = 15,25,35行吗,不行,因为=后面只能是一个值,不能是多个值}
    \color{rgba(254, 67, 101, .8)}{这时候我们用到 in ,表示在这个范围内}

    select province,city from orders where order_id in (15,25,35);
    

    \color{rgba(254, 67, 101, .8)}{字符怎么办呢,比如要找所有姓guo的人的订单。把字符用引号""包起来}

    select province,city from orders where fisrt_name = "guo";
    

    \color{rgba(254, 67, 101, .8)}{找所有名字里包含"juan"的呢?模糊查找用 like ,“juan”的前后用\%}
    \color{rgba(254, 67, 101, .8)}{意思是前后可以为任何值}

    select province,city from orders where last_name like "%juan%";
    

    \color{rgba(254, 67, 101, .8)}{where后面,跟的是一个条件判断,只要符合这个条件的行都会被查出来}
    \color{rgba(254, 67, 101, .8)}{那么自然而然的,就可以做一些逻辑运算,比如or 和 and}

    \color{rgba(254, 67, 101, .8)}{比如查找 姓是guo 或 名字里包含juan 的所有数据}

    select * from orders 
    where 
    fisrt_name = "guo"
    or
    last_name like "%juan%";
    

    \color{rgba(254, 67, 101, .8)}{查好的结果可以排序}

    \color{rgba(254, 67, 101, .8)}{比如要查找姓是guo的所有数据,按照消费金额降序排列}
    \color{rgba(254, 67, 101, .8)}{那么只需在刚才的查找代码下面,加一个order by来排序, by什么?}
    \color{rgba(254, 67, 101, .8)}{依据的数据是order\_value,desc代表降序,不输入desc默认升序}

    select * from orders where fisrt_name = "guo"
    order by order_value desc;
    

    \color{rgba(254, 67, 101, .8)}{如果只需要显示第一条数据呢,只需要在最后面加上limit 1 }

    select * from orders where fisrt_name = "guo"
    order by order_value desc
    limit 1;
    

    \color{rgba(254, 67, 101, .8)}{需要显示几条数据,就limit几}

    \color{rgba(254, 67, 101, .8)}{这在们应对大规模数据的时候非常有用,比如可以只limit10行,看下数据结构}

    \color{rgba(254, 67, 101, .8)}{最基本的定位查找,现在就已经看到门了。语法非常的简单,按如下顺序}

    select 哪些列
    from 哪个表
    where 符合什么条件的行
    order by 依据什么排序
    limit 显示多少行
    

    \color{rgba(254, 67, 101, .8)}{是不是又简单又直观?}

    \color{rgba(254, 67, 101, .8)}{需要注意的是,mysql的语法里,这些模块之间不需要任何符号,可以用空格分隔写在一行}

    \color{rgba(254, 67, 101, .8)}{也可以回车换行写在不同行}

    \color{rgba(254, 67, 101, .8)}{只有在 分割不同的列,不同的行时,才需要用逗号分隔}
    \color{rgba(254, 67, 101, .8)}{注意是分割,只需要在中间加逗号,最后一个后面不需要逗号}

    \color{rgba(254, 67, 101, .8)}{最后记得用分号结尾,结束这条命令}

    image.png

    \color{rgba(254, 67, 101, .8)}{先自己做几个简单的练习吧,}

    1. 查找所有洛阳的订单的全部信息。
    2. 查找订单金额大于2000的订单全部信息,按降序排列。
    3. 查找金额最大的5条广东的订单的姓和名。
    4. 查找订单件数最多的5条浙江、福建或者山东的订单 的订单ID。

    \color{rgba(254, 67, 101, .8)}{做完练习,我们开始接触一些进阶的功能}

    \color{rgba(254, 67, 101, .8)}{比如刚才的第3题,如果觉得,姓和名各一列不是很舒服,能不能在一列里面显示姓名呢}

    \color{rgba(254, 67, 101, .8)}{那我们可以这么做}

    select
    concat(fisrt_name,' ',last_name) as full_name
    from orders
    where province = "广东省"
    order by order_pieces desc
    limit 5;
    

    \color{rgba(254, 67, 101, .8)}{concat()的功能,就是把多条信息拼接到一起,要拼接的信息用逗号分隔}

    \color{rgba(254, 67, 101, .8)}{因为我们最终要查找的,就是姓名这一列,要合并列,属于对列的操作,所以要在select后面操作}

    \color{rgba(254, 67, 101, .8)}{我们用concat合并了fisrt\_name , 一个空格' ' ,和last\_name}
    \color{rgba(254, 67, 101, .8)}{把新建的列用 as 命名为full\_name。这里的as命名不是必须的,如果不命名,他会自动命名}

    \color{rgba(254, 67, 101, .8)}{发现没,我们不光可以查找这个表格原有的列,还可以对这些列进行运算合并,新建一列出来}

    \color{rgba(254, 67, 101, .8)}{那么如果几列的数据格式都是数字,当然也可以用+-*/符号来运算}

    \color{rgba(254, 67, 101, .8)}{比如我们要算每个订单ID 的 商品单价}

    select 
    order_id,   order_value/order_pieces as unit_price
    from orders;
    

    \color{rgba(254, 67, 101, .8)}{这里插一下,如果觉得老要输入这些长长的列名很痛苦,可以这样操作}

    image.png

    \color{rgba(254, 67, 101, .8)}{刚才我们做第3题发现,出来的结果有重复的,因为存在一个客户多次下单的情况}

    \color{rgba(254, 67, 101, .8)}{我就想知道哪5个 广东的 客户,订单件数最多,怎么办}
    \color{rgba(254, 67, 101, .8)}{那首先我们要把每个客户的订单件数做一个汇总}

    \color{rgba(254, 67, 101, .8)}{怎么做呢? 用group by}

    
    select 
        concat(fisrt_name, ' ', last_name) as full_name,
        sum(order_pieces) as sum_pieces
    from
        orders
    where
        province = '广东省'
    group by full_name
    order by sum_pieces desc
    limit 5;
    

    \color{rgba(254, 67, 101, .8)}{sum()是聚合函数,熟悉excel的都知道这就是求和}
    \color{rgba(254, 67, 101, .8)}{因为Group by汇总了几条数据,但必须要在表格里显示出一个唯一的结果}
    \color{rgba(254, 67, 101, .8)}{所以Group by 一般必须配合聚合函数用}

    \color{rgba(254, 67, 101, .8)}{你可以这样想一下,一个人有好几个订单,针对这个人进行聚合}
    \color{rgba(254, 67, 101, .8)}{那他的好几行订单数据怎么放? 要想展示在一行里,肯定需要运算}
    \color{rgba(254, 67, 101, .8)}{要么求和,要么平均,要么取最大最小值等等}

    \color{rgba(254, 67, 101, .8)}{所以我们读一下代码}

    查找
    新建一个拼合列,拼合姓和名,并且命名为full_name
    新建一个求和列,求订单件数的和,并且命名为sum_pieces
    在orders这个表里,符合省='广东省'的行。
    对全名full_name进行汇总,
    依据订单件数之和sum_pieces进行降序排列。
    取前5条。
    

    \color{rgba(254, 67, 101, .8)}{发现没有,我们进行汇总的,和进行排列的目标,都是表里原来没有的,新建的列}

    group by full_name 
    order by sum_pieces desc
    

    \color{rgba(254, 67, 101, .8)}{居然还可以对一个本来不存在的,虚拟的列进行操作}

    \color{rgba(254, 67, 101, .8)}{其实这就是所有计算机语言里都有的,一个变量的概念—局部变量}

    \color{rgba(254, 67, 101, .8)}{在这条命令里,分号之前,就多出了full\_name和sum\_pieces这2个列}
    \color{rgba(254, 67, 101, .8)}{分号之后,下一条命令里,这2个列又消失了}

    其实有的时候会发现局部变量不管用,因为语句的底层执行顺序不一样,比如先执行where,再执行group by,那么在group by里用as定义的变量,在where命令里无法引用,就会报错。这点我们先忽略,因为今天是入门,入门之后的练习中总会遇到各种问题,遇到问题解决问题,慢慢的就会掌握规律了。

    \color{rgba(254, 67, 101, .8)}{好了,分类汇总我们也接触到了,总结一下:}
    \color{rgba(254, 67, 101, .8)}{依据哪一列汇总,就group by哪一列,group by和聚合函数 sum()等,配套使用}
    \color{rgba(254, 67, 101, .8)}{group by语句放在where之后,order by之前}

    \color{rgba(254, 67, 101, .8)}{做几个简单练习吧 }

    1. 查询展示每个省的全部订单金额
    2. 查询展示单价最高的5个城市
    3. 查询展示平均订单金额最高的5个姓氏。 (平均的聚合函数是 Avg() )

    \color{rgba(254, 67, 101, .8)}{现在我们再来接触一下分级}

    \color{rgba(254, 67, 101, .8)}{实际应用中,经常需要给客户分层、给绩效分ABCDE等等。mysql也支持分层操作}

    \color{rgba(254, 67, 101, .8)}{我们试试给这个案例中的订单进行分级,简单一点}
    \color{rgba(254, 67, 101, .8)}{按照金额小于1000是low,1000~2000是middle,2000以上是High}

    \color{rgba(254, 67, 101, .8)}{因为要展示分层的结果,需要新建一列出来,用来记录订单的级别,你知道在代码写在哪了吗}

    \color{rgba(254, 67, 101, .8)}{答对了,对列的操作,在select后面写}

    select
    *,
    case 
    when order_value<1000 then "low"
    when order_value between 1000 and 2000 then "middle"
    else "high"
    end 
    
    from orders;
    

    \color{rgba(254, 67, 101, .8)}{先查找原表所有数据*,然后逗号,再加一列来展示分层结果}

    \color{rgba(254, 67, 101, .8)}{分层的语法是这样的}

    \color{rgba(254, 67, 101, .8)}{最前面以case开始,最后面以end结束,首尾清晰所以不需要()}

    \color{rgba(254, 67, 101, .8)}{在case和end之间,用多句when.... then.... 和else 来设置条件}

    \color{rgba(254, 67, 101, .8)}{当 order\_value<1000 时 那么 显示为“low"}

    \color{rgba(254, 67, 101, .8)}{当 order\_value 在1000 和 2000 之间时,显示为"middle"}

    \color{rgba(254, 67, 101, .8)}{其余情况,显示为"high"}

    \color{rgba(254, 67, 101, .8)}{这些语句易懂的就像白话}

    \color{rgba(254, 67, 101, .8)}{这里新学了一个between ... and... 句式,用以限定范围,非常易读,在XX到XX之间}
    \color{rgba(254, 67, 101, .8)}{需要注意的是,between and 是包含首位两端的}

    \color{rgba(254, 67, 101, .8)}{他等价于 order\_value>=1000 and order\_value<=2000}

    \color{rgba(254, 67, 101, .8)}{对了,mysql里,>=挨着写,代表大于等于,而不等于这么写<>}

    \color{rgba(254, 67, 101, .8)}{又学到一个新知识点,是不是有剥茧抽丝的感觉}

    \color{rgba(254, 67, 101, .8)}{好了,来个复杂点的案例}

    \color{rgba(254, 67, 101, .8)}{我们能不能针对客户,按照客户订单单价200以下,200~500,500~1000,1000以上来分4级}
    \color{rgba(254, 67, 101, .8)}{取出所有订单单价在1000以上的,客户全名,客户订单单价和客户等级}
    \color{rgba(254, 67, 101, .8)}{按照客户订单总金额降序排列,取前10}

    \color{rgba(254, 67, 101, .8)}{先审题,针对客户,原表格里能体现客户的只有名字,那么我们自然想到针对名字做group by}
    \color{rgba(254, 67, 101, .8)}{按单价分级,那就是求和 总金额/总件数,后面的都是套路了}

    \color{rgba(254, 67, 101, .8)}{那就开始吧}

    \color{rgba(254, 67, 101, .8)}{首先看取什么,就把select 什么写上}

    select 
    concat(fisrt_name, ' ', last_name) as full_name,
    sum(order_value)/sum(order_pieces) as unit_price,
    case
    when unit_price < 200 then "a"
    when unit_price >= 200 and unit_price<500 then "b"
    when unit_price >= 500 and unit_price<1000 then "c"
    else "d"
    end as lever
    from  orders
    where lever="d"
    group by full_name
    order by sum(order_value) desc
    limit 10
    

    \color{rgba(254, 67, 101, .8)}{一顿操作,看起来很完美,取全名,平均金额,级别,写在select后面}

    \color{rgba(254, 67, 101, .8)}{where 里写条件是 级别=d的}

    \color{rgba(254, 67, 101, .8)}{按照全名分类汇总}

    \color{rgba(254, 67, 101, .8)}{按照总金额排序}

    \color{rgba(254, 67, 101, .8)}{取前十个}

    \color{rgba(254, 67, 101, .8)}{ctrl+回车! 什么鬼,怎么报错}

    \color{rgba(254, 67, 101, .8)}{我们看下最下面一行的错误代码}

    Error Code: 1054\. Unknown column 'unit_price' in 'field list'

    \color{rgba(254, 67, 101, .8)}{看不懂可以百度翻译一下,字段列表中没有unit\_price这一列}

    \color{rgba(254, 67, 101, .8)}{这时候我们回头看代码,发现我们遇到了前面提到过的,运行顺序的坑}
    \color{rgba(254, 67, 101, .8)}{unit\_price是我们在select时候生成的,同时还想在select里的case里调用}
    \color{rgba(254, 67, 101, .8)}{都是select同一运行级别,case想调用的时候,unit\_price还没生成呢}

    \color{rgba(254, 67, 101, .8)}{其实还有一个坑,where lever="d" 也没法调用}
    \color{rgba(254, 67, 101, .8)}{因为Where的运行是在select之前,而lever变量是在后面生成的}

    \color{rgba(254, 67, 101, .8)}{这可怎么办。}

    \color{rgba(254, 67, 101, .8)}{我们可以来一个嵌套,先查找创建一个带有unit\_price 和 lever的表,在对这个表进行条件操作}

    select 
    concat(fisrt_name, ' ', last_name) as full_name,
    sum(order_value)/sum(order_pieces) as unit_price,
    sum(order_value) as sum_value
    from  orders
    group by full_name;
    
    image.png

    \color{rgba(254, 67, 101, .8)}{在创建这个表的时候,查询了所有后面一次查询所需要的结果。 }
    \color{rgba(254, 67, 101, .8)}{我们先创建了一个,带有全名,单价,总金额的临时表。 }
    \color{rgba(254, 67, 101, .8)}{然后对它再进行分级、排序等操作就行了呗。 }
    \color{rgba(254, 67, 101, .8)}{怎么对它呢,括号括起来,From 它,临时表规定必须有个别名,所以Las t,设个别名为t。 }

    select full_name,unit_price,
    case
    when unit_price < 200 then "a"
    when unit_price >= 200 and unit_price<500 then "b"
    when unit_price >= 500 and unit_price<1000 then "c"
    else "d"
    end as lever
    
    from
    
    (select 
    concat(fisrt_name, ' ', last_name) as full_name,
    sum(order_value)/sum(order_pieces) as unit_price,
    sum(order_value) as sum_value
    from  orders
    group by full_name) as t
    
    where unit_price>=1000
    group by full_name
    order by sum_value desc
    limit 10;
    
    

    \color{rgba(254, 67, 101, .8)}{怎么样,这个案例里面,我们不仅用到了前面所有学到的知识,总结一下}

    select 
    
    原有列,
    concat()合并列,
    +-*/运算列,
    case when then else end 分级列
    
    from 表
    where 条件
    group by 基于什么汇总
    order by 基于什么排序
    limit 取多少条结果
    

    \color{rgba(254, 67, 101, .8)}{还接触了一个全新的领域,嵌套。}

    \color{rgba(254, 67, 101, .8)}{原来一个查询的结果,可以作为一个临时表,以供新一次的查询。}

    \color{rgba(254, 67, 101, .8)}{可以嵌套,那查询就会更加灵活了,可以查询一下更复杂的结果。}

    \color{rgba(254, 67, 101, .8)}{举个例子。}

    \color{rgba(254, 67, 101, .8)}{查找所有比ID为'15'的订单的金额更高的订单,显示订单ID和金额。}

    \color{rgba(254, 67, 101, .8)}{根据前面的知识,我们很容易的就能查找到ID为15的金额。}

    select order_value from orders where order_id="15" ;
    

    \color{rgba(254, 67, 101, .8)}{但是比较怎么比呢?来个嵌套吧。 }

    select order_id,order_value from orders 
    where 
    order_value > (select order_value from orders where order_id="15") ;
    

    \color{rgba(254, 67, 101, .8)}{设置Where条件:order\_value >刚才查询的ID为15的金额。}

    \color{rgba(254, 67, 101, .8)}{是不是也很好理解。嵌套不光可以用在from之后,用在Where条件里更多。}

    \color{rgba(254, 67, 101, .8)}{因为这里嵌套的其实是一个值,不是一个表,所以无需设置别名}
    \color{rgba(254, 67, 101, .8)}{但是要注意,嵌套里取出的值,一定是要比较的值}
    \color{rgba(254, 67, 101, .8)}{要比较order\_value ,嵌套就单一查找order\_value}
    \color{rgba(254, 67, 101, .8)}{如果查找结果还包含了其他数据,那怎么跟order\_value 比较呢?}

    \color{rgba(254, 67, 101, .8)}{再来几个小练习吧。}

    1. 查出所有订单金额大于平均金额的订单的全部信息。
    2. 查出广东省里订单金额最低的订单的订单ID。
    3. 查出江浙沪的 高于江浙沪客户平均订单金额的 客户的ID和平均订单金额。

    \color{rgba(254, 67, 101, .8)}{学会嵌套了,那么再复杂也是不难的,无非是套路。}

    \color{rgba(254, 67, 101, .8)}{除了各种复杂的嵌套,有没有简单直观一点的方式能解决问题呢。}

    \color{rgba(254, 67, 101, .8)}{有,mysql8.0以上的版本,提供了窗函数功能,可以方便的开个小窗进行同类分析}
    \color{rgba(254, 67, 101, .8)}{代码更简洁,虽然这意味着我们要认识更多的代码了,但我保证,这一点也不难。}

    \color{rgba(254, 67, 101, .8)}{如果我想在刚才的表格上右边加一列,展示这个省的总订单金额,该怎么做}

    \color{rgba(254, 67, 101, .8)}{按照老的嵌套方法,那可麻烦了呢,先求出每个省的总订单金额,当作一个临时表拼进去。}

    \color{rgba(254, 67, 101, .8)}{现在我们可以这样。}

    select *, sum(order_value) over (partition by province)
    from orders;
    

    \color{rgba(254, 67, 101, .8)}{就完事了呢,简便吧。}

    \color{rgba(254, 67, 101, .8)}{先查询全部,右边加一列,sum对订单金额求和 over() 就是开窗的命令}
    \color{rgba(254, 67, 101, .8)}{窗户怎么开呢,partition by province,对省份进行分类汇总}

    \color{rgba(254, 67, 101, .8)}{语法是 : 聚类函数/窗函数() over (partition by 分类汇总的目标)}

    \color{rgba(254, 67, 101, .8)}{partition by类似于group by,不过group by是针对整个表的,而over (partition by ...)}
    \color{rgba(254, 67, 101, .8)}{只是针对这一列,开一个小窗单独进行计算。}

    \color{rgba(254, 67, 101, .8)}{如果不partition by ,直接over(),那么就会输出全部值的sum结果。}

    \color{rgba(254, 67, 101, .8)}{聚类函数前面介绍过,sum() avg() min()等等,在这里都可以用。 那窗函数是什么呢。}

    \color{rgba(254, 67, 101, .8)}{前面们学过排序,但是并没有接触到排名,怎么给每条数据1234一个具体的名次呢。}

    \color{rgba(254, 67, 101, .8)}{现在就介绍一个窗函数row\_number(),用来输出序号的。}

    \color{rgba(254, 67, 101, .8)}{比如我们要把每个省的订单排个名。}

    select *,
    row_number() over (partition by province order by order_value desc)
    from orders;
    
    image.png

    \color{rgba(254, 67, 101, .8)}{对省份汇总,并且输出编号。}

    \color{rgba(254, 67, 101, .8)}{这样我们就对省份进行了汇总,并且把订单金额降序排列,输出了排名}

    \color{rgba(254, 67, 101, .8)}{跟group by一样,partition by后面也可以跟个order by 用来在这个窗口排序}

    \color{rgba(254, 67, 101, .8)}{row\_number() 是最直接的查数,按顺序1,2,3,4……这样数下来}
    \color{rgba(254, 67, 101, .8)}{如果遇到金额完全一致的数据,他也是会给两个不同的序号}

    \color{rgba(254, 67, 101, .8)}{我们上学学习成绩排名的时候,经常会有并列的情况}
    \color{rgba(254, 67, 101, .8)}{两个99分,并列第一,98分就是第三了}

    \color{rgba(254, 67, 101, .8)}{这样我们只需把row\_number() 换成 rank()}

    \color{rgba(254, 67, 101, .8)}{这样就会输出,1,1,3,4,4,4,7…… 这种排名数据。}

    \color{rgba(254, 67, 101, .8)}{还有一个dense\_rank(),他输出的是,1,1,2,3,3,3,3,4……这种排名数据}
    \color{rgba(254, 67, 101, .8)}{60个人可能30名就是最后一名了,你懂的}

    \color{rgba(254, 67, 101, .8)}{因为我们的练习数据几乎没有重复的,所以排名很不明显。大家可以自己编个成绩数据试一下。 }
    \color{rgba(254, 67, 101, .8)}{窗函数还有个好用数据均分功能。ntile(),要分几组,括号里就写几。 }
    \color{rgba(254, 67, 101, .8)}{这里是均分,前面我们用case进行分组,怎么分,是我们自己设置的条件}
    \color{rgba(254, 67, 101, .8)}{而ntile()可以很方便的均分成n等份}

    \color{rgba(254, 67, 101, .8)}{做一个案例,把所有订单金额均分成5等份,显示客户在第几份}

    select *,
    ntile(5) over (order by order_value desc)
    from orders;
    

    \color{rgba(254, 67, 101, .8)}{ntile()他输出的是1,2,3,4,5,他可以和case合并使用,来给这些数字命名}

    select *,
    (case ntile(5) over (order by order_value desc) 
    when 1 then "a"
    when 2 then "b"
    when 3 then "c"
    else "d"
    end)
    from orders;
    

    \color{rgba(254, 67, 101, .8)}{把刚才的分份的语句,写在 case 和 第一个when 之间,然后When的条件就是1,2,3}
    \color{rgba(254, 67, 101, .8)}{这样合并使用就在均分的同时命名了}
    \color{rgba(254, 67, 101, .8)}{窗函数还有一个很友好的地方}

    select *,
    row_number() over w,
    ntile(5) over w,
    rank() over w
    
    from orders
    window w as (partition by province order by order_value desc);
    

    \color{rgba(254, 67, 101, .8)}{我们要做多个窗函数的时候,每个over后面都写条件,代码很长很累}

    \color{rgba(254, 67, 101, .8)}{可以在整条命令最后,加上window w as() ,括号里写函数,w就是我们定义的变量}

    \color{rgba(254, 67, 101, .8)}{每句窗函数只需要over一个w即可}

    \color{rgba(254, 67, 101, .8)}{除了排名,分类,窗函数更重要的功能,就是非常实用的动态查询}

    \color{rgba(254, 67, 101, .8)}{比如实时汇总最近24小时的交易额等等}

    \color{rgba(254, 67, 101, .8)}{我们详细介绍下}

    \color{rgba(254, 67, 101, .8)}{比如要查询和这个订单的交易金额更少\&最接近的订单的ID}

    select order_id,order_value,
    lag(order_id,1)  over (order by order_value) 
    from orders;
    

    \color{rgba(254, 67, 101, .8)}{用到了lag()函数,就是前n行的数据}

    \color{rgba(254, 67, 101, .8)}{语法是lag( 哪个数据, 前几行,数据为空的话默认值是什么)}

    \color{rgba(254, 67, 101, .8)}{如 lag(order\_id,1,0)这里是order\_id,1的意思就是前1行,2就是前2行依次类推}
    \color{rgba(254, 67, 101, .8)}{前面没有数据的话就填充0}

    \color{rgba(254, 67, 101, .8)}{对应的lead()函数,用法完全一样,就是后N行的数据}

    \color{rgba(254, 67, 101, .8)}{这个函数可以嵌套来求订单金额占前n行的百分比}

    \color{rgba(254, 67, 101, .8)}{窗函数就介绍到这里吧。基本单表查询的内容都接触到了,这篇文章也要结束了}

    \color{rgba(254, 67, 101, .8)}{相信前面做题时很多人都会比较不爽,对用户的分析就是基于名字进行分类汇总,那重名了怎么办}

    \color{rgba(254, 67, 101, .8)}{其实确实是有这个问题}

    \color{rgba(254, 67, 101, .8)}{而在实际工作中,用户也必然有一个唯一的用户ID作为标识的}

    \color{rgba(254, 67, 101, .8)}{一般订单,用户是存在两个table里,一个记录订单信息,一个记录用户信息}

    \color{rgba(254, 67, 101, .8)}{可能还会有产品信息等等很多表格}
    \color{rgba(254, 67, 101, .8)}{我们在查询的时候,就会涉及到跨表查询,多表合并等}
    \color{rgba(254, 67, 101, .8)}{这篇文章为MYSQL入门,没有涉及到跨表的问题}

    \color{rgba(254, 67, 101, .8)}{但其实也非常简单}

    \color{rgba(254, 67, 101, .8)}{这里搞懂了,跨表不过是from那里的事情,一点都不难,完全不用怕,有机会再介绍}

    \color{rgba(254, 67, 101, .8)}{这篇文章就写到这里吧,断断续续写了七八个小时}

    \color{rgba(254, 67, 101, .8)}{相信如果你从头看到尾,一直跟着操作并且做练习题的话}
    \color{rgba(254, 67, 101, .8)}{十个小时总要的,那mysql就算是入门}

    \color{rgba(254, 67, 101, .8)}{虽然还有很多功能没有实践到,但是起码门是入了}
    \color{rgba(254, 67, 101, .8)}{可以操作起来了,mysql是怎么回事,也了解了}

    \color{rgba(254, 67, 101, .8)}{剩下的就是多找案例多练习,遇到问题就百度}

    \color{rgba(254, 67, 101, .8)}{这篇文章不严谨的把mysql和我们熟悉的表格进行类比}
    \color{rgba(254, 67, 101, .8)}{尽量从最浅显的语言,详细的,由浅入深的,抽丝剥茧一样渐渐剥开mysql的面纱}

    \color{rgba(254, 67, 101, .8)}{相信有一定电脑知识的人,就可以入门mysql}

    \color{rgba(254, 67, 101, .8)}{早些年我想学mysql的时候,搜索到的那些文章都给我看的一头雾水}
    \color{rgba(254, 67, 101, .8)}{有的上来就是一通代码,有的上来讲一堆底层原理,搞了好久我才知道}
    \color{rgba(254, 67, 101, .8)}{哦,原来mysql的数据是储存在表格里的}
    \color{rgba(254, 67, 101, .8)}{如果你正想学习mysql的话,希望这篇文章能给你帮助}

    相关文章

      网友评论

          本文标题:mysql12 -- 快速入门mysql

          本文链接:https://www.haomeiwen.com/subject/fufdyctx.html