1、
SELECT * FROM t WHERE YEAR(d) >= 1994;SELECT * FROM t WHERE d >= '1994-01-01';//这个好,相比上面的语句没有用year函数,
-------------------------------------------------------------------------------
2、
SELECT * FROM Country ,CountryLanguage
WHERE Country.Code= CountryLanguage.CountryCode;SELECT * FROM Country JOIN CountryLanguage
ON Country.Code= CountryLanguage.CountryCode;//这个好,显式说明了连接关系,以前好像在哪里看到过,记不起来了
-------------------------------------------------------------------------------
3、
SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;//id 设置成int类型的要比char或者archar的好?不是很明白
-------------------------------------------------------------------------------
4、
SELECT * FROM t WHERE length(column_t) = 5;SELECT * FROM t WHERE column_length=5; //这个也不明白--------------------------------------------------------
5、
SELECT * FROM t WHERE name LIKE '%de%‘SELECT * FROM t WHERE name LIKE 'de%'
SELECT * FROM t WHERE name >= 'de' AND name < 'df‘//将like查询改成非like查询?具体例子什么意思不清楚
-------------------------------------------------------------------------------
6、
SELECT * FROM t WHERE 1;SELECT * FROM t WHERE 1 LIMIT 10;这个也不懂
-------------------------------------------------------------------------------
7、
SELECT * FROM Country WHERE Name LIKE 'M%';SELECT Name FROM Country WHERE Name LIKE 'M%';//只取需要的字段在看yueliangdao0608的Mysql开发与优化的ppt时,看到了上面的sql,所以拿出来请教下
SELECT * FROM t WHERE YEAR(d) >= 1994;SELECT * FROM t WHERE d >= '1994-01-01';//这个好,相比上面的语句没有用year函数,
-------------------------------------------------------------------------------
2、
SELECT * FROM Country ,CountryLanguage
WHERE Country.Code= CountryLanguage.CountryCode;SELECT * FROM Country JOIN CountryLanguage
ON Country.Code= CountryLanguage.CountryCode;//这个好,显式说明了连接关系,以前好像在哪里看到过,记不起来了
-------------------------------------------------------------------------------
3、
SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;//id 设置成int类型的要比char或者archar的好?不是很明白
-------------------------------------------------------------------------------
4、
SELECT * FROM t WHERE length(column_t) = 5;SELECT * FROM t WHERE column_length=5; //这个也不明白--------------------------------------------------------
5、
SELECT * FROM t WHERE name LIKE '%de%‘SELECT * FROM t WHERE name LIKE 'de%'
SELECT * FROM t WHERE name >= 'de' AND name < 'df‘//将like查询改成非like查询?具体例子什么意思不清楚
-------------------------------------------------------------------------------
6、
SELECT * FROM t WHERE 1;SELECT * FROM t WHERE 1 LIMIT 10;这个也不懂
-------------------------------------------------------------------------------
7、
SELECT * FROM Country WHERE Name LIKE 'M%';SELECT Name FROM Country WHERE Name LIKE 'M%';//只取需要的字段在看yueliangdao0608的Mysql开发与优化的ppt时,看到了上面的sql,所以拿出来请教下
第二个,也就是 WHERE d >= '1994-01-01';这个可以使用索引。
2、
效率上一样,好坏无法明确说明,这个一直存在争议。3、
INT的速度会快一些。整数处理起来比字符串快。
4、
估计是让加个字段 column_length
5、
name LIKE '%de%‘肯定效率不好,但要看需求。至于 name LIKE 'de%' 和 name >= 'de' AND name < 'df‘/ 应该没有明显差距。不过需要做试验以确认。
6、
看MYSQL手册中的LIMIT 的作用7、
如果不需要其它字段,当然不要列,这样,只需要处理你需要的字段,至少网络上可以少传不少字节。
2.无必要,若是SQL复杂或3或3张以上表关联推荐此写法3.可以使用到索引的,但是输出结果集中该字段会被隐形转换为 字符串了,若是后面再用此字段作ORDER BY等条件就无法继续使用索引了
4.这个要看设计的字段含义了5.不能这么简单地转换,是未必的... 应该会出问题6.WHERE 1 不影响查询结果或优化器,但这是很多程序员的不良习惯造成的推荐一个PPT给大家参考:http://www.mysqlops.com/2011/05/25/mysql-training-ppt.html
#****************************************#
MySQL技术及运维自动化网:www.mysqlops.com新浪微博账号:http://weibo.com/mysqlops
#****************************************#
能否再给解释下:WHERE 1 不影响查询结果或优化器,但这是很多程序员的不良习惯造成的?我刚才看了limit的作用,
Mysql说明文档里面这么写的:如果你用LIMIT只选择一些行,当MySQL选择做完整的表扫描
时,它将在一些情况下使用索引3.可以使用到索引的,但是输出结果集中该字段会被隐形转换为 字符串了,若是后面再用此字段作ORDER BY等条件就无法继续使用索引了
这个解释我觉得也许更好点,之前ACMAIN_CHM 说的有道理,但是我之前看过帖子讨论int跟varchar效率问题,跟数据量有很大关系,数据量不大的时候差不多的。
$sql .= ' where a = ' . $a;
}if($b){
if($a){
$sql .= ' and b = ' . $b;
}else{
$sql .= ' where b = ' . $b;
}
}可以变成
$sql = 'select field from tableName where 1';if($a){
$sql .= ' and a = ' . $a;
}if($b){
$sql .= ' and b = ' . $b;
}
SELECT * FROM t WHERE YEAR(d) >= 1994;SELECT * FROM t WHERE d >= '1994-01-01';//这个好,相比上面的语句没有用year函数,在WHERE里用了计算函数,索引将会失效.
-------------------------------------------------------------------------------
2、
SELECT * FROM Country ,CountryLanguage
WHERE Country.Code= CountryLanguage.CountryCode;SELECT * FROM Country JOIN CountryLanguage
ON Country.Code= CountryLanguage.CountryCode;//这个好,显式说明了连接关系,以前好像在哪里看到过,记不起来了在连接中当然要显式了.如果不显式,有可能在执行计划时就出错.
-------------------------------------------------------------------------------
3、
SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;//id 设置成int类型的要比char或者archar的好?不是很明白WHERE子句一般要求与数据库的类型相配.'19' 相当使用了隐式转换.理由同1.
-------------------------------------------------------------------------------
4、
SELECT * FROM t WHERE length(column_t) = 5;SELECT * FROM t WHERE column_length=5; //这个也不明白
column_length 应该是一个字段名.把字段的长度在表里固定化.如果用了LEN函数,理由同一.导至全表扫描.
--------------------------------------------------------
5、
SELECT * FROM t WHERE name LIKE '%de%‘SELECT * FROM t WHERE name LIKE 'de%'
SELECT * FROM t WHERE name >= 'de' AND name < 'df‘//将like查询改成非like查询?具体例子什么意思不清楚对前置式的LIKE优化不好的数据库,一般都转为这个形式. name >= 'de' AND name < 'df‘
这里为什么是DF,因为E的下一个字母就是F.
-------------------------------------------------------------------------------
6、
SELECT * FROM t WHERE 1;SELECT * FROM t WHERE 1 LIMIT 10;这个也不懂
-------------------------------------------------------------------------------
7、
SELECT * FROM Country WHERE Name LIKE 'M%';SELECT Name FROM Country WHERE Name LIKE 'M%';//只取需要的字段这个没有特别的意思,就是你要显示什么就取什么,别取太多.不过,这个语句不是与前面的有冲突吗? :)
select 列名 必须这样不要用*
where id=‘id’ 字符好 网上传上来的都是字符串直接用
SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;//id 设置成int类型的要比char或者archar的好?不是很明白
个人认为把id设定为整数还有个好处,就是可以通过自动增长取得id,类似与oracel中的sequence
整型: 使用字符串传值则多一层类型转换的消耗字符串: 那就是多从整型到字符串的消耗另外, 如果业务可以用整型表示, 而使用了字符串类型, 是会增加消耗的, 以64位整型, 占8个字节, 而64位的整数表示为字符串有20个字符, 也就是20字节....比较必然是慢的.
第二个,也就是 WHERE d >= '1994-01-01';这个可以使用索引。
日期类型在数据库内以整数存储,查询的时候会把'1994-01-01'转换成整数,效率高。
year函数会丧失一定性能,而且会导致索引失效。
1、
SELECT * FROM t WHERE YEAR(d) >= 1994;SELECT * FROM t WHERE d >= '1994-01-01';//这个好,相比上面的语句没有用year函数,
//这个我还真没这样用过,学习了
-------------------------------------------------------------------------------
2、
SELECT * FROM Country ,CountryLanguage
WHERE Country.Code= CountryLanguage.CountryCode;SELECT * FROM Country JOIN CountryLanguage
ON Country.Code= CountryLanguage.CountryCode;//这个好,显式说明了连接关系,以前好像在哪里看到过,记不起来了
//我一般都用第二种,如果表多的话第一种的可读性很差。
-------------------------------------------------------------------------------
3、
SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;//id 设置成int类型的要比char或者archar的好?不是很明白
//这个我用第1种,因为我一直担心如果19没取到值的话就会变成id = ,而字符串则会变成id = ''
第一个就会保存,第二个就没有记录显示。
-------------------------------------------------------------------------------
4、
SELECT * FROM t WHERE length(column_t) = 5;SELECT * FROM t WHERE column_length=5; //这个也不明白//不解释
--------------------------------------------------------
5、
SELECT * FROM t WHERE name LIKE '%de%‘SELECT * FROM t WHERE name LIKE 'de%'
SELECT * FROM t WHERE name >= 'de' AND name < 'df‘//将like查询改成非like查询?具体例子什么意思不清楚
//又学习了,没想到还有第3种写法。
-------------------------------------------------------------------------------
6、
SELECT * FROM t WHERE 1;SELECT * FROM t WHERE 1 LIMIT 10;这个也不懂
1其实代表TRUE,我一般用TRUE表示
-------------------------------------------------------------------------------
7、
SELECT * FROM Country WHERE Name LIKE 'M%';SELECT Name FROM Country WHERE Name LIKE 'M%';//只取需要的字段
//比较懒,一直用*号代替,除非涉及的表太多了。