SQL(mysql)必知必会(2)检索数据

以下讨论的DBMS全是mysql

检索数据

以world中city表为例

检索单个列select name from city

仔细对比会发现结果是无序的,跟原始表单中的顺序并不是互相对应的。

 

结束SQL的语句,多条SQL语句必须以分号(;)分隔,MySQL如同多数DBMS一样,并不需要加上;,但是加上也没有坏处。

但是如果使用的是mysql的命令行必须要加上;来结束SQL语句。

 

SQL语句和大小写:SQL并不区分大小写,但是区分大小写更容易阅读和理解。值得注意的是有些标识符需要区分大小写(数据库、表、列名)等。

使用空格:在处理SQL语句时,其中所有的空格都被忽略,所以可以把SQL分成多行便于阅读。

 

 

检索多个列:select name,ID,Population from city;

注意:这里使用逗号分开,但是逗号不能加错位置。

 

但是如图所示,查询的结果仍旧不是原数据的结构组织。

检索出所有的列select * from city;

检索出不同的行select distinct Isofficial from countrylanguage;

Distinct 去除了结果中的重复值,只显示唯一值。

限制结果

Select语句返回的结果是所有的,为了返回第一行或者前几行可以使用limit子句。

select name from city limit 6;返回结果为6条

为得出下一个6行,可以指定检索开始行和行数

select name from city limit 6,6;

 

注意:

行0:检索出来的第一行为行0而不是行1,因此limit1将检索出来第二行

在行数不够时:MYsql将只返回它能返回的那么多

MySQL5以后limit3,4=limit4offset3

 

使用完全限定的表名

select city.Name from world.city;

在数据库world中选择表city的行name

排序检索数据

检索出的数据并不是以纯粹的随机顺序显示,如果不排序,数据一般将以它在底层的表中出现的顺序显示,这可以是数看,据添加到表中的顺序。

子句(clause)SQL语句由子句构成,有些子句是必须的,而有一些是可以选的。

为了明确排序用select语句检索出的数据,可以使用order by子句。Order by子句取一个或多个列的名字,据此对输出进行排序。

 select name,ID from city order by ID;

 

按照多个排序

只需要制定列名,列名之间用逗号分开即可。

 select name,ID,population from city order by Population,name;

 

 

 

 

数据的排序方式默认为升序排序(从A到Z),也可以用order by 进行降序排序,此时需要指定DESC关键词。

select name,ID from city order by ID desc;

 

select name,ID,population from city order by Population desc,ID;

 

如果想在多个列上进行将序排列,一定要将每个列都指定DESC关键字。

与DESC相对应的是升序ASC,但是升序一般是默认,很少会用到。

Order by和limit组合可以找出一个列中的最高或者最低的值。(limit在order by后边)

select name,ID,population from city order by Population desc limit 1;

得出的结果是人口最多的ID。

过滤数据

数据库表一般包含大量的数据,很少需要检索表中的所有行,通常根据特定的操作报告需求提取表数据的子集,只检测所需数据需要指定搜索条件,也称为过滤条件。

在同时使用where和order by时,where优先在前,否则会报错。

操作符

说明

=

等于

<>

不等于

!=

不等于

<

小于

<=

小于等于

>

大于

>=

大于等于

BETWEEN

在指定的两个值之间

检查单个值select name,ID,population from city where ID =5;

检查某个条件

select name,ID,population from city where population >= 1000000;

不匹配检查

select * from city where countrycode <> "JPN";

剔除countrycode 为JPN的数据

范围值检查select * from city where ID between 6 and 10;

筛选出ID从6至10的数据。

筛选出空值:select * from city where District is null;

为了进行更强的过滤控制,MySQL允许给出多个WHERE子句,有两种方式使用:以AND子句方式或OR子句方式使用。

操作符(Operator):用来联结或改变WHERE子句中的子句的关键词。也称为逻辑操作符(logical operator )。

AND操作符

为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。

select * from city where countrycode ="TWN"and population<=160000;

OR操作符

与AND操作符不同,匹配任意条件即可。

select * from city where countrycode ="TWN" or countrycode ="AIA";

计算次序

Where可以包含任意数目的AND或OR操作符,允许两者进行复杂或者高级的过滤。

但是SQL像多数语言一样,在处理OR操作符前,优先处理AND操作符。

解决方案是用圆括号明确的分组相应的操作符,消除分歧。

IN操作符:用来指定条件范围,范围中的每一个条件都可以进行匹配。IN取合法值的由逗号分隔清单都在圆括号中。

select * from city where ID in (1,2,10) order by population;

注意,这里只有ID为1,2,10的三条数据。

IN操作符的优点:

在使用长的合法选项清单时,IN操作符的语法更清楚更直观。

在使用IN时,计算的次序更容易管理。

IN操作符一般比OR操作符清单执行更快。

IN最大的优点是可以包含其他select语句,使得能够更动态的建立where子句。

NOT操作符:否定后跟条件的关键字。

用通配符进行过滤

通配符:用来匹配值的一部分特殊字符。

搜索模式:由字面值、通配符或两者组合成的搜索条件。

通配符本身是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。为在搜索子句中使用通配符,必须使用LIKE操作符。

LIKE指示MySQL后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

百分号(%)通配符

最常使用的通配符是百分号%,在搜索串中,%表示任何字符出现任意次数。

select * from city where name like'ka%';

 

注意:这里的搜索根据MySQL的配置方式是可以区分大小写的。

‘%ka%’表示匹配中间有ka的文本,不管他前后出现什么内容。‘s%e’表示匹配以s开头e结尾的对象,%除了一个或多个字符外还能匹配0个字符。

注意null:%不能匹配null。

划线通配符(-),但是下划线的用途与%一样,但是下划线只匹配单个字符。

通配符使用技巧:不要过度使用通配符。

用正则表达式进行搜索

select * from city where population regexp '.8000';

 

LIKE与REGEXP有很大的区别,且REGEXP匹配不分大小写,如区分大小写可以用BINARY等关键字。

LIKE 匹配整个列,如果匹配的文本在列值中出现,LIKE不会找到它。

进行OR匹配

 

匹配几个字符之一

  1. =[1|2|3]

匹配特殊字符:使用\\作为前导,\\-表示查找-,\\.表示查找.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章