1.基本查询(SELECT)
SELECT语句基本格式:
SELECT
{*|<字段列表>}
[
FROM<表1>,<表2>..
[WHERE <表达式>
[GROUP BY<group by definition>]
[HAVING <expression>[{<operator><expression>}...]]
[ORDER BY <order by definition>]
[LIMIT [<offset>,]<row count>]
]
SELECT[字段1,字段2,...,字段n]
FROM[表或视图1]
WHERE[查询条件];
其中,各条子句的含义如下:
{*<字段列表>}包含星号通配符和字段列表,表示査询的字段,其中,字段列表至少包含一个字段名
称,如果要查询多个字段,多个字段之间用逗号隔开,最后一个字段后不加逗号
FROM <表1>,<表2>..,表1和表2表示查询数据的来源,可以是单个或者多个
WHERE 子句是可选项,如果选择该项,将限定查询行必须满足的查询条件,
GROUP BY<字段>,该子句告诉MySQL如何显示查询出来的数据,并按照指定的字段分组;
HAVING过滤分组,GROUP BY可以和HAVING一起限定显示记录所满足的条件,只有满足条
件的分组才会被显示.
[ORDER BY<字段>],该子句告诉MySQL按什么样的顺序显示查询出来的数据,可以进行的排序有
升序(ASC),降序(DESC);
[LIMIT[<offset>,]<row count>],该子句告诉MySQL每次显示查询出来的数据条数
2.单表查询
(1).查询所有字段:
在SELECT中使用*通配符查询所有字段
SELECT查询记录最简单的形式是从一个表中检索所有记录,实现的方法是使用星号(*)通配符指定查询所有列的名称.语法格式如下:
SELECT *FROM 表名;
(2).查询指定字段:
1)查询单个字段
查询表中的某一个字段,语法格式为:
SELECT 列名 FROM 表名:
例2,查询fruits表中f name列所有的水果名称,SQL语句如下:
SELECT f_name FROM fruits;
2)查询多个字段
查询多个字段的语法如下:
SELECT 字段1,字段2..字段名n FROM 表名:
例3:从fruits表中获取f name和f price两列,SQL语句如下
SELECT f_name,f_price FROM fruits;
(3).查询指定记录
在SELECT 语句中,通过WHERE字句可以对数据进行过滤,语法格式为:
SELECT 字段名1,字段名2...,字段名n
FROM 表名
WHERE 查询条件
WHERE条件判断符
例如:
///查询价格为10.2元的水果的名称
SELECT f_name,f_price
FROM fruits
WHERE f_price=10.2;
//查找名称为"apple"的水果的价格
SELECT f_name,f_price
FROM fruits
WHERE f_name='apple';
//查询价格小于10的水果的名称
SELECT f_name,f_price
FROM fruits
WHERE f_price<10;
(4).带in关键字的查询:
IN操作符用来查询满足指定范围内的条件的记录,使用IN操作符,将所有检索条件用括号括起来,检
索条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项,
//查询s_id为101和102的记录,SQL语句如下:
SELECT s_id,f_name,f_price
FROM fruits
WHERE s_id IN(101,102)
ORDER BY fname;
使用NOT来检索不在条件范围内的记录:
//查询所有s id不等于101也不等于102的记录,SQL语句如下
SELECT s_id,f_name,f_price
FROM fruits
WHERE s_id NOT IN(101,102)
ORDER BY f_name;
(5).带BETWEEN AND的范围查询:
用来查询某个范围内的值:
//查询价格在2.00元到10.20元之间的水果名称和价格
SELECT f_name,f_price
FROM fruits
WHERE f_price BETWEEN 2.00 AND 10.20;
BETWEEN AND匹配范围内的所有值,包括开始值和结束值
BETWEEN AND 操作符前可以加关键字NOT,表示指定范围之外的值,
//查询价格在2.00元到10.20元之外的水果名称和价格:
SELECT f_name,f_price
FROM fruits
WHERE f_price NOT BETWEEN 2.00 AND 10.20;
(6)带LIKE的字符匹配查询
我们如果要查找所有包含字符"ge”的水果的名称,需要使用通配符进行匹配查找;
通配符是一种在SQL的WHERE条件字句中拥有特殊意思的字符.SQL语句中支持多种通配符,可以和LIKE一起使用的通配符有'%'和’_'
%通配符可以匹配任意长度的字符,甚至包括零字符
_通配符一次只能匹配一个长度的字符
//fruits表中,查询f name中包含字母'g'的记录
SELECT f_id,f_name
FROM fruits
WHERE f_name LIKE '%g%';//在fruits表中,查询以字母'y'结尾,且'y'前面只有4个字母的记录
SELECT f_id,f_name
FROM fruits
WHERE f_name LIKE '____y';
(7).查询空值:
空值一般表示数据未知,不使用或将在以后添加数据
在SELECT语句中使用IS NULL字句,可以查询某字段内容为空记录
NULL相反的是NOT NULL,该关键字查找字段不为空的记录,
//查询customers表中c email为空的记录的cid,c name和c email字段值
SELECT c_id,c_name,c_email
FROM customers
WHERE c_email IS NULL;//查询customers表中c email不为空的记录的cid,c name和c email字段值
SELECT c_id,c_name,c_email
FROM customers
WHERE c_email IS NOT NULL;
(8).带AND和OR的多条件查询:
//在fruits表中查询s id=101并且f price大于等于5的水果id,价格和名称
SELECT f_id,f_name,f_price
FROM fruits
WHERE s_id='101' AND f_price >=5;
//查询s_id=101或者s_id=102的水果供应商的f_price和f_name,
SELECT s_id,f_name,f_price
FROM fruits
WHERE s_id=101 OR s_id=102;
在这里可以看到,OR操作符和IN操作符使用后的结果是一样的,它们可以实现相同的功能,但是使用
IN操作符使得检索语句更加简洁明了,并且IN执行的速度要快于OR.更重要的是,使用IN操作符可
以执行更加复杂的嵌套查询(后面章节会讲述)
OR可以和AND一起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先
对AND两边的操作数进行操作,再与OR中的操作数结合
(9).查询结果不重复:
可以使用DISTINCT关键字指示MySQL消除重复的记录值.语法格式为:
SELECT DISTINCT 字段名 FROM 表名;
(10).对查询结果排序:
1).单列排序:
//查询fruits表的f name字段值,并对其进行排序
SELECT f_name
FROM fruits
ORDER BY f_name;
2).多列排序:
//查询fruits表的f_name字段和f_price字段,先按f_name排序,再按f_price排序
SELECT f_name,f_price
FROM fruits
ORDER BY f_name,f_price;
在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序.如果第
列数据中所有值都是唯一的,将不再对第二列进行排序.
3).指定排序方向:
默认情况下,查询数据按字母升序进行排序(A~Z),但数据的排序并不仅限于此,还可以使用ORDER
BY对查询结果进行降序排序(Z~A).这可以通过关键字DESC实现.
与DESC相反的是ASC(升序),将字段列中的数据按字母表顺序升序排列,实际上,在排序的时候ASC
是默认的排序方式,所以加与不加都可以;
//查询fruits表的f name字段和f price字段,对结果按f price降序方式排列;
SELECT f_name,f_price
FROM fruits
ORDER BY f_price DESC;//查询fruits表,先按f_price降序排列,再按f_name升序排列;
SELECT f_price,f_name
FROM fruits
ORDER BY f_price DESC,f_name;
DESC排序方式只应用到直接位于其前面的字段上,由结果可以看出
DESC关键字只对其前面的列进行降序排列,在这里只对fprice排序,而并没有对f name进行排序
因此,fprice按降序排列,而f name列仍按升序排列.如果要对多列都进行降序排列,必须要在每
列的列明后面加DESC关键字.