Select检索数据
数据查询语言DQL
简单查询
Select语句语法
Select
[distinct | all ]
查询的字段列表
from 查询的表列表
[where 条件语句]
[group by 子语 ]
[having 子语 ]
[order by 排序条件 ]
创建一个比较简单的表来学习简单sql查询:
create table test
(
id int ,
Name varchar(50),
num int ,
Time datetime,
Date date
)
INSERT INTO test VALUES (2, '刘岗', 2, '2016-9-18 11:54:26', '2016-6-2');
INSERT INTO test VALUES (3, '李安平', 3, '2016-9-18 11:54:32', '2016-9-14');
INSERT INTO test VALUES (4, '吴平台', 4, '2016-9-18 11:54:36', '2016-7-15');
INSERT INTO test VALUES (5, '张可可', 5, '2016-9-18 11:54:40', '2016-6-16');
INSERT INTO test VALUES (6, '陈如', 6, '2016-9-18 11:54:51', '2016-6-24');
INSERT INTO test VALUES (1, '吴顺', 1, '2016-9-18 11:55:15', '2016-8-11');
INSERT INTO test VALUES (7, '李渐立', 7, '2016-9-18 11:55:41', '2016-9-25');
比较运算符
=
>
>=
<
<=
<>,!= 不等于
select * from test where num >3
查出4,5,6
日期比较
select * from test where date > '2016-08-01'
结果:
逻辑运算符
and
select * from test where date > '2016-08-01' and date <'2016-08-15' and num = 1
结果:
And表示被查询的数据要满足所有的条件,才查出数据
Or
select * from test where date > '2016-08-01' or num =2
结果:
Or表示只要一个条件成立就才查出相应的数据
()的运算优先级
select * from test where num > 2 or date > '2016-06-13' and date < '2016-08-11'
结果:
select * from test where ( num > 2 or date > '2016-06-13' ) and date < '2016-08-11'
结果:
以上两个sql 用了or ,但是加上 () 和没加 () 的结果有差别。
()的运算优先级高于and
Not 表示非,取反的意思。Not 放在哪个条件前面,表示后面的一个条件组成的结果取反
select * from test where not num =2
表示num=2 的结果取反
结果:
select * from test where num = 7 or not date > '2016-09-13'
表示date > '2016-09-13' 的结果取反,查出的是小于9.13的数据 而num=7没有not 就不取反,即便时间大于13,也查出来
结果:
范围查询in
select * from test where num = 1 or num = 2 or num = 4
同等于:select * from test where num in (1,2,4)
取反 select * from test where not num in (1,2,4)
Or表示是满足某些指定条件, 如果条件很多,那么or就过长冗长,此时用in () 就很方便。
like模糊查询
%表示通配
select * from test where `name` like '李%'
结果:
select * from test where `name` like '%平%'
结果:
_表示匹配一个字符
select * from test where `name` like '陈_'
结果:
select * from test where `name` like '李__'
结果:
Null查询
先将一行数据设置为null
update test set num = null where id = 1
select * from test where num is null
结果:
Num是null的数据就会被查出
select * from test where num is not null
结果:
num是null的数据就不会被查出
范围查询betwwen ... And
select * from test where num BETWEEN 3 and 6
查出num的值从3到6的,包括3和6
同等于
select * from test where num >=3 and num <= 6
去重复字段查询distinct
先修改出一个相同的数据
update test set num =2 where id = 1
select num from test
以上结果中有两个2
使用DISTINCT 之后,重复的2就会不展示出来,这就是数据去重
select DISTINCT num from test
结果:
as 别名
as 是给列名取别名
select name as 名称 , num as 数量 from test
结果:
Order by 排序
order by .. desc 降序
order by .. asc 升序
select * from test order by num desc
按 num 降序
select * from test order by num asc
按 num 升序
注:1,null值在排序时被当成是最小值
2,当order by 后不带desc 或asc时 默认是升序
如:select * from test order by num
结果:
以列的位置来排序
select name , num ,id from test order by 3 asc
表示以查出来的第3列来排序,这里的第3列是id, 就相当于以id来排序。
结果:
还可以以别名来排序
select name as 名称 , num as 数量 from test order by 数量 desc
结果:
使用多个字段排序
select * from test order by num,name asc
按第一个字段进行排序,当第一个字段有重复的值时再对这些数据进行第二个字段排序。
嵌套查询
设计一个电商购物平台的案例来学习强大的select检索语句