MySQL中SELECT语句简单使用
最近开始复习mysql,查漏补缺吧。
关于mysql
1.mysql不区分大小写,但是在mysql 4.1及之前的版本中,数据库名、表名、列名这些标识符默认是区分大小写的;在之后的版本中默认不区分大小写。 2.mysql不需要在单条sql语句后加上分号,但是在特定的dbms(数据库管理系统)可能必须加分号以此结束。如果使用的是mysql命令行,必须加上分号来结束sql语句。
select语句简单使用
select columns from table;
同时检索多列,字段名之间用英文逗号“,”分隔,最后一个字段名后不用跟逗号。一般,除非确实需要表中的每一列,否则别在select语句中使用通配符“*”。因为检索不需要的列通常会降低检索和应用程序的性能。
1.distinct关键字
使用此关键字表示去掉检索结果中相同的值。如果使用distinct关键字,它必须直接放在字段名的前面。
1.不使用distinct关键字
2.使用distinct关键字
可以看到,使用了distinct关键字后去掉了检索结果中的重复值。
问题:如果在distinct关键字后面的跟多个列名呢?
不使用distinct关键字
使用distinct关键字
结果一样,但并不是distinct关键字不起作用,distinct关键字是应用于所有列的,而不是它后面紧接着的那一列。在有多列的情况下,每行的每个字段的值都相同时才不会被检索出来。如上,如果将值conductor2改成conductor1,那么第0行(和编程语言一样,检索结果序号也是从0开始)和第1行检索出来的两列值相同,所以只会出现一行。(这里不确定出现的是前一行还是后一行。)
(2)limit关键字
limit关键字放于查询语句末尾,用于限制检索结果的行数,即只返回制定的行数。
- 不使用limit关键字
共返回了11行。
- 使用limit关键字(带1个参数)
返回指定的行数,即5行。
- 使用limit关键字(带2个参数)
从第3行开始,共返回5行。
总结: limit带一个参数,即返回总行数,从0行开始返回。limit带2个参数,第一个参数表示从第几行处开始返回,第2个参数表示返回的总行数。另外,如果实际行数少于limit后面设置的返回总行数,则返回实际行数。
在mysql 5 中的limit做了一点修改:limit 3,4的含义容易被混淆,究竟是从第3行返回4行还是从第4行返回3行呢?因此在mysql 5 中,出现了它的替代语法:limit 4 offset 3(返回4行,从第3行开始返回)
(3)使用完全限定的表名
在上面我们用到的查询语句都只是列名来查询,现在我们在列名前加上表名来查询:
select user.password from user; 这条语句其实等价于select password from user;但这里指定了一个完全限定的列名。
同样,我们也可以完全限定表名:
select user.password from product.user; 前提是user表在product数据库中存在。
总结:列名前用表名限定,表名前用数据库名来限定。
(4)排序数据(order by子句)
一般的,检索出来的数据并不是以纯粹的随即顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或者删除,则此时的顺序将会受到mysql重用回收存储空间的影响。
- 关于mysql重用存储空间:当你使用delete删除数据 时,mysql并不会回收被已删除数据的占据的存储空间以及索引位,而是空在那里,等待新的数据来弥补这个空缺。被删除的数据的信息将会被保存在一个链接清单中,当有新数据写入的时候,mysql会利用这些已删除的空间再写入。这样就有一个缺点,如果一时半会,没有数据来填补这个空缺,那这样就太浪费资源了。所以对于写比较频烦的表,要定期进行optimize()
1.单列排序
单列排序,指对表中某一列进行排序
未使用排序子句
使用排序子句
2.多列排序
同时对表中多个列进行排序
未指定排序
指定排序
多列排序,先将数据按照order by子句后的第一个字段排序,然后再按第二个字段排序......以此得到最重排序结果。其实,按多个列排序时,只有第一个字段中检索出有相同的值时,才会在按照第二个字段对第一列中相同的值对应的行再次排序。
3.指定排序方向
数据默认排序顺序时升序(从a到z,0到9,对于汉字根据采用的编码排序,),为了进行降序排序需要制定关键字desc。
此处可以看到汉字没有按照顺序排序,原因及解决办法请看上面两篇参考文章。
- 注意:desc关键字只作用于直接位于其前的列名,所以想多列排序时都按降序排序,需要对每一列指定desc关键字。
- a与a:大多数dbms中(包括mysql),不区分大小写,即a与a相同,如果你要改变这种相同的顺序,简单的order by子句是无法做到的,需要靠数据库管理员来做一些改变。
(5)order by 与limit组合
仅需一点:order by 应位于 from 后,limit 应位于 order by 后。
(6)where子句
在select语句中,数据根据where子句中制定的条件进行过滤。where子句位于from后,位于order by子句前。
where子句操作符:
like操作符的通配符:
- 百分号(%):表示任何字符出现任何次数('%'不会匹配到值null)
- 下划线(_):匹配单个的任意字符
通配符搜索花费时间更长。所以不要过度使用,除非绝对需要,不要把他们放在开始处,因为这样搜索最慢。
正则表达regexp:
select ... from ... where columnname regexp '正则表达式';
正则表达式参考:
注意:在where子句中如果是与字符串进行比较,则必须将比较值用引号括起来(单引号双引号皆可),与数值比较可以但不必用(无关表中字段类型只看具体值)。在使用like的时候,也可匹配检索数值。
1.与and操作符
使用and操作符给where子句附加条件,检索匹配where子句后的全部条件的行。
2.与or操作符
or关键字检索匹配满足where子句后任意一个条件的行。
3.and与or同时使用
造成这个结果的原因是:sql在处理or操作符之前会优先处理and操作符。也就是说上面被sql理解为,检索password为passd123456且money大于等于500的所有行,或password为123456的所有行。解决办法是 使用圆括号将相应的操作符分组
上一篇: 网站内部优化重要还是外链优化重要?