插入数据:
insert into table123 (oid,Name) values (0,'陈灰灰');
insert into table123 (oid,Name) values (1,'董老师');
insert into table123 (oid,Name) values (2,'周杰伦');
insert into table123 (oid,Name) values (3,'陈灰灰');
insert into table123 (oid,Name) values (4,'董老师');
insert into table123 (oid,Name) values (5,'周杰伦');
需求:对查询到的 Name 去重后用 Oid 进行排序.
Sqlite中 Distinct 和 order by 好像是可以同时直接使用的,查出来的值没有重复的.
select distinct(Name) from table order by Oid
冲突: 可是当我在 Sqlserver和Access的数据库里使用上面的查询语句,发现就出现如下错误:
查资料说是 : ① Sqlserver和Access中的 distinct 的执行顺序高于 order by
② Sqlserver和Access中的 distinct 执行时会对查询的值进行先去重,产生一张去重了的虚拟的临时表
③ Sqlserver和Access中的 order by执行时对已经去重的虚拟临时表按照 Oid 进行排序,产生新的虚拟临时表
最后 : 如果order by的字段不在select中,执行sql语句时首先执行distinct,之后产生的虚拟临时表中没有order by的字段,所以再执行order by时会报错。(此处引用:
icebangbang
)
所以是 distinct和order by的执行顺序不一样所导致的,所以查出来的值里虽然按照oid排序了,但是有重复的 Name 值。
要解决上面的问题,可以使用另一个函数(Max或者Min)来帮助完成查询.
Sqlserver 和 Access 数据库代码:
select Name from table group by Name order by Max(Oid) asc
这样就可以很好的查询出按照Oid排序的不同 Name 值了,Name值也不会重复出现了。
或者这样写试试 : select * from(select distinct xxx from 表名) d order by d.列名; (
先去重,再排序
)
所创建的一个表:创建表:CREATE TABLE table( Oid int primary key, Name varchar(10))插入数据:insert into table123 (oid,Name) values (0,'陈灰灰');insert into table123 (oid,Name) values (1,'董老师');insert into ta...
上一篇:【
SQL
基础(一)】【
SQL
简介+
SQL
语法+
SQL
SELECT 语句+
SQL
SELECT
DISTINCT
语句】
文章目录
SQL
WHERE 子句引号的
使用
SQL
AND & OR 运算符
SQL
ORDER
BY 子句
SQL
WHERE 子句
WHERE 子句用于规定选择的标准。
如需有条件地从表
中
选取数据,可将 WHERE 子句添加到 SELECT 语句。
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
可在 WHERE 子句
中
使用
的运算符
使用
WHERE 子句
如果只希望选取居住在城市 “北京”
中
的人,我们需要向 SELECT
My
SQL
通常
使用
GROUPBY(本质上是排序动作)完成
DISTINCT
操作,如果
DISTINCT
操作和
ORDER
BY操作组合
使用
,通常会用到临时表.这样会影响性能. 在一些情况下,My
SQL
可以
使用
索引优化
DISTINCT
操作,但需要活学活用.本文涉及一个不能利用索引完成
DISTINCT
操作的实例.
实例1
使用
索引优化
DISTINCT
操作
create table m11 (a int, b int, c int, d int, primary key(a)) engine=INNODB;
insert into m11 values (1,1,1,1),(2,2,2,2),(3,3
(5)SELECT (5-2)
DISTINCT
(5-3)TOP(<top>)(5-1) <select_list>
(1)FROM (1-J) <left> <join> JOIN <right> on <on>
(2)WHERE <where>
(3)GROUP BY <group>
(4)HAVING <having>
(6)
ORDER
BY <
order
>;
每一步都会生成一个虚拟表,该虚拟表会作为下一步的输入。
大型数据库Oracle,Sybase(包括
SQL
AnyWhere),DB2,MS_
SQL
中
型数据库MS_Access,My
SQL
桌面型数据库Paradox,DBF系列数据库,MS_Execl,Text
其他支持
SQL
92标准的数据库
2、数据库的连接采用ADO连接,因此无需安装和卸载
3、支持
SQL
查询语句绝大部分语法
3.1 选择字段
3.1.1 Select [All] [
Distinct
];
3.1.2 特殊语法,记录条数限定Top(MS_
SQL
),Rownum(Oracle),
Limit(My
SQL
),Set RowCount(Sybase))
3.1.3 字段表达式或者计算字段
3.2 选择表 (From)
3.3 条件筛选 (Where)
3.4 分组 (Group By)
3.5 组内条件 (Having)
3.6 排序 (
Order
By)
3.7 数据表的内连接、外连接
3.7.1
SQL
92 标准:Inner Join、Left Join、Right Join、Full Join,
3.7.2 特殊语法:*=、=*、*=*(MS_
SQL
,Sybase),(+)(Oracle)
3.8 联合 (Union [All],Minus,Intersect)
3.9 字段别名,数据表别名
3.10
SQL
子查询表,内嵌
SQL
子句
4、粘贴字段、系统函数
5、
SQL
查询语句反向分析,
无论多么复杂的语句,都能分析得出来
包括上面提到的所有
SQL
语法
6、
SQL
文件拖放,然后反向分析
7、数据库视图创建和重建(目前仅支持Oracle,Sybase,MS_
SQL
)
8、附加Delphi 5和Delphi 6的控件包,支持Delphi 5,6开发环境
9、
SQL
语句智能换行
10、其他功能
10.1
SQL
文件保存、打开
10.2 支持多个数据库连接
10.3
SQL
语句关键词高亮度显示
10.4 简单
SQL
查询语句转换为Delete,Update,Insert语句
在
sql
中
当
order
by和
distinct
同时
使用
时,如果指定了 SELECT
DISTINCT
,那么
ORDER
BY 子句
中
的项就必须出现在选择列表
中
。例如:
select
distinct
id from table_name
order
by number desc;运行时往往会报错。因为在
order
by
中
出现的number没有在select
distinct
中
出现,...
文章目录1、为表起别名as2、查询前n部分数据:top n 列名:表示查看前n行3、排序:
order
by 列名1 asc(升序)|desc(降序),列名1 asc|desc…4、消除重复行:
distinct
5、条件查询:写在where后面6、模糊查询:用于处理字符串类型的值,运算符包括:like % _ [] ^7、null的判断:
使用
is null或is not null,与其它值计算时返回null,排序时null被认为是最小8、连接:join 表名 on 关联条件9、聚合函数:对行数据进行合并10、开窗函数: over()11、分组:group by 列名1,列名2…
1、为表起别名as
当select子句
使用
distinct
关键字时,可能会与
order
by子句冲突,从而产生如下错误
错误:ORA-01791: not a SELECTed expression
根据
sql
语句的执行顺序,
distinct
的执行顺序优先于
order
by,因此
distinct
对select的字段去重后,
order
by只能在
distinct
后返回的结果集进行排序
因此
order
by 后的字段如...