以下讨论的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|2|3]
匹配特殊字符:使用\\作为前导,\\-表示查找-,\\.表示查找.