南京驾校哪家好 mysql 培训,维护 哪家公司好?

&figure&&img src=&https://pic3.zhimg.com/v2-8b190fccec5bdd733eac_b.jpg& data-rawwidth=&1920& data-rawheight=&1047& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic3.zhimg.com/v2-8b190fccec5bdd733eac_r.jpg&&&/figure&&p&索引&/p&&p&
索引常用于快速找出某个列中有一特定值的列。如果不使用索引,MySQL必须从第一条记录开始然后读完整个表知道找出相关的行。表越大,花费的时间越多。(注意,如果需要访问大部分行,则顺序读取要快得多,因为此时应该避免磁盘搜索)&br&&/p&&br&&p&设计索引的原则&/p&&p&
最适合建立索引的列,是出现在where子句中的列,而非select关键字后面的列。&br&&/p&&p&
考虑某列中值的分布。索引的列的基数越大,索引的效果越好。比如,放置生日的列具有很多不同的值,就很容易区分各行,而用来记录性别的列,只含有男女两三个选项,在此设立索引就没有什么意义。&br&&/p&&p&
使用短索引。比如一个列是CHAR(200),但前面十几二十多位可能基数就很大,那么此时就仅对前20位建立索引。&br&&/p&&p&
不要过度索引。会占用额外的磁盘空间,降低写操作的性能,在修改表的同时,索引必须进行更新,有时候可能会重估。MySQL在生成一个执行计划时,要考虑各个索引,这也要花费时间。&br&&/p&&br&&p&建立索引:&/p&&div class=&highlight&&&pre&&code class=&language-sql&&&span&&/span&&span class=&k&&create&/span& &span class=&p&&[&/span&&span class=&n&&uniqe&/span&&span class=&err&&\&/span&&span class=&n&&fulltext&/span&&span class=&err&&\&/span&&span class=&n&&spatial&/span&&span class=&p&&]&/span&&span class=&k&&index&/span& &span class=&n&&indexName&/span&
&span class=&p&&[&/span&&span class=&k&&USING&/span& &span class=&n&&index_type&/span&&span class=&p&&]&/span&
&span class=&k&&on&/span& &span class=&n&&MyISAMTable&/span&&span class=&p&&(&/span&&span class=&n&&name&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&&p&  这里还可以限定一些东西,比如列名name,如果写name(2)[ASC\DESC]就是只对前2位建立索引,按升序\降序排列。&/p&&p&  删除  &/p&&div class=&highlight&&&pre&&code class=&language-sql&&&span&&/span&&span class=&k&&drop&/span& &span class=&k&&index&/span& &span class=&n&&indexName&/span& &span class=&k&&on&/span& &span class=&n&&MyISAMTable&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&br&&p&  针对不同表类型,主要分为&b&BTREE&/b&和&b&HASH&/b&索引&/p&&p&  MyISAM和InnoDB默认创建的都是BTREE,MEMORY默认是使用HASH索引,但也支持BTREE。&/p&&p&HASH:&/p&&ul&&li&  只用于使用 = 或者 &=& 操作符的等式比较。&br&&/li&&li&  优化器不能使用HASH索引来加速ORDER BY操作。&br&&/li&&li&  MySQL不能确定在两个值之间大约有多少行。如果将一个MyISAM表改为HASH索引的MEMORY表,会影响一些查询的执行效率。&br&&/li&&li&  只能使用整个关键字来搜索一行。&br&&/li&&/ul&&br&&p&BTREE:则比较强大了,BETWEEN,!=,或者&&,或者LIKE'pattern'都可以使用相关列上的索引。&/p&&br&&p&  说实话这篇文章写的不好,如果大家想深入了解索引,我推荐下面这篇,由美团编写:&/p&&blockquote&&p&&a href=&http://link.zhihu.com/?target=http%3A//tech.meituan.com/mysql-index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MySQL索引原理及慢查询优化 -&/a&&/p&&/blockquote&&br&&br&&br&&br&&br&&br&&p&视图&/p&&p&
视图是一种虚拟存在的表,你可以通过这样的语句来创建一个视图:&/p&&div class=&highlight&&&pre&&code class=&language-sql&&&span&&/span&&span class=&k&&CREATE&/span& &span class=&p&&[&/span&&span class=&k&&OR&/span& &span class=&n&&PLACE&/span&&span class=&p&&]&/span& &span class=&p&&[&/span&&span class=&n&&ALGORITHM&/span& &span class=&o&&=&/span&&span class=&err&&{&/span&&span class=&n&&UNDERFINED&/span&&span class=&err&&\&/span&&span class=&n&&MERGE&/span&&span class=&err&&\&/span&&span class=&n&&TEMPTABLE&/span&&span class=&err&&}&/span&&span class=&p&&]&/span&
&span class=&k&&VIEW&/span& &span class=&n&&viewName&/span& &span class=&p&&[(&/span&&span class=&n&&column_list&/span&&span class=&p&&)]&/span&
&span class=&k&&AS&/span&
&span class=&n&&selece&/span&&span class=&err&&语句&/span&
&span class=&p&&[&/span&&span class=&k&&WITH&/span& &span class=&p&&[&/span&&span class=&k&&CASCADED&/span&&span class=&err&&\&/span&&span class=&k&&LOCAL&/span&&span class=&p&&]&/span& &span class=&k&&CHECK&/span& &span class=&k&&OPTION&/span& &span class=&p&&]&/span&
&/code&&/pre&&/div&&br&&p&
比如一个简单的例子,创建一个叫testView的视图,来自MyISAMTable,里name以‘ab’开头的记录:&/p&&br&&div class=&highlight&&&pre&&code class=&language-sql&&&span&&/span&&span class=&n&&mysql&/span&&span class=&o&&&&/span&
&span class=&n&&mysql&/span&&span class=&o&&&&/span& &span class=&k&&create&/span& &span class=&k&&view&/span& &span class=&n&&testView&/span& &span class=&k&&as&/span&
&span class=&o&&-&&/span& &span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&myisamtable&/span& &span class=&k&&where&/span& &span class=&n&&name&/span& &span class=&k&&like&/span&&span class=&s1&&'ab%'&/span&&span class=&p&&;&/span&
&span class=&n&&Query&/span& &span class=&n&&OK&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span& &span class=&k&&rows&/span& &span class=&n&&affected&/span& &span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&.&/span&&span class=&mi&&02&/span& &span class=&n&&sec&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&br&&div class=&highlight&&&pre&&code class=&language-sql&&&span&&/span&&span class=&n&&mysql&/span&&span class=&o&&&&/span& &span class=&k&&show&/span& &span class=&n&&tables&/span&&span class=&p&&;&/span&
&span class=&o&&+&/span&&span class=&c1&&--------------------+&/span&
&span class=&o&&|&/span& &span class=&n&&Tables_in_sampledb&/span& &span class=&o&&|&/span&
&span class=&o&&+&/span&&span class=&c1&&--------------------+&/span&
&span class=&o&&|&/span& &span class=&n&&innodb_t&/span&
&span class=&o&&|&/span&
&span class=&o&&|&/span& &span class=&n&&myisamtable&/span&
&span class=&o&&|&/span&
&span class=&o&&|&/span& &span class=&n&&t_login_log&/span&
&span class=&o&&|&/span&
&span class=&o&&|&/span& &span class=&n&&t_user&/span&
&span class=&o&&|&/span&
&span class=&o&&|&/span& &span class=&n&&testview&/span&
&span class=&o&&|&/span&
&span class=&o&&+&/span&&span class=&c1&&--------------------+&/span&
&span class=&mi&&5&/span& &span class=&k&&rows&/span& &span class=&k&&in&/span& &span class=&k&&set&/span& &span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&.&/span&&span class=&mi&&00&/span& &span class=&n&&sec&/span&&span class=&p&&)&/span&
&span class=&n&&mysql&/span&&span class=&o&&&&/span& &span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&testview&/span&&span class=&p&&;&/span&
&span class=&o&&+&/span&&span class=&c1&&----+-------+&/span&
&span class=&o&&|&/span& &span class=&n&&i&/span&
&span class=&o&&|&/span& &span class=&n&&name&/span&
&span class=&o&&|&/span&
&span class=&o&&+&/span&&span class=&c1&&----+-------+&/span&
&span class=&o&&|&/span&
&span class=&mi&&1&/span& &span class=&o&&|&/span& &span class=&n&&abcd&/span&
&span class=&o&&|&/span&
&span class=&o&&|&/span&
&span class=&mi&&2&/span& &span class=&o&&|&/span& &span class=&n&&abcde&/span& &span class=&o&&|&/span&
&span class=&o&&|&/span&
&span class=&mi&&5&/span& &span class=&o&&|&/span& &span class=&n&&abcde&/span& &span class=&o&&|&/span&
&span class=&o&&|&/span&
&span class=&mi&&8&/span& &span class=&o&&|&/span& &span class=&n&&abcde&/span& &span class=&o&&|&/span&
&span class=&o&&|&/span& &span class=&mi&&11&/span& &span class=&o&&|&/span& &span class=&n&&abcde&/span& &span class=&o&&|&/span&
&span class=&o&&|&/span& &span class=&mi&&14&/span& &span class=&o&&|&/span& &span class=&n&&abcde&/span& &span class=&o&&|&/span&
&span class=&o&&|&/span& &span class=&mi&&17&/span& &span class=&o&&|&/span& &span class=&n&&abcde&/span& &span class=&o&&|&/span&
&span class=&o&&|&/span& &span class=&mi&&20&/span& &span class=&o&&|&/span& &span class=&n&&ab&/span&
&span class=&o&&|&/span&
&span class=&o&&|&/span& &span class=&mi&&23&/span& &span class=&o&&|&/span& &span class=&n&&ab&/span&
&span class=&o&&|&/span&
&span class=&o&&+&/span&&span class=&c1&&----+-------+&/span&
&span class=&mi&&9&/span& &span class=&k&&rows&/span& &span class=&k&&in&/span& &span class=&k&&set&/span& &span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&.&/span&&span class=&mi&&00&/span& &span class=&n&&sec&/span&&span class=&p&&)&/span&
&span class=&n&&mysql&/span&&span class=&o&&&&/span&
&/code&&/pre&&/div&&br&&p&
可以看到,我之后show table的时候,这个视图也会出现。视图相对于普通表的优势是:&/p&&p&&strong&简单&/strong&:使用视图的用户不需要关心后面对应的表的结构、关联条件、筛选条件,这是一个过滤好的符合条件的结果集。&/p&&p&&strong&安全&/strong&:使用一个视图的用户只能看到特定的行与列,这种权限限制是表权限管理无法做到的。&/p&&p&&strong&数据独立&/strong&:一旦视图的结构确定,可以屏蔽表结构变化对用户的影响,原表增加列对于视图没有影响。但当原表修改列名的时候,要修改视图。原表增删改数据,视图也会自动更新。&/p&&br&&p&
Mysql对于视图的定义有一定的限制,比如,from关键字后不能跟子查询。&/p&&p&
同时,视图的可更新性,跟视图中查询的定义有关系,以下类型的视图就不可更新(不可对该视图进行update操作):&/p&&ul&&li&常量视图&br&&/li&&li&select包含子查询&br&&/li&&li&join&br&&/li&&li&from一个不可更新的时候&br&&/li&&li&where子句的子查询引用了from字句中的表。&br&&/li&&/ul&&br&&br&&br&&p&
另外,在创建时,可以指定WITH LOCAL CHECK OPTION或者WITH CASCADED CHECK OPTION,前者的意思是,只要满足本视图的条件就可以更新,而后者要求满足针对该视图的,所有视图的条件,才可以更新。默认是CASCADED&/p&&br&&p&
举个例子,有一张表T,里面放着2个班学生分数,从T中创建一个视图V1,可以看到80分以上的同学(&b&条件是&=80分&/b&);再从V1中创建一个视图V2,可以看到V1中,1班的同学的分数(&b&条件是班级&/b&)。即,V1有2个班80分以上的同学,而V2有1班80分以上的同学(&b&这个隐含的80分的限制来自于V1&/b&)。&/p&&p&
假设V1是LOCAL的,V2是CASCADED的。&/p&&p&
那么,你不能把V1中某个同学的分数改到80分以下,这样就会脱离这个视图。对于V2,来说,你既不能改一个同学的班级,把他改为2班,也不能把他的成绩改为80分以下,因为它是级联的(CASCADED)&/p&&br&&p&
可以通过drop view viewName指令删除视图,show create view viewName \G来查看视图定义。&/p&&br&&p&
最后,关于权限:&/p&&ul&&li&
创建视图需要有CREATE VIEW的权限,并且对于查询涉及的列具有SELECT权限。&br&&/li&&li&
如果使用CREATE OR REPLACE 或者ALTER修改视图,则还需要有该视图的DROP权限。&br&&/li&&li&
删除视图,也需要该视图的DROP权限。&br&&/li&&/ul&&br&&br&&p&
希望对你有帮助。&/p&
索引 索引常用于快速找出某个列中有一特定值的列。如果不使用索引,MySQL必须从第一条记录开始然后读完整个表知道找出相关的行。表越大,花费的时间越多。(注意,如果需要访问大部分行,则顺序读取要快得多,因为此时应该避免磁盘搜索) 设计索引的原则 最…
&figure&&img src=&https://pic4.zhimg.com/v2-3c6da9832cc55eafe1af_b.jpg& data-rawwidth=&1920& data-rawheight=&566& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic4.zhimg.com/v2-3c6da9832cc55eafe1af_r.jpg&&&/figure&&h2&&b&一、前言&/b&&/h2&&p&
本文主要介绍下MySQL相关的索引、SQL优化方式(查看执行计划和慢查询日志)、触发器和约束、存储过程和函数、视图等内容。&/p&&h2&&b&二、索引&/b&&/h2&&p&&b&2.1 &/b&&b&概述&/b&&/p&&p&
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。&/p&&p&
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。&/p&&p&
索引会保存在额外的文件中。&/p&&p&&b&2.2 优缺点&/b&&/p&&ul&&li&优点&br&&/li&&ul&&li&大大加快数据的检索速度;&/li&&li&创建唯一性索引,保证数据库表中每一行数据的唯一性;&/li&&li&加速表和表之间的连接;&/li&&li&在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。&/li&&/ul&&li&缺点&br&&/li&&ul&&li&索引需要占物理空间。&/li&&li&当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。&/li&&/ul&&/ul&&br&&p&&b&2.3 索引类型&/b&&/p&&p&
根据数据库的功能,可以在数据库设计器中创建五种索引:普通索引、唯一索引、主键索引、聚集索引和全文索引。&/p&&ul&&li&普通索引:仅加速查询。&br&&/li&&li&唯一索引:加速查询 + 列值唯一(可以有null)。&br&&/li&&li&主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null)。&br&&/li&&li&组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。&br&&/li&&li&全文索引:对文本的内容进行分词,进行搜索。&br&&/li&&/ul&&br&&p&
注:表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引(新版本MYSQL5.6的InnoDB支持全文索引);字段类型:char、varchar和text。&/p&&p&&b&2.3.1普通索引&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 创建表 + 索引
create table table_name(
id bigint(10) not null auto_increment primary key,
name varchar(32) not null,
extra text,
index idx_name (name)
# 创建索引
create index idx_name on table_name(column_name)
# 删除索引
drop idx_name on table_
# 查看索引
show index from table_
&/code&&/pre&&/div&&p&
注意:对于创建索引时如果是BLOB 和 TEXT 类型,必须指定length。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&create index ix_extra on in1(extra(32));
&/code&&/pre&&/div&&p&
默认情况下,InnoDB 引擎单一字段索引的长度最大为 767 字节,同样的,前缀索引也有同样的限制。当使用 UTF-8 字符集,每一个字符使用 3 字节来存储,在 TEXT 或者 VARCHAR 类型的字段上建立一个超过 255 字符数的前缀索引时就会遇到问题。&/p&&p&
可以启用服务器选项 innodb_large_prefix 使得这个限制增加到 3072 字节,而且表的 row_format 需要使用 compressed 或者 dynamic。&/p&&p&&b&2.3.2 唯一索引&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 创建表 + 唯一索引
create table table_name(
id bigint(10) not null auto_increment primary key,
name varchar(32) not null,
extra text,
unique uk_name (name)
# 创建唯一索引
create unique index uk_name on table_name(column_name)
# 删除唯一索引
drop unique index uk_name on table_name
&/code&&/pre&&/div&&p&&b&2.3.3 主键索引&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 创建表 + 创建主键
create table table_name(
id bigint(10) not null auto_increment primary key,
name varchar(32) not null,
extra text,
index idx_name (name)
# 创建主键
alter table table_name add primary key(name);
# 删除主键
alter table table_n
alter table table_name modify id bigint,
&/code&&/pre&&/div&&p&&b&2.3.4 组合索引&/b&&/p&&p&
组合索引是多个列组合成一个索引来查询。&/p&&p&
应用场景:频繁的同时使用多列来进行查询,如:where name = 'nick' and age = 18。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 创建表
create table mess(
nid bigint(10)not null auto_increment primary key,
name varchar(32) not null,
age int not null
# 创建组合索引
create index idx_name_age on mess(name,age);
&/code&&/pre&&/div&&p&&b& 注一:&/b&如上创建组合索引之后,查询一定要注意。&br&&/p&&p&
name and email——使用索引,name一定要放前面&/p&&p&
name——使用索引&/p&&p&
email——不使用索引&/p&&p&&b&注二:&/b&同时搜索多个条件时,组合索引的性能效率好过于多个单一索引合并。&/p&&p&&b&2.4 常用命令&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 查看索引
show index from 表名
# 查看执行时间
set profiling = 1;
# 开启profiling
# 执行SQL语句
# 查看结果
&/code&&/pre&&/div&&p&&b&2.5 索引失效的几种情况&/b&&/p&&ul&&li&如果条件中有or,并且有未建立索引的列,即使其中有条件带索引也不会使用。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。&/li&&li&对于组合索引,不是使用的第一部分,则不会使用索引。&br&&/li&&ul&&li&如果组合索引为:(name,email),查询使用:&/li&&li&name and email——使用索引,&/li&&li&name——使用索引,&/li&&li&email——不使用索引。&/li&&/ul&&li&like查询是以%开头。&br&&/li&&li&使用函数,避免对列使用函数。&br&&/li&&li&类型不一致,如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。&br&&/li&&li&!=,不等于。注意:如果是主键,则还是会走索引。&/li&&li&&,大于。注意:如果是主键或索引是整数类型,则还是会走索引。&/li&&li&order by,当根据索引排序时候,选择的映射如果不是索引,则不走索引。注意:如果对主键排序,则还是走索引。&/li&&li&如果mysql估计使用全表扫描要比使用索引快,则不使用索引。&br&&/li&&/ul&&p&&b&2.6 一般约定&/b&&/p&&ul&&li&避免使用select *,count(1)或count(列) 代替 count(*)&br&&/li&&li&组合索引代替多个单列索引(经常使用多个条件查询时)&br&&/li&&li&尽量使用短索引&br&&/li&&li&使用连接(JOIN)来代替子查询(Sub-Queries)&br&&/li&&li&索引散列值(重复少)不适合建索引,例:性别不适合&/li&&/ul&&br&&h2&三、SQL优化方式&/h2&&p&&b&3.1 查看执行计划&/b&&/p&&p&
explain + 查询SQL
用于显示SQL执行信息参数,根据参考信息可以进行SQL优化。&/p&&ul&&li&id&br&&/li&&ul&&li&包含一组数字,表示查询中执行select子句或操作表的顺序。&/li&&li&id相同,执行顺序由上至下。&/li&&li&如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。&/li&&li&id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。&/li&&/ul&&li&select_type&br&&/li&&ul&&li&表示查询中每个select子句的类型(简单 OR复杂)。&/li&&li&包含:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION和UNION RESULT。&/li&&ul&&li&SIMPLE:查询中不包含子查询或者UNION。&/li&&li&PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY。&/li&&li&SUBQUERY:在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY。&/li&&li&DERIVED:在FROM列表中包含的子查询被标记为:DERIVED(衍生)&/li&&li&UNION:若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在
FROM子句的子查询中,外层SELECT将被标记为:DERIVED。&/li&&li&UNION RESULT:从UNION表获取结果的SELECT被标记为:UNION RESULT。&/li&&/ul&&/ul&&/ul&&li&Table&/li&&ul&&li&查询的表名。&/li&&/ul&&li&Type&/li&&ul&&li&表示MySQL在表中找到所需行的方式,又称“访问类型”,常见类型包括:由左至右,由最差到最好。&/li&&br&&li&ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行。&/li&&li&index:Full Index Scan,index与ALL区别为index类型只遍历索引树&/li&&li&range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、&、&等的查询。&/li&&li&ref:非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找。&/li&&li&eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。&/li&&li&const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。&/li&&li&system是const类型的特例,当查询的表只有一行的情况下, 使用system。&/li&&li&NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引。&/li&&/ul&&br&&ul&&li&Key&br&&/li&&ul&&li&显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。&/li&&li&TIPS:查询中若使用了覆盖索引,则该索引仅出现在key列表中。&/li&&/ul&&li&key_len&br&&/li&&ul&&li&表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。&/li&&li&key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。&/li&&/ul&&li&ref&br&&/li&&ul&&li&表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。&/li&&/ul&&li&rows&br&&/li&&ul&&li&表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。&/li&&/ul&&li&Extra&/li&&ul&&li&包含不适合在其他列中显示但十分重要的额外信息。&/li&&ul&&li&Using index&/li&&/ul&&/ul&&/ul&&br&&p&
该值表示相应的select操作中使用了覆盖索引(Covering Index)&/p&&ul&&ul&&ul&&li&TIPS:覆盖索引(Covering Index)&/li&&/ul&&/ul&&/ul&&br&&p&
MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件。包含所有满足查询需要的数据的索引称为覆盖索引(Covering Index)。&/p&&p&
注意:&/p&&p&
如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降&/p&&ul&&ul&&ul&&li&Using where&/li&&/ul&&/ul&&/ul&&br&&p&
表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),如果查询未能使用索引,Using where的作用只是提醒我们MySQL将用where子句来过滤结果集。&/p&&ul&&ul&&ul&&li&Using temporary&/li&&/ul&&/ul&&/ul&&br&&p&
表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询。&/p&&ul&&ul&&ul&&li&Using filesort&/li&&/ul&&/ul&&/ul&&br&&p&
MySQL中无法利用索引完成的排序操作称为“文件排序”。&/p&&p&&b&3.2 MySQL执行计划的局限&/b&&/p&&ul&&li&EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况。&br&&/li&&li&EXPLAIN不考虑各种Cache。&br&&/li&&li&EXPLAIN不能显示MySQL在执行查询时所作的优化工作。&br&&/li&&li&部分统计信息是估算的,并非精确值。&br&&/li&&li&EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。&br&&/li&&/ul&&br&&p&&b&3.3 慢日志开启和查询(Linux)&/b&&/p&&p&&b&3.3.1 为什么要开启这个查询&/b&&/p&&p&
mysql中最影响速度的就是那些查询非常慢的语句,这些慢的语句,可能是写的不够合理或者是大数据下多表的联合查询等等。我们要找出这些语句,分析原因,加以优化。&/p&&p&&b&3.3.2 配置MySQL自动记录慢日志&/b&&/p&&ul&&li&方法一:用命令开启慢查询&br&&/li&&/ul&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&mysql& show variables like &%long%&;
//查看一下默认为慢查询的时间10秒
+-----------------+-----------+
| Variable_name
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
mysql& set global long_query_time=2;
//设置成2秒,加上global,下次进mysql已然生效
Query OK, 0 rows affected (0.00 sec)
mysql& show variables like &%slow%&;
//查看一下慢查询是不是已经开启
+---------------------+---------------------------------+
| Variable_name
+---------------------+---------------------------------+
| log_slow_queries
| slow_launch_time
| slow_query_log
| slow_query_log_file | /usr/local/mysql/mysql-slow.log |
+---------------------+---------------------------------+
4 rows in set (0.00 sec)
mysql& set slow_query_log='ON';
//加上global,不然会报错的。
ERROR 1229 (HY000): Variable 'slow_query_log' is a GLOBAL variable and should be set with SET GLOBAL
mysql& set global slow_query_log='ON';
//启用慢查询
Query OK, 0 rows affected (0.28 sec)
mysql& show variables like &%slow%&;
//查看是否已经开启
+---------------------+---------------------------------+
| Variable_name
+---------------------+---------------------------------+
| log_slow_queries
| slow_launch_time
| slow_query_log
| slow_query_log_file | /usr/local/mysql/mysql-slow.log |
+---------------------+---------------------------------+
4 rows in set (0.00 sec)
&/code&&/pre&&/div&&ul&&li&方法二:修改mysql的配置文件my.cnf,没有则添加&br&&/li&&/ul&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&slow_query_log = OFF
# 是否开启慢日志记录
long_query_time = 2
# 时间限制,超过此时间,则记录
slow_query_log_file = /usr/slow.log
# 日志文件
log_queries_not_using_indexes = OFF
# 为使用索引的搜索是否记录
记得要重启mysql。
&/code&&/pre&&/div&&p&&b&注:&/b&方法一重启mysql之后会恢复默认值,方法二重启依然生效。&/p&&p&&b&3.3.3 查看MySQL慢日志&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&mysql& show variables like &%slow%&;
//查看慢查询文件
+---------------------+---------------------------------+
| Variable_name
+---------------------+---------------------------------+
| log_slow_queries
| slow_launch_time
| slow_query_log
| slow_query_log_file | /usr/local/mysql/mysql-slow.log |
+---------------------+---------------------------------+
复制 /usr/local/mysql/mysql-slow.log 文件到指定目录,通过pt-query-digest 分析慢查询。
root@iZ28agnebgjZ:~#pt-query-digest mysql-slow.log & slow_report.log
&/code&&/pre&&/div&&h2&四、触发器和约束&/h2&&p&
数据库中提供了两种主要机制来强制使用业务规则和数据完整性,它们是约束和触发器。触发器其实就是一个特殊类型的存储过程,可以在执行某个操作时自动触发。触发器与约束都可以实现数据的一致性。&/p&&p&
触发器可以实现约束的一切功能。约束主要被用于强制数据的完整性,约束也能提供比触发器更好的性能。在考虑数据一致性问题的时候,首先要考虑通过约束来实现。如果约束无法完成的功能,则再通过触发器来解决。两者从功能上来说,他们的关系如下图所示:&/p&&p&&b&4.1 触发器&/b&&/p&&p&
对某个表进行【增/删/改】操作的前后触发一些操作即为触发器,如果希望触发增删改的行为之前或之后做操作时,可以使用触发器,触发器用于自定义用户对表的行进行【增/删/改】前后的行为。&/p&&p&&b&4.1.1 基本语法&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name
FOR EACH ROW trigger_stmt
&/code&&/pre&&/div&&p&其中:&/p&&p&trigger_name:标识触发器名称,用户自行指定;&/p&&p&trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;&/p&&p&trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;&/p&&p&table_name:标识建立触发器的表名,即在哪张表上建立触发器;&/p&&p&trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。&/p&&p&trigger_time和trigger_event组合,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。&/p&&p&&b&4.1.2 删除触发器&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&DROP TRIGGER trigger_
&/code&&/pre&&/div&&p&&b&4.2 约束&/b&&/p&&p&
常用有五类约束。&/p&&p&
not null:非空约束,指定某列不为空。 &/p&&p&
unique: 唯一约束,指定某列和几列组合的数据不能重复。 &/p&&p&
primary key:主键约束,指定某列的数据不能重复、唯一。 &/p&&p&
foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据。 &/p&&p&
check:检查,指定一个表达式,用于检验指定数据。 &/p&&p&&b&注意: &/b&MySQL不支持check约束,但可以使用check约束,而没有任何效果。 &/p&&p&
根据约束数据列限制,约束可分为两种。&/p&&p&
单列约束:每个约束只约束一列。 &/p&&p&
多列约束:每个约束约束多列数据。&/p&&p&&b&4.2.1 基本语法&/b&&/p&&ul&&li&not null约束&br&&/li&&ul&&li&非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。&/li&&li&Null类型特征:所有的类型的值都可以是null,包括int、float 等数据类型。&/li&&/ul&&/ul&&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 增加非空约束
alter table temp modify sex varchar(2)
# 取消非空约束
alter table temp modify sex varchar(2)
&/code&&/pre&&/div&&ul&&li&unique约束&br&&/li&&ul&&li&唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。&/li&&li&唯一约束不允许出现重复的值,但是可以为多个null。&/li&&li&同一个表可以有多个唯一约束,多个列组合的约束。&/li&&li&在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。&/li&&li&唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。&/li&&li&MySQL会给唯一约束的列上默认创建一个唯一索引。&/li&&/ul&&/ul&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 添加唯一约束
alter table temp add unique (name, password);
alter table temp modify name varchar(25)
# 删除约束
alter table
&/code&&/pre&&/div&&ul&&li&primary key约束&br&&/li&&ul&&li&主键约束相当于“唯一约束 + 非空约束“的组合,主键约束列不允许重复,也不允许出现空值。&/li&&li&每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。&/li&&li&当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。&/li&&/ul&&/ul&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# alter添加主键约束
alter table temp add primary key(name, pwd);
# alter删除主键约束
alter table t
&/code&&/pre&&/div&&ul&&li&foreign key约束&br&&/li&&/ul&&br&&p&
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。&/p&&p&
提示:现在基本都不在数据库做外键约束啦。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 增加外键约束
alter table student add foreign key(classes_name, classes_number) references classes(name, number);
# 删除外键约束
alter table student drop foreign key student_idfk_1;
alter table student drop foreign key fk_student_
&/code&&/pre&&/div&&ul&&li&check约束&br&&/li&&/ul&&br&&p&
MySQL可以使用check约束,但check约束对数据验证没有任何作用。&/p&&h2&五、存储过程和函数&/h2&&p&
在本质上它们都是存储程序。&/p&&p&
函数只能通过 return 语句返回单个值或表对象;而存储过程不允许执行 return,但可以通过OUT参数返回多个值。&/p&&p&
函数限制比较多,不能用临时表,只能用表变量,还有一些函数都不可用等等;而存储过程的限制相对就比较少。&/p&&p&
函数可以嵌入在SQL语句中使用,可以在SELECT语句中作为查询语句的一个部分调用;而存储过程一般是作为一个独立的部分来执行。&/p&&h2&六、视图&/h2&&p&
视图是查询命令结果构成的一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集合,并可以当作表来查询使用。&/p&&h2&七、参考资料&/h2&&ul&&li&7.1 索宁,视图、存储过程、函数、索引全解析&br&&/li&&/ul&&br&&p&&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s/XTU_36U0YpOu0oxOgyFmvg& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&mp.weixin.qq.com/s/XTU_&/span&&span class=&invisible&&36U0YpOu0oxOgyFmvg&/span&&span class=&ellipsis&&&/span&&/a&&/p&&ul&&li&7.2 百度百科,触发器&br&&/li&&/ul&&br&&p&&a href=&http://link.zhihu.com/?target=http%3A//baike.baidu.com/link%3Furl%3DQc_Erc03ATRfSDR_7SzM9HNnXQ70kMPjTQ13JCpkNjs4LfgFODB_ZizvB2652wAlOG-FDd9ZvPp2Q0axIFk-ylPZJ0k4FNmQiy7_Rx6l9QYKd2vTjf2yfhzIekFIi2bu& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&baike.baidu.com/link?&/span&&span class=&invisible&&url=Qc_Erc03ATRfSDR_7SzM9HNnXQ70kMPjTQ13JCpkNjs4LfgFODB_ZizvB2652wAlOG-FDd9ZvPp2Q0axIFk-ylPZJ0k4FNmQiy7_Rx6l9QYKd2vTjf2yfhzIekFIi2bu&/span&&span class=&ellipsis&&&/span&&/a&&/p&&ul&&li&7.3 yuyue2014 索引长度的限制&br&&/li&&/ul&&br&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.cnblogs.com/yuyue2014/p/4339090.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&cnblogs.com/yuyue2014/p&/span&&span class=&invisible&&/4339090.html&/span&&span class=&ellipsis&&&/span&&/a&&/p&&ul&&li&7.4 简单,可复制,MySQL执行计划解读&/li&&/ul&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.cnblogs.com/ggjucheng/archive//2765237.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&cnblogs.com/ggjucheng/a&/span&&span class=&invisible&&rchive//2765237.html&/span&&span class=&ellipsis&&&/span&&/a&&/p&
一、前言 本文主要介绍下MySQL相关的索引、SQL优化方式(查看执行计划和慢查询日志)、触发器和约束、存储过程和函数、视图等内容。二、索引2.1 概述 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个…
如果你有耐心坚持个一年以上的话, 我会推荐HTML, css ,js, apache ,php, mysql&br&&br&后三者是需要装软件的, 推荐wamp, 绝佳的一站式环境配置, &a href=&//link.zhihu.com/?target=http%3A//www.wampserver.com/en/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WampServer, the web development platform on Windows&/a&
直接包括了apache, php, mysql三个软件, 省的自己一个一个装.&br&有不少人在评论里问mac os下对应的软件, 这里补充一下: &a href=&//link.zhihu.com/?target=http%3A//www.apachefriends.org/zh_cn/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&XAMPP Installers and Downloads for Apache Friends&/a&&br&&br&&ol&&li&首先学习HTML, css, 这两个东西是一套的, 非常容易理解, 把w3school上面的教程过一遍就会了, 记住要一个个过, 千万不要偷懒, 一旦开始偷懒, 你会越来越偷懒, 最后什么都没学成. &a href=&//link.zhihu.com/?target=http%3A//w3school.com.cn/html/index.asp& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&HTML 教程&/a& ,
&a href=&//link.zhihu.com/?target=http%3A//w3school.com.cn/css/index.asp& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS 教程&/a&&/li&&li&下一步是学js, js相比前两个会难的多, 因为js才是一门正式的编程语言, 同样, w3school的教程全过一遍, &a href=&//link.zhihu.com/?target=http%3A//w3school.com.cn/js/index.asp& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript 教程&/a& , 教程过完了就可以买书看了, 强烈推荐一本超好入门书: &a href=&//link.zhihu.com/?target=http%3A//item.jd.com/.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《JavaScript DOM编程艺术(第2版)》(Jeremy Keith,Jeffrey Sambells)【摘要 书评 试读】&/a& , 认真学, 多看, 看完之后学jquery, 这个时候你基本能够了解语言库了, jquery 也直接过一遍w3school的教程, &a href=&//link.zhihu.com/?target=http%3A//w3school.com.cn/jquery/index.asp& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&jQuery 教程&/a& . jquery会了, 基本上你网页开发前端就已经入门了, 如果你学的扎实, 反复的看, 其实你就可以胜任前端开发的工作了, 不过浏览器兼容性还是解决不了的, 不过你目标不是前端工程师, 浏览器的兼容性不了解也无所谓.&/li&&li&在第二步你学习js的时候, 你可能就接触一些后端的东西, 没错, 就是ajax. 这个是需要后端返回数据的. 这个时候你要开始学习php了, 入门php相比于js会更麻烦一些, 因为运行php需要有很多细节要处理, 所以一本好的入门书籍是非常重要的, 这个w3school上面的php帮不了什么忙了, 推荐一本书: &a href=&//link.zhihu.com/?target=http%3A//item.jd.com/.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《php和mysql web开发(原书第4版)》([澳]威利,[澳]汤姆森)【摘要 书评 试读】&/a& , 当然, 这过程中你会遇到各种各样的问题, 但是如果你学到了这一步, 非常欢迎你私信我来学习, 我绝对帮助, 现在肯学习的孩子太少了, 而且题主才上高中, 太难能可贵了. &/li&&li&一些注意点, 学习HTML, css, js的时候, 只要有浏览器就够了, 不需要装wamp, 编辑器推荐sublime, 多用google, 多敲代码, 尤其是多敲代码非常重要, 不敲代码你什么都学不会. 其他的想起来再补充吧.&/li&&/ol&&br&对于那些说加入xxx阵营的, 不要理他们, 直接在win上面学, php和apache对win的兼容性非常好, 完全可以从入门学到精通都无需碰linux. 当然, 如果你网站最终上线的话, 还是需要接触linux服务器进行部署. 这个到需要部署的时候再说, 提前接触linux就是浪费时间.
如果你有耐心坚持个一年以上的话, 我会推荐HTML, css ,js, apache ,php, mysql 后三者是需要装软件的, 推荐wamp, 绝佳的一站式环境配置,
直接包括了apache, php, mysql三个软件, 省的自己一个一个装. …
谢邀。&br&-----------------------------------------------------------------------------------------------&br&你想往后台开发方向发展,所以不需要你把数据库研究很透彻,会用SQL、会一些基本的MySQL操作即可。如果想往MySQL DBA方向发展,可以参考下文。&br&&br&MySQL学习路线(针对DBA)&br&1.深入学习SQL;&br&2.了解MySQL 体系结构、MySQL 安全、MySQL 监控与运维、MySQL 备份与恢复、MySQL 集群、MySQL 操作与管理、MySQL
架构等等,这里面有很多知识,本人也在学习中,就不展开了;&br&3.在实践中提高,多总结,多积累。&br&&br&推荐书籍:&br&1.《MySQL技术内幕:SQL编程》&br&2.《高性能MySQL》&br&3.《MySQL技术内幕》&br&4.&a href=&//link.zhihu.com/?target=http%3A//book.douban.com/doulist/247779/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MySQL DBA 推荐书籍&/a&&br&&br&推荐网站:&br&1.国内各大技术论坛,比如CSDN、ITPUB、51CTO;&br&2.MySQL官方网站;&br&3.StackOverFlow、开源中国;&br&4.&a href=&//link.zhihu.com/?target=http%3A//blog.jobbole.com/1093/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&推荐15个有价值的MySQL教程网站&/a&
谢邀。 ----------------------------------------------------------------------------------------------- 你想往后台开发方向发展,所以不需要你把数据库研究很透彻,会用SQL、会一些基本的MySQL操作即可。如果想往MySQL DBA方向发展,可以参考下文。 M…
&figure&&img src=&https://pic3.zhimg.com/v2-14f1ab89_b.jpg& data-rawwidth=&500& data-rawheight=&386& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic3.zhimg.com/v2-14f1ab89_r.jpg&&&/figure&&blockquote&&p&本文是&a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何快速成为数据分析师&/a&的第十篇教程,如果想要了解写作初衷,可以先行阅读七周指南。温馨提示:如果您已经熟悉数据库,大可不必再看这篇文章,或只挑选部分。&/p&&/blockquote&&br&&p&在《&a href=&https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMjM5NjEyMDI2MQ%3D%3D%26mid%3D%26idx%3D1%26sn%3D38b912a77af98efe541bb53dechksm%3Dbffc73ef2cb6b08ec4scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&写给新人的数据库指南&/a&》,我们已经成功的安装数据库,并且导入数据,今天进入MySQL的实战练习。SQL是数据库的查询语言,语法结构简单,相信本文会让你从入门到熟练。&/p&&p&掌握SQL后,不论你是产品经理、运营人员或者数据分析师,都会让你分析的能力边界无限拓展。别犹豫了,赶快上车吧!&/p&&p&以下的语句都在SequelPro的Query页面运行,其他操作页面不会有太大差异。标点符号必须为英文,这是新人很容易犯的错误。&/p&&p&SQL最小化的查询结构如下:&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&k&&column&/span& &span class=&k&&from&/span& &span class=&k&&table&/span&
&/code&&/pre&&/div&&p&table是我们的表名,column是我们想要查询的字段/列,column可以用 * 代替,指代全部字段,意为从table表查询所有数据。&/p&&p&where 是基础查询语法,用于条件判断。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&where&/span& &span class=&n&&city&/span& &span class=&o&&=&/span& &span class=&s1&&'上海'&/span&
&/code&&/pre&&/div&&p&上图是最简化的查询语句,将所有城市为上海的职位数据过滤出来。我们也可以用 and 进行多条件判断。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&where&/span& &span class=&n&&city&/span& &span class=&o&&=&/span& &span class=&s1&&'上海'&/span& &span class=&k&&and&/span& &span class=&n&&positionName&/span& &span class=&o&&=&/span& &span class=&s1&&'数据分析师'&/span&
&/code&&/pre&&/div&&p&or 语句则是或的关系&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&where&/span& &span class=&n&&city&/span& &span class=&o&&=&/span& &span class=&s1&&'上海'&/span& &span class=&k&&or&/span& &span class=&n&&positionName&/span& &span class=&o&&=&/span& &span class=&s1&&'数据分析师'&/span&
&/code&&/pre&&/div&&p&查找城市为上海,或者职位名称是数据分析师的数据,它们是并集。&/p&&p&当我们涉及到非常复杂的与或逻辑判断,应该怎么办?比如即满足条件AB,又要满足条件C,或者是满足条件DE。此时需要用括号明确逻辑判断的优先级。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&where&/span& &span class=&p&&(&/span&&span class=&n&&city&/span& &span class=&o&&=&/span& &span class=&s1&&'上海'&/span& &span class=&k&&and&/span& &span class=&n&&positionName&/span& &span class=&o&&=&/span& &span class=&s1&&'数据分析师'&/span&&span class=&p&&)&/span&
&span class=&k&&or&/span& &span class=&p&&(&/span&&span class=&n&&city&/span& &span class=&o&&=&/span& &span class=&s1&&'北京'&/span& &span class=&k&&and&/span& &span class=&n&&positionName&/span& &span class=&o&&=&/span& &span class=&s1&&'数据产品经理'&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&这条语句的含义是查找出上海的数据分析师或者是北京的产品经理。当有括号时,会优先进行括号内的判断,当有多个括号时,对最内层括号先进行判断,然后依次往外。&/p&&p&接下来的问题来了,当我们要查询多个条件,比如北京上海广州深圳南京这些城市,难道一个个用and关联起来?这太麻烦了,我们可以使用 in 。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&where&/span& &span class=&n&&city&/span& &span class=&k&&in&/span& &span class=&p&&(&/span&&span class=&s1&&'北京'&/span&&span class=&p&&,&/span&&span class=&s1&&'上海'&/span&&span class=&p&&,&/span&&span class=&s1&&'广州'&/span&&span class=&p&&,&/span&&span class=&s1&&'深圳'&/span&&span class=&p&&,&/span&&span class=&s1&&'南京'&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&当我们遇到字段数据类型是数值时,也可以使用符号& 、&=、& 、&=、!= 进行逻辑判断,!= 指的是不等于,等价于 && 。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&where&/span& &span class=&n&&companyId&/span& &span class=&o&&&=&/span& &span class=&mi&&10000&/span&
&/code&&/pre&&/div&&p&上例是筛选出公司ID &= 10000的职位,为数值时,不需要像字符串一样加引号。&/p&&p&当我们需要取区间数值时,使用 between and&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&where&/span& &span class=&n&&companyId&/span& &span class=&k&&between&/span& &span class=&mi&&10000&/span& &span class=&k&&and&/span& &span class=&mi&&20000&/span&
&/code&&/pre&&/div&&p&between and 包括数值两端的边界,等同于 companyId &=10000 and companyId &= 20000。&/p&&p&如果要模糊查找,能用like。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&where&/span& &span class=&n&&positionName&/span& &span class=&k&&like&/span& &span class=&s1&&'%数据分析%'&/span&
&/code&&/pre&&/div&&p&语句的含义是在positionName列查找包含「数据分析」字段的数据,%代表的是通配符,含义是无所谓「数据分析」前面后面是什么内容。如果是 '数据分析%' ,则代表字段必须以数据分析开头,无所谓后面是什么。&/p&&p&除了上面所讲,还有一个常用的语法是not,代表逻辑的逆转,常见not in、not like、not null等。&/p&&p&接下来我们学习group by,它是数据分析中常见的语法,目的是将数据按组/维度划分。类似于Excel中的数据透视表,我们以city为例。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&o&&*&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&group&/span& &span class=&k&&by&/span& &span class=&n&&city&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic2.zhimg.com/v2-9cbfe856b9a539c999579fb_b.jpg& data-rawwidth=&1474& data-rawheight=&828& class=&origin_image zh-lightbox-thumb& width=&1474& data-original=&https://pic2.zhimg.com/v2-9cbfe856b9a539c999579fb_r.jpg&&&/figure&&p&它将城市划分成几组,通过group by 可以快速的浏览数据有哪些城市。我们看一下它的高阶用法。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&nf&&count&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&group&/span& &span class=&k&&by&/span& &span class=&n&&city&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic4.zhimg.com/v2-f6cda86ccc96872dca65c77ccd507ccd_b.jpg& data-rawwidth=&964& data-rawheight=&832& class=&origin_image zh-lightbox-thumb& width=&964& data-original=&https://pic4.zhimg.com/v2-f6cda86ccc96872dca65c77ccd507ccd_r.jpg&&&/figure&&p&上述语句,使用count函数,统计计数了每个城市拥有的职位数量。括号里面的1代表以第一列为计数标准。这里出现新的问题,当我们遇到重复数据怎么办?在DataAnalyst 这张表中,北京职位包含重复的职位ID,我们需要去重。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&nf&&count&/span&&span class=&p&&(&/span&&span class=&k&&distinct&/span& &span class=&n&&positionId&/span&&span class=&p&&)&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&group&/span& &span class=&k&&by&/span& &span class=&n&&city&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic4.zhimg.com/v2-40d873fc284c788ab6263_b.jpg& data-rawwidth=&926& data-rawheight=&840& class=&origin_image zh-lightbox-thumb& width=&926& data-original=&https://pic4.zhimg.com/v2-40d873fc284c788ab6263_r.jpg&&&/figure&&p&北京的数据一下子少了2000,多余的重复值被排除在外。distinct 是去重函数,distinct positionId 会只计算唯一的positionId个数。日常工作中,活跃用户数、文章UV,都是用distinct 计算获得,这是唯一标示符ID的重要作用。&/p&&p&除了count,还有max,min,sum,avg等函数,也叫做聚合函数。用法和Excel没什么区别。&/p&&p&当我们在group by 添加多个字段,它将以多维的形式进行数据聚合。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&n&&workYear&/span&&span class=&p&&,&/span&&span class=&nf&&count&/span&&span class=&p&&(&/span&&span class=&k&&distinct&/span& &span class=&n&&positionId&/span&&span class=&p&&)&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&group&/span& &span class=&k&&by&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&n&&workYear&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic3.zhimg.com/v2-dfc1e5b795cd_b.jpg& data-rawwidth=&938& data-rawheight=&748& class=&origin_image zh-lightbox-thumb& width=&938& data-original=&https://pic3.zhimg.com/v2-dfc1e5b795cd_r.jpg&&&/figure&&p&这就是数据分析师常用的多维分析法,通过group by 切分不同的维度进行对比,在不利用BI的情况下,通过SQL进行快速数据分析。&/p&&p&接下来学习逻辑判断,SQL也有if函数,和Excel的用法一摸一样,通过它我们能进行复杂的运算。比如我想统计各个城市中有多少数据分析职位,其中,电商领域的职位有多少,在其中的占比?&/p&&p&industryField是公司的行业领域,虽然我们能用where like 计算出有几个电商的数据分析师,但是占比的计算会比较麻烦,此时可以用if。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&industryField&/span& &span class=&k&&like&/span& &span class=&s1&&'%电子商务%'&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&mi&&0&/span&&span class=&p&&)&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic2.zhimg.com/v2-98d4f700fcf06ee371eaefb5e9ac7a5c_b.jpg& data-rawwidth=&922& data-rawheight=&804& class=&origin_image zh-lightbox-thumb& width=&922& data-original=&https://pic2.zhimg.com/v2-98d4f700fcf06ee371eaefb5e9ac7a5c_r.jpg&&&/figure&&p&上面的公式利用if判断出哪些是电商行业的数据分析师,哪些不是。if函数中间的字段代表为true时返回的值,不过因为包含重复数据,我们需要将其改成positionId。图片中第二个count我漏加distinct了。之后,用它与group by 组合就能达成目的了。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&
&span class=&nf&&count&/span&&span class=&p&&(&/span&&span class=&k&&distinct&/span& &span class=&n&&positionId&/span&&span class=&p&&),&/span&
&span class=&nf&&count&/span&&span class=&p&&(&/span&&span class=&k&&distinct&/span& &span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&industryField&/span& &span class=&k&&like&/span& &span class=&s1&&'%电子商务%'&/span&&span class=&p&&,&/span&&span class=&n&&positionId&/span&&span class=&p&&,&/span&&span class=&no&&null&/span&&span class=&p&&))&/span&
&span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&group&/span& &span class=&k&&by&/span& &span class=&n&&city&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic1.zhimg.com/v2-ea99f3e85ba2d643b301fcc446e98685_b.jpg& data-rawwidth=&1506& data-rawheight=&792& class=&origin_image zh-lightbox-thumb& width=&1506& data-original=&https://pic1.zhimg.com/v2-ea99f3e85ba2d643b301fcc446e98685_r.jpg&&&/figure&&p&第一列数字是职位总数,第二列是电商领域的职位数,相除就是占比。记住,count是不论0还是1都会纳入计数,所以第三个参数需要写成null,代表不是电商的职位就排除在计算之外。&/p&&p&接下来是新的问题,如果我想找出各个城市,数据分析师岗位数量在500以上的城市有哪些,应该怎么计算?有两种方法,第一种,是使用having语句,它对聚合后的数据结果进行过滤。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&nf&&count&/span&&span class=&p&&(&/span&&span class=&k&&distinct&/span& &span class=&n&&positionId&/span&&span class=&p&&)&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&group&/span& &span class=&k&&by&/span& &span class=&n&&city&/span& &span class=&k&&having&/span& &span class=&nf&&count&/span&&span class=&p&&(&/span&&span class=&k&&distinct&/span& &span class=&n&&positionId&/span&&span class=&p&&)&/span& &span class=&o&&&=&/span& &span class=&mi&&500&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic3.zhimg.com/v2-6cae67add808a2dd4c39e05_b.jpg& data-rawwidth=&954& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&954& data-original=&https://pic3.zhimg.com/v2-6cae67add808a2dd4c39e05_r.jpg&&&/figure&&p&第二种,是利用嵌套子查询。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-0dd8ecfc91deae2eb149_b.jpg& data-rawwidth=&1036& data-rawheight=&478& class=&origin_image zh-lightbox-thumb& width=&1036& data-original=&https://pic4.zhimg.com/v2-0dd8ecfc91deae2eb149_r.jpg&&&/figure&&p&我们将第一次查询获得的城市职位数的结果,看作一张新的表,利用as 将它命名为t1( table1 的简写),将职位数命名为一个新的字段counts。然后外面再套一层select 过滤出counts &=500。&/p&&p&这种查询方式就叫嵌套子查询,使用场景比较广泛,where 后面也能跟子查询。&/p&&p&很多时候,数据是凌乱的,我们希望结果能够呈现一定的顺序,这时候就用到order by语句。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&nf&&count&/span&&span class=&p&&(&/span&&span class=&k&&distinct&/span& &span class=&n&&positionId&/span&&span class=&p&&)&/span& &span class=&k&&as&/span& &span class=&n&&counts&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&group&/span& &span class=&k&&by&/span& &span class=&n&&city&/span&
&span class=&k&&order&/span& &span class=&k&&by&/span& &span class=&n&&counts&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic2.zhimg.com/v2-da63abac6e51de7b440ea646_b.jpg& data-rawwidth=&1188& data-rawheight=&822& class=&origin_image zh-lightbox-thumb& width=&1188& data-original=&https://pic2.zhimg.com/v2-da63abac6e51de7b440ea646_r.jpg&&&/figure&&p&看,数据就按照统计结果升序排列,如果需要降序,则是order by counts desc,后面加一个desc就好了。如果是多个字段,按逗号分隔即可。&/p&&p&我们再来熟悉SQL的常用函数,首先是时间。因为我们的练习数据中没有时间,首先用now创建出一个时间字段。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&nf&&now&/span&&span class=&p&&()&/span&
&/code&&/pre&&/div&&p&直接执行它,就能获得当前的系统时间,精确到秒。其实select不一定后面要跟from。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&kt&&date&/span&&span class=&p&&(&/span&&span class=&nf&&now&/span&&span class=&p&&())&/span&
&/code&&/pre&&/div&&p&它代表的是获得当前日期,week函数获得当前第几周,month函数获得当前第几个月。其余还包括,quarter,year,day,hour,minute。&/p&&p&时间函数也包含各种参数,比如week,因为中西方计算第几天是不一样的,西方把周日算作一周中的第一天,而我们习惯周一。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&nf&&week&/span&&span class=&p&&(&/span&&span class=&nf&&now&/span&&span class=&p&&(),&/span&&span class=&mi&&0&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&除了以上的日期表达,也可以使用dayofyear、weekofyear 的形式计算。它和上面的部分函数等价。&/p&&p&怎么对时间进行加减法呢?这时候靠date_add函数出马。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&nf&&date_add&/span&&span class=&p&&(&/span&&span class=&kt&&date&/span&&span class=&p&&(&/span&&span class=&nf&&now&/span&&span class=&p&&())&/span& &span class=&p&&,&/span&&span class=&k&&interval&/span& &span class=&mi&&1&/span& &span class=&n&&day&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic1.zhimg.com/v2-5fd2cf2e0e3fee925746_b.jpg& data-rawwidth=&756& data-rawheight=&376& class=&origin_image zh-lightbox-thumb& width=&756& data-original=&https://pic1.zhimg.com/v2-5fd2cf2e0e3fee925746_r.jpg&&&/figure&&p&我们可以改变1为负数,达到减法的目的,也能更改day为week、year等,进行其他时间间隔的运算。如果是求两个时间的间隔,则是datediff(date1,date2)或者timediff(time1,time2)。&/p&&p&时间函数的运用比较灵活,没有特殊限定,网络上的文档和教程也不少,可以深入学习。&/p&&p&最后是数据清洗类的函数。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&k&&left&/span&&span class=&p&&(&/span&&span class=&n&&salary&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&/code&&/pre&&/div&&p&MySQL支持left、right、mid等函数,这里又和Excel一样。我们通过salary计算数据分析师的工资吧(这一步骤,在曾经的文章中已经用Excel和BI多次讲解,所以我就不多赘述了,只讲过程,不熟悉的同学可以看历史内容)。&/p&&p&首先利用locate函数查找第一个k所在的位置。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&nf&&locate&/span&&span class=&p&&(&/span&&span class=&s2&&&k&&/span&&span class=&p&&,&/span&&span class=&n&&salary&/span&&span class=&p&&),&/span&&span class=&n&&salary&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic1.zhimg.com/v2-e3accd77dd81fe81bea8a_b.jpg& data-rawwidth=&848& data-rawheight=&632& class=&origin_image zh-lightbox-thumb& width=&848& data-original=&https://pic1.zhimg.com/v2-e3accd77dd81fe81bea8a_r.jpg&&&/figure&&p&然后使用left函数截取薪水的下限。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&k&&left&/span&&span class=&p&&(&/span&&span class=&n&&salary&/span&&span class=&p&&,&/span&&span class=&nf&&locate&/span&&span class=&p&&(&/span&&span class=&s2&&&k&&/span&&span class=&p&&,&/span&&span class=&n&&salary&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&),&/span&&span class=&n&&salary&/span& &span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic3.zhimg.com/v2-a43c54f2454faaeca925ee_b.jpg& data-rawwidth=&974& data-rawheight=&574& class=&origin_image zh-lightbox-thumb& width=&974& data-original=&https://pic3.zhimg.com/v2-a43c54f2454faaeca925ee_r.jpg&&&/figure&&p&为了获得薪水的上限,要用substr函数,或者mid,两者等价。&/p&&blockquote&&p&substr(字符串,从哪里开始截,截取的长度)&/p&&/blockquote&&p&薪水上限的开始位置是「-」位置往后推一位。截取长度是整个字符串减去「-」所在位置,刚好是后半段我们需要的内容,不过这个内容是包含「K」的,所以最后结果还得再减去1。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-93ef879b0bc4fc7ee7ce610b29c5ac86_b.jpg& data-rawwidth=&1294& data-rawheight=&608& class=&origin_image zh-lightbox-thumb& width=&1294& data-original=&https://pic1.zhimg.com/v2-93ef879b0bc4fc7ee7ce610b29c5ac86_r.jpg&&&/figure&&p&这里不了解不要紧,可以将计算过程分步骤运行。基本上,了解了上面写法的含义,文本清洗这块就没有问题了(not like用来清洗乱七八糟的薪水,我简单处理了)。再然后计算不同城市不同工作年限的平均薪资。&/p&&div class=&highlight&&&pre&&code class=&language-mysql&&&span&&/span&&span class=&k&&select&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&n&&workYear&/span&&span class=&p&&,&/span&&span class=&nf&&avg&/span&&span class=&p&&((&/span&&span class=&n&&bottomSalary&/span&&span class=&o&&+&/span&&span class=&n&&topSalary&/span&&span class=&p&&)&/span&&span class=&o&&/&/span&&span class=&mi&&2&/span&&span class=&p&&)&/span& &span class=&k&&as&/span& &span class=&n&&avgSalary&/span&
&span class=&k&&from&/span& &span class=&p&&(&/span&&span class=&k&&select&/span& &span class=&k&&left&/span&&span class=&p&&(&/span&&span class=&n&&salary&/span&&span class=&p&&,&/span&&span class=&nf&&locate&/span&&span class=&p&&(&/span&&span class=&s2&&&K&&/span&&span class=&p&&,&/span&&span class=&n&&salary&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&k&&as&/span& &span class=&n&&bottomSalary&/span&&span class=&p&&,&/span&
&span class=&nf&&substr&/span&&span class=&p&&(&/span&&span class=&n&&salary&/span&&span class=&p&&,&/span&&span class=&nf&&locate&/span&&span class=&p&&(&/span&&span class=&s2&&&-&&/span&&span class=&p&&,&/span&&span class=&n&&salary&/span&&span class=&p&&)&/span&&span class=&o&&+&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&nf&&length&/span&&span class=&p&&(&/span&&span class=&n&&salary&/span&&span class=&p&&)&/span&&span class=&o&&-&/span& &span class=&nf&&locate&/span&&span class=&p&&(&/span&&span class=&s2&&&-&&/span&&span class=&p&&,&/span&&span class=&n&&salary&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&k&&as&/span& &span class=&n&&topSalary&/span&&span class=&p&&,&/span&
&span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&n&&positionId&/span&&span class=&p&&,&/span&&span class=&n&&workYear&/span&
&span class=&k&&from&/span& &span class=&n&&DataAnalyst&/span&
&span class=&k&&where&/span& &span class=&n&&salary&/span& &span class=&k&&not&/span& &span class=&k&&like&/span& &span class=&s1&&'%以上%'&/span&&span class=&p&&)&/span& &span class=&k&&as&/span& &span class=&n&&t1&/span&
&span class=&k&&group&/span& &span class=&k&&by&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&n&&workYear&/span&
&span class=&k&&order&/span& &span class=&k&&by&/span& &span class=&n&&city&/span&&span class=&p&&,&/span&&span class=&n&&avgSalary&/span&
&/code&&/pre&&/div&尼玛,知乎的编辑器对齐不方便啊……&br&&figure&&img src=&https://pic3.zhimg.com/v2-b931c071ced_b.jpg& data-rawwidth=&734& data-rawheight=&390& class=&origin_image zh-lightbox-thumb& width=&734& data-original=&https://pic3.zhimg.com/v2-b931c071ced_r.jpg&&&/figure&&p&上面语句,我们用了文本清洗、子查询嵌套、分组聚合、排序等多种用法,属于较复杂的查询。重复数据的问题,因为我是复制了一份北京数据,数量刚好乘二,对平均数没有影响,感兴趣的朋友可以再加一步清洗掉它。&/p&&p&下面是三道思考题:&/p&&ul&&li&查询出哪家公司招聘的岗位数最多;&br&&/li&&li&查询出O2O、电子商务、互联网金融这三个行业,哪个行业的平均薪资最高;&br&&/li&&li&查询出各城市的最高薪水Top3是哪家公司哪个岗位。&/li&&/ul&&p&做完上面的题目,你已经神功初成,数据分析的SQL意见没有大问题了。更复杂的查询,也无非是嵌套更多的内容,本质思路是一样的。&/p&&p&讲到这里,只剩join语法还没有教大家。因为练习数据只有一张表,而join又是SQL中比较容易混淆的难点,我会单独开一篇内容讲解,到时候使用SQLZoo和LeetCode的案例。&/p&&p&LeetCode是知名的算法竞赛网站,可以在上面和全世界的程序员比拼算法,当然我们只练习SQL,完成后,至少能秒杀全世界50%的程序员吧(知乎程序员大牛多,别打我,哈哈)。&/p&&br&&p&——————&/p&&p&欢迎关注我的公众号:tracykanc&/p&
本文是的第十篇教程,如果想要了解写作初衷,可以先行阅读七周指南。温馨提示:如果您已经熟悉数据库,大可不必再看这篇文章,或只挑选部分。 在《》,我们已经成功的安装数据库,并且导入数据,今天进入MySQL的…
&figure&&img src=&https://pic2.zhimg.com/cd933fcaa0c4b_b.jpg& data-rawwidth=&512& data-rawheight=&512& class=&origin_image zh-lightbox-thumb& width=&512& data-original=&https://pic2.zhimg.com/cd933fcaa0c4b_r.jpg&&&/figure&&p&昨天闲逛的时候,碰到这么一个地方: &a class=& wrap external& href=&http://link.zhihu.com/?target=https%3A//github.com/justjavac/free-programming-books-zh_CN& target=&_blank& rel=&nofollow noreferrer&&免费的编程中文书籍索引
&/a&由于没有联系到作者,于是只在这里放上一个链接,该贡献里面涉及到了很多优秀的学习编程的资源,也是一样希望可以帮助到大家。&/p&&p&&figure&&img data-rawheight=&120& data-rawwidth=&1200& src=&http://pic3.zhimg.com/24a09f2bfb268ee25bbdd406d3a3b7e6_b.png& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&http://pic3.zhimg.com/24a09f2bfb268ee25bbdd406d3a3b7e6_r.png&&&/figure&既然要学习数据库,就一定要明白什么事数据库(以下来自百度百科解释) ,通俗的来说,数据库就是用来存储信息的。&br&&/p&&blockquote&&p&&b&数据库&/b&,简单来说是本身可视为&a href=&http://link.zhihu.com/?target=http%3A//baike.baidu.com/view/766789.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&电子化&/a&的&a href=&http://link.zhihu.com/?target=http%3A//baike.baidu.com/view/497625.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&文件柜&/a&——存储电子&a href=&http://link.zhihu.com/?target=http%3A//baike.baidu.com/view/345685.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&文件&/a&的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。
&/p&&br&&b&数据库&/b&指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的&a href=&http://link.zhihu.com/?target=http%3A//baike.baidu.com/view/1030522.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&冗余度&/a&的特点、是与应用程序彼此独立的数据&a href=&http://link.zhihu.com/?target=http%3A//baike.baidu.com/view/15216.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&集合&/a&。&br&&br&&b&MySQL是一个关系型数据库管理系统(&/b&不了解的话请使用搜索引擎&b&)&/b&&/blockquote&&p&放在开始的是我之前发布的一篇文章的资料部分&/p&&p&&b&***********************如果你不想在线看的话,网页的右侧可以下载pdf&/b&************************ &br&&/p&&p&首推的是这个教程(感谢&a href=&http://link.zhihu.com/?target=http%3A//wiki.jikexueyuan.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&极客学院wiki&/a&提供的内容)&/p&&p&当然是如果你喜欢文字教程而非视频教程,如果你想系统的学习MySQL数据库,这个会是不错的选择:(&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//wiki.jikexueyuan.com/project/mysql/& target=&_blank& rel=&nofollow noreferrer&&极客学院Wiki -- MySQL中文版_MySQL中文教程_MySQL开发中文手册&/a&) &/p&&p&如果你想快速的入门MySQL数据库只是用来做些东西,同样推荐这一篇教程:(&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//wiki.jikexueyuan.com/project/mysql-21-minutes/& target=&_blank& rel=&nofollow noreferrer&&极客学院Wiki -- 21 分钟 MySQL入门教程_21 MySQL开发中文手册&/a&)&/p&&br&&p&1、 如果是文字教程:&/p&&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//www.runoob.com/mysql/mysql-tutorial.html& target=&_blank& rel=&nofollow noreferrer&&MySQL 教程 | 菜鸟教程&/a&&br&&p&2、如果是视频教程: &br&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//study.163.com/course/introduction/247003.htm%23/courseDetail& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MySQL数据库 - 网易云课堂&/a&(比较系统的学习,与php配合)&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//study.163.com/course/introduction/706085.htm%23/courseDetail& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[云知梦]MySQL数据库操作&/a&
(比较粗略的学习,章节1: MySQL基础)&/p&&br&&p&如果学完了上面的教程,那么如何开启下一段旅程:&/p&&p& 1、如果你用的是php语言:&/p&&ul&&li&如果你还不会php语言&/li&&a href=&https://zhuanlan.zhihu.com/p/?refer=passer& class=&internal&&让php给你一个美好的晚安! - 学习编程 - 知乎专栏&/a&&br&&li&如果你已经会php语言&/li&&br&&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//study.163.com/course/introduction/782001.htm%23/courseDetail& target=&_blank& rel=&nofollow noreferrer&&PHP&MySQL数据库连接及项目中处理数据&/a&&li&&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//study.163.com/course/introduction/252007.htm%23/courseDetail& target=&_blank& rel=&nofollow noreferrer&&李炎恢PHP第一季教程&/a&(章节16: PHP操作MySQL)&/li&&li&&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//www.jikexueyuan.com/course/457.html& target=&_blank& rel=&nofollow noreferrer&&PHP 与 MySQL&/a&
(极客学院)&/li&&/ul&&br&&br&2、如果你用的是java语言: &br&&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//study.163.com/course/introduction/645004.htm%23/courseDetail& target=&_blank& rel=&nofollow noreferrer&&JDBC JAVA 数据库编程 视频教程&/a&&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//study.163.com/course/introduction/1061005.htm%23/courseDetail& target=&_blank& rel=&nofollow noreferrer&&尚学堂_java Web入门项目 BBS论坛&/a&&br&&br&3、如果你用的是python语言:&br&&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//www.jikexueyuan.com/course/1373.html& target=&_blank& rel=&nofollow noreferrer&&Python 操作数据库—— MySQL 篇&/a&&p&&figure&&img data-rawheight=&120& data-rawwidth=&1200& src=&http://pic1.zhimg.com/3f67ac248c_b.png& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&http://pic1.zhimg.com/3f67ac248c_r.png&&&/figure&今天的教程整理是比较简短的。所以在最后给大家安利一下私以为的小福利。(关于程序员如何接私活,相信也是关注这个专栏的朋友将会关心的一个问题,这个内容是我在&a href=&https://www.zhihu.com/question//answer/& class=&internal&&程序员一般通过什么途径接私活? - 路人甲的回答&/a&)话题下的一个回答。如果有机会我同样会出一篇完整的关于接私活的指南。&br&&/p&&br&如何通过自己的力量而不通过这些平台去接私活。(以下的所有内容都是自己的亲身经历)&br&1、因为这是在知乎,第一个途径会说说如何在知乎这个平台接私活,当然不是让你打广告。第一是用心回答,第二是写专业性文章。(无论是答案还是文章都是要先展现你的专业技能,不然甲方如何放心的找你)。很多需求方都在知乎逛着呢,你有技术不要藏着,善于分享,善于回答,也许你的甲方就是下一个题主。&br&&br&关于答题方面,提两点建议:&u&&b&&br&多展示自己的成果、作品&/b&&/u&(这样需求方回自己判断你是不是符合自己需求的人)&br&&u&&b&多回答一些专业问题,而不是一些拉家常式问题&/b&&/u&(尤其是要回答一些你认为脑残的问题)&br&&br&2、找一个你认为不错的地方写博客(流量高一点的比较好,推荐博客园、开源中国之类的网站),分享你的学习经验以及展示你得成果,如果可以留下自己的微信或者联系方式。这个是最直接的方式,你博客写的好技术不错,会有一些私人培训找到你的。当然你得博客写的好,有人想转载,可以收取

我要回帖

更多关于 南京驾校哪家好 的文章

 

随机推荐