精华内容
下载资源
问答
  • 今天 我们来聊聊日常工作中常会遇到的问题,mysql...二、通过操作的优化可通过 8 方法优化 Mysql 数据库:创建索引、复合索引、索引不会包含有 NULL 值的列、使用短索引、排序的索引问题、like 语句操作、不要在列...
    e9d722ee6cbfafa58638df37c65c2326.png今天 我们来聊聊日常工作中常会遇到的问题,mysql的调优。可以从两方面入手:一、通过优化配置参数        如合适的 innodb 池大小,取消反向解析,合理的连接数,合理的超时时长,合理的相关 cache 等。二、通过操作的优化可通过 8 个方法优化 Mysql 数据库:创建索引、复合索引、索引不会包含有 NULL 值的列、使用短索引、排序的索引问题、like 语句操作、不要在列上进行运算、不使用 NOT IN 和<>操作1、创建索引 索引不是越多越好,每个表控制在 6 个索引以内。范围 where 条件的情况下,索引不起作用,比如 where value<1002、复合索引(联合索引)比如有一条语句是这样的:select * from users where name='陈五' and sex=1;我们创建了(name, sex, phone)的复合索引,那么其实相当于创建了(name, sex, phone)、(name, sex)、(name)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边依次递减3、索引不会包含有 NULL 值的列只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL 值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为 NULL。4、使用短索引 对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个 CHAR(255)的 列,如果在前 10 个或 20 个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和 I/O 操作5、排序的索引问题 mysql 查询只使用一个索引,因此如果 where 子句中已经使用了索引的话,那么 order by 中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。6、like 语句操作 一般情况下不鼓励使用 like 操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而 like “aaa%”可以使用索引。7、不要在列上进行运算 select * from users where YEAR(create_time) < 2020; 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成 select * from users where create_time < '2020-01-01' ;8、不使用 NOT IN 和<>操作 NOT IN 和<>操作都不会使用索引将进行全表扫描。NOT IN 可以 NOT EXISTS 代替,id<>10 则可使用 id>10 or id<10 来代替。注意:1、索引要建立在经常进行select操作的字段上这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。2、索引要建立在值比较唯一的字段上。3、对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。4、在where和join中出现的列需要建立索引。5、where的查询条件里有不等号(where column != …),mysql将无法使用索引。6、如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引。7、在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。最后,多用 explain 和 profile 分析查询语句。
    展开全文
  • 问题背景:最近在用ThinkPHP 5开发项目的过程中,发现根据筛选条件做or查询的时候,连贯操作不可以使用where进行条件查询了。首先列出一user数据表的信息:uidunamegrade(年级)class(班级)sex(性别)11号12122号...

    问题背景:最近在用ThinkPHP 5开发项目的过程中,发现根据筛选条件做or查询的时候,连贯操作不可以使用where进行条件查询了。

    首先列出一个user数据表的信息:

    uid

    uname

    grade(年级)

    class(班级)

    sex(性别)

    1

    1号

    1

    2

    1

    2

    2号

    1

    1

    2

    3

    3号

    3

    3

    2

    4

    4号

    4

    2

    1

    5

    5号

    2

    5

    1

    6

    6号

    1

    6

    2

    7

    7号

    1

    1

    1

    8

    8号

    2

    3

    1

    9

    9号

    2

    2

    1

    10

    10号

    3

    1

    2

    数据表展现了10位同学的年级、班级、性别信息

    现在要查询数据为

    grade=1 or class= or sex=2

    在TP3中想要or查询

    条件可以为:

    $condition['grade'] = 1;

    $condition['class'] = 3;

    $condition['sex'] = 2;

    $condtion['_logic'] = 'OR';

    $list = M(‘user’)->where($condtion)->findall();

    然后在TP5中尝试用where去这么查询发现一直在报错,查了手册之后发现TP5取消了_logic作为查询方式,而是新增了whereOr方法,下面是TP5中查询方式

    User.php

    namespace app\index\controller;useapp\index\model\UserModel;classUser

    {public functionindex()

    {$condition['grade'] = 1;$condition['class'] = 3;$condition['sex'] = 2;$UserModel = newUserModel;$list = $UserModel->getlistwhereOr($condition);print_r($list);

    }

    }

    UserModel.php

    namespace app\index\model;useapp\common\model\CommonModel;usethink\Db;usethink\Model;class UserModel extendsCommonModel

    {public function__construct(){

    parent::__construct();

    }protected $name = 'User';public function getlistwhereOr($condition) {$list =Db::name($this->name)->whereOr($condition)->select();return $list;

    }

    }

    执行User.php 发现打印出来的数据就是我们要的筛选数据,

    总结:TP5相比TP3中更新了很多我们经常用到的查询方式,而且写法更人性化,需要经常的去整理查看这些新方法

    by as

    展开全文
  • 有查询条件就查询,多个查询条件,只要有查询,就增加一个查询条件//类型if($sotype){$where['type']=$sotype;}//合作单位if($companyid){$where['hezuodanwei']=$companyid;}//关键词模糊查询$type是变量if($key){$...

    有查询条件就查询,

    多个查询条件,只要有查询,就增加一个查询条件

    //类型

    if($sotype){

    $where['type'] = $sotype;

    }

    //合作单位

    if($companyid){

    $where['hezuodanwei'] = $companyid;

    }

    //关键词 模糊查询 $type 是变量

    if($key){

    $where[$type] = ['like',"%".$key."%"];

    }

    $rs=Db::name('student')->where($where)->order('id desc')->limit($limit)->page($page)->select();

    $rs1=Db::name('student')->where($where)->select();

    $where['type'] = $sotype;

    $where['hezuodanwei'] = $companyid;

    $where["username"] = ['like',"%".$tag["kw"]."%"];//模糊查询

    $where[]=['exp','FIND_IN_SET(2,needID)'];

    例子:id in(1,5,8)

    $where['hezuodanwei'] =array('in','10,12');

    组成查询数组$where

    where($where)

    引用:http://blog.csdn.net/u010447573/article/details/47420063

    Where 条件表达式格式为:

    $map['字段名'] = array('表达式', '操作条件');

    其中 $map 是一个普通的数组变量,可以根据自己需求而命名。上述格式中的表达式实际是运算符的意义:

    ThinkPHP运算符 与 SQL运算符 对照表

    TP运算符SQL运算符例子实际查询条件

    eq

    =

    $map['id'] = array('eq',100);

    等效于:$map['id'] = 100;

    neq

    !=

    $map['id'] = array('neq',100);

    id != 100

    gt

    >

    $map['id'] = array('gt',100);

    id > 100

    egt

    >=

    $map['id'] = array('egt',100);

    id >= 100

    lt

    <

    $map['id'] = array('lt',100);

    id < 100

    elt

    <=

    $map['id'] = array('elt',100);

    id <= 100

    like

    like

    $map = array('like','Admin%');

    username like 'Admin%'

    between

    between and

    $map['id'] = array('between','1,8');

    id BETWEEN 1 AND 8

    not between

    not between and

    $map['id'] = array('not between','1,8');

    id NOT BETWEEN 1 AND 8

    in

    in

    $map['id'] = array('in','1,5,8');

    id in(1,5,8)

    not in

    not in

    $map['id'] = array('not in','1,5,8');

    id not in(1,5,8)

    and(默认)

    and

    $map['id'] = array(array('gt',1),array('lt',10));

    (id > 1) AND (id < 10)

    or

    or

    $map['id'] = array(array('gt',3),array('lt',10), 'or');

    (id > 3) OR (id < 10)

    xor(异或)

    xor

    两个输入中只有一个是true时,结果为true,否则为false,例子略。

    1 xor 1 = 0

    exp

    综合表达式

    $map['id'] = array('exp','in(1,3,8)');

    $map['id'] = array('in','1,3,8');

    补充说明

    同 SQL 一样,ThinkPHP运算符不区分大小写,eq 与 EQ 一样。

    between、 in 条件支持字符串或者数组,即下面两种写法是等效的:

    $map['id'] = array('not in','1,5,8');

    $map['id'] = array('not in',array('1','5','8'));

    exp 表达式

    上表中的 exp 不是一个运算符,而是一个综合表达式以支持更复杂的条件设置。exp 的操作条件不会被当成字符串,可以使用任何 SQL 支持的语法,包括使用函数和字段名称。

    exp 不仅用于 where 条件,也可以用于数据更新,如:

    $Dao = M("Article");

    // 构建 save 的数据数组,文章点击数+1

    $data['id'] = 10;

    $data['counter'] = array('exp','counter+1');

    // 根据条件保存修改的数据

    $User->save($data);

    官方查询语法:https://www.kancloud.cn/manual/thinkphp5/135182

    查询表达式

    版本新增功能

    5.0.9

    比较运算增加闭包子查询支持

    5.0.4

    支持对同一个字段多次调用查询方法

    查询表达式支持大部分的SQL查询语法,也是ThinkPHP查询语言的精髓,查询表达式的使用格式:

    where('字段名','表达式','查询条件');

    whereOr('字段名','表达式','查询条件');

    表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:

    表达式含义

    EQ、=

    等于(=)

    NEQ、<>

    不等于(<>)

    GT、>

    大于(>)

    EGT、>=

    大于等于(>=)

    LT、<

    小于(

    ELT、<=

    小于等于(<=)

    LIKE

    模糊查询

    [NOT] BETWEEN

    (不在)区间查询

    [NOT] IN

    (不在)IN 查询

    [NOT] NULL

    查询字段是否(不)是NULL

    [NOT] EXISTS

    EXISTS查询

    EXP

    表达式查询,支持SQL语法

    > time

    时间比较

    < time

    时间比较

    between time

    时间比较

    notbetween time

    时间比较

    表达式查询的用法示例如下:

    EQ :等于(=)

    例如:

    where('id','eq',100);

    where('id','=',100);

    和下面的查询等效

    where('id',100);

    表示的查询条件就是 id = 100

    NEQ: 不等于(<>)

    例如:

    where('id','neq',100);

    where('id','<>',100);

    表示的查询条件就是 id <> 100

    GT:大于(>)

    例如:

    where('id','gt',100);

    where('id','>',100);

    表示的查询条件就是 id > 100

    EGT:大于等于(>=)

    例如:

    where('id','egt',100);

    where('id','>=',100);

    表示的查询条件就是 id >= 100

    LT:小于(

    例如:

    where('id','lt',100);

    where('id','

    表示的查询条件就是 id < 100

    ELT: 小于等于(<=)

    例如:

    where('id','elt',100);

    where('id','<=',100);

    表示的查询条件就是 id <= 100

    [NOT] LIKE: 同sql的LIKE

    例如:

    where('name','like','thinkphp%');

    查询条件就变成 name like 'thinkphp%'

    V5.0.5+版本开始,like查询支持使用数组

    where('name','like',['%think','php%'],'OR');

    [NOT] BETWEEN :同sql的[not] between

    查询条件支持字符串或者数组,例如:

    where('id','between','1,8');

    和下面的等效:

    where('id','between',[1,8]);

    查询条件就变成 id BETWEEN 1 AND 8

    [NOT] IN: 同sql的[not] in

    查询条件支持字符串或者数组,例如:

    where('id','not in','1,5,8');

    和下面的等效:

    where('id','not in',[1,5,8]);

    查询条件就变成 id NOT IN (1,5, 8)

    [NOT] IN查询支持使用闭包方式

    [NOT] NULL :

    查询字段是否(不)是Null,例如:

    where('name', null);

    where('title','null');

    where('name','not null');

    如果你需要查询一个字段的值为字符串null或者not null,应该使用:

    where('title','=', 'null');

    where('name','=', 'not null');

    EXP:表达式

    支持更复杂的查询情况 例如:

    where('id','in','1,3,8');

    可以改成:

    where('id','exp',' IN (1,3,8) ');

    exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。

    展开全文
  • 我试图将多个参数添加到if语句中.我正在尝试检查两队之间的比赛是否是联赛.SELECT visitor AS school, home AS temp, vl.leagueid AS vleague, hl.leagueid AS hleague,if(vl.leagueid = hl.leagueid, 1, 0) AS ...

    mysql的新手,所以我不确定我是否正确地问了这个问题.我试图将多个参数添加到if语句中.我正在尝试检查两队之间的比赛是否是联赛.

    SELECT visitor AS school, home AS temp, vl.leagueid AS vleague, hl.leagueid AS hleague,

    if(vl.leagueid = hl.leagueid, 1, 0) AS leaguematch

    FROM schedule

    LEFT JOIN schools AS vl ON vl.id = visitor

    LEFT JOIN schools AS hl ON hl.id = home

    WHERE gamedate between '2013-01-01' AND '2013-12-31'

    我想添加((vl.leagueid = 26 AND hl.leagueid = 27)OR((vl.leagueid = 27 AND hl.leagueid = 26))来检查联赛是否相等.我尝试过的()的任何组合似乎都无效,所以我感觉到我要解决这个错误.

    谢谢,

    麦克风

    感谢chofer,这是我的工作查询

    SELECT visitor AS school, home AS temp, vl.leagueid AS vleague, hl.leagueid AS hleague,

    CASE

    WHEN vl.leagueid = hl.leagueid THEN '1'

    WHEN ((vl.leagueid = 26 AND hl.leagueid = 27) OR (vl.leagueid = 27 AND hl.leagueid = 26)) THEN '1'

    ELSE 0

    END AS leaguematch

    FROM u96nk_rvball_schedule

    LEFT JOIN u96nk_rvball_schools AS vl ON vl.id = visitor

    LEFT JOIN u96nk_rvball_schools AS hl ON hl.id = home

    WHERE gamedate between '2013-01-01' AND '2013-12-31'

    展开全文
  • MySQL可以为多个列创建索引。一个索引可以包括15个列。对于某些列类型,可以索引列的前缀(参见7.4.3节,“列索引”)。多列索引可以视为包含通过连接索引列的值而创建的值的排序的数组。MySQL按这样的方式使用多列...
  • products表如下:a WHERE后以and 接两个条件以及三个条件进行搜索:b 使用or来搜索多个条件c 下面这个有点意思,找出由vend_id 为1002或者1003生产的价格大于10的产品,这里需要使用and 和 or进行组合:但是从上面的...
  • MySQL多个WHERE条件

    2014-09-18 22:18:08
    <p>I'm trying to get this output with MySQL: -Kate -William -dog (3 results) <p>From those databases: <pre><code>--------------- ---------------------- | users | | pet | |----------...
  • <pre><code>UPDATE participantes SET confirmado = 1 WHERE id = 19 AND id = 20 AND id = 21; </code></pre> <p>participantes -> Table <p>confirmado -> field of the table participantes. </div>
  • mysql where多个 或者条件

    千次阅读 2019-09-24 04:35:43
    select * from table where id=1 and uid=2 and (status=2 or status=3 or status=4); 转载于:https://www.cnblogs.com/houweijian/p/3314648.html
  • MySQLWHERE后跟多个条件

    万次阅读 2016-12-13 11:32:35
    我这里将来解决如何在MySQL执行update,delete等需要查询的语句,最后限制where后跟多个条件的问题。比如,我现在在数据库当中有如下一张表。当我想要更新name为”louyujing”,type为1的string当中的内容,就可以...
  • MySQL where 条件字句查询

    万次阅读 2020-09-22 17:57:18
    搜索条件可由一个或多个逻辑表达式组成 , 结果一般为布尔值 逻辑运算符 运算符 语法 描述 and && a and b a && b 逻辑与 两个为真, 结果为真 or || a or b a || b 逻辑或 一个为真, ...
  • MySQLWhere查询有or以及and两种多条件查询;它们是可以一起使用的,但是在使用时要注意两者的优先级:and的优先级高于or,因此会对and两边的条件先操作,然后再与or的条件结合。数据录入:利物浦2019英超前8轮的...
  • 在《MySQL 常见语句加锁分析》一文中,我们详细讲解了 SQL 语句的加锁原理并具体分析了大部分的简单 SQL 语句,但是实际业务场景中 SQL 语句往往及其复杂,包含多个条件,此时就需要具体分析SQL 使用到的索引,并...
  • 在《MySQL 常见语句加锁分析》一文中,我们详细讲解了 SQL 语句的加锁原理并具体分析了大部分的简单 SQL 语句,但是实际业务场景中 SQL 语句往往及其复杂,包含多个条件,此时就需要具体分析SQL 使用到的索引,并...
  • 导读:本文节选自松华老师的《SQL优化专栏》郑松华,知数堂SQL 优化班老师现任 CCmediaService...网名:骑龟的兔子需求背景:今天给大家带来的是 MySQL where 条件的一坑!show create table employees\G*********...
  • 连接符链接多个条件 生成的sql语句 where条件也是用&链接的 会导致不能正确查询出数据 例如 .Where(it => it.A == A & it.B == B); 这个情况就查询不出数据 把&换成2个&&...
  • 1,非复合索引的范围条件的定义:1,对于 BTREE 和 HASH 索引,添加了索引的字段与常量值进行比较(使用=, , IN(), IS NULL, IS NOT NULL)是一范围条件;2,对于 BTREE 索引,...3,对于全部索引类型,范围条件...
  • MySQL搜索: WHERE 多条件

    千次阅读 2017-03-10 10:46:54
    WHERE可以按多条件进行搜索。 products表如下: ...b 使用or来搜索多个条件 c 下面这个有点意思,找出由vend_id 为1002或者1003生产的价格大于10的产品,这里需要使用and 和 or进行组合:
  • 1,非复合索引的范围条件的定义:1,对于 BTREE 和 HASH 索引,添加了索引的字段与常量值进行比较(使用=, , IN(), IS NULL, IS NOT NULL)是一范围条件;2,对于 BTREE 索引,...3,对于全部索引类型,范围条件...
  • with multiple select and i written one on change function so on change fuction it will go the controller as an array of id's now what i want is i want to select foods from mysql table with these ...
  • 公司项目中有段功能是全局搜索框和下拉列表的联合查询,在联调开发中发现单独用下拉查询是正确的,...百度查询的结果是这样的 :where语句中同时出现条件的“与”或者“或的时候”,要将多个OR用小括号括起来再和AN...
  • where 条件字句搜索条件可由一个或多个逻辑表达式组成 , 结果一般为布尔值逻辑运算符运算符语法描述and &&a and b a && b逻辑与 两个为真, 结果为真or ||a or b a || b逻辑或 一个为真, 结果为真not...
  • 在《MySQL 常见语句加锁分析》一文中,我们详细讲解了 SQL 语句的加锁原理并具体分析了大部分的简单 SQL 语句,但是实际业务场景中 SQL 语句往往及其复杂,包含多个条件,此时就需要具体分析SQL 使用到的索引,并...
  • 作用:检索数据中符合条件的值注意:搜索的条件由一个或者多个表达式组成!结果 布尔值1.1、逻辑运算符运算符语法描述and &&a and b a&&b逻辑与,两个都为真,结果为真or ||a or b a|| b逻辑或,...
  • left join on +多条件where区别重点先匹配,再筛选where条件。本文将通过几例子说明两者的差别。表1:productidamount1100220033004400表2:product_detailsidweightexist22204441555066611. 单个条件select * ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,857
精华内容 1,142
关键字:

mysqlwhere多个条件

mysql 订阅