sql的 select

Posted 暗夜独狼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql的 select相关的知识,希望对你有一定的参考价值。

select *(列名) from table_name(表名) where column_name operator value 。

select * from stock_information where stockid = str(nid)

 

sql中的通配符:

 
通配符描述
% 匹配零个及多个任意字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符

[^charlist]  或者       [!charlist]

不在字符列中的任何单一字符

 

 

 

 

 

 

 

只能在使用 like 关键字的中使用通配符

例子:

原始的表 (用在例子中的):

Persons 表:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

 

 

 

从上面的 "Persons" 表中选取居住在以 "Ne" 开始的城市里的人:

SELECT * FROM Persons WHERE City LIKE \'Ne%\'  

结果集:

IdLastNameFirstNameAddressCity
2 Bush George Fifth Avenue New York

 

例子 2 我们希望从 "Persons" 表中选取居住在包含 "lond" 的城市里的人:

SELECT * FROM Persons WHERE City LIKE \'%lond%\'

结果集:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London

 使用 _ 通配符

例子 1  :我们希望从上面的 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人:

 SELECT * FROM Persons WHERE FirstName LIKE \'_eorge\'

结果集:

IdLastNameFirstNameAddressCity
2 Bush George Fifth Avenue New York

例子 2 ,我们希望从 "Persons" 表中选取的这条记录的姓氏以 "C" 开头,然后是一个任意字符,然后是 "r",然后是任意字符,然后是 "er":

 SELECT * FROM Persons WHERE LastName LIKE \'C_r_er\'

结果集:

IdLastNameFirstNameAddressCity
3 Carter Thomas Changan Street Beijing

使用 [charlist] 通配符

我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:

 SELECT * FROM Persons WHERE City LIKE \'[ALN]%\'

结果集:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

例子 2  我们希望从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:

 SELECT * FROM Persons WHERE City LIKE \'[!ALN]%\'  或者  [^ALN]

结果集:

IdLastNameFirstNameAddressCity
3 Carter Thomas Changan Street Beijing

  order by stockid desc(asc) --------- 排序, desc-降序, asc-升序
  order by 1,2 --------- by 列号
  stockname = (select stockname from stock_information where stockid = 4)  子查询:除非能确保内层 select 只返回一个行的值, 否则应在外层 where 子句中用一个 in 限定符
  
select distinct column_name form table_name --------- distinct 指定检索独有的列值, 不重复查询

select stockname , count(*)  as "number"  from table_name group by stockname     --------- group by 将表按行分组,指定列中有相同的值

,Group By + [分组字段](可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。

having count(*) = 2 --------- having 选定指定的组

例子:   比如有如下数据集,其中水果名称(FruitName)和出产国家(ProductPlace)为联合主键:

 
FruitName ProductPlace Price
apple China 5
apple Japan 8
apple USA 4
Orange China 6
Banana China 12
Orange USA 8
     

   如果我们想知道每个国家有多少种水果,那么我们可以通过如下SQL语句来完成:

  SELECT  COUNT(*)  AS "水果种类" , ProductPlace  AS "出产国"  FROM  table  GROUP  BY  ProductPlace
  这个SQL语句就是使用了Group By + 分组字段的方式,那么这句SQL语句就可以解释成“我按照出产国家(ProductPlace)将数据集进行分组,然后分别按照各个组来统计各自的记录数量。”
 

  值得注意的是结果集中有两个返回字段,一个是ProductPlace(出产国), 一个是水果种类。

如果我们这里水果种类不是用Count(*),而是类似如下写法的话:

SELECT  FruitName,ProductPlace  FROM table  GROUP  BY  ProductPlace

那么SQL在执行此语句的时候会报如下的类似错误:  选择列表中的列\'T_TEST_FRUITINFO.FruitName\'无效,因为该列没有包含在聚合函数或GROUPBY子句中。

 这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。 将Group By操作想象成如下的一个过程,首先系统根据SELECT 语句得到一个结果集,如最开始的那个水果、出产国家、单价的一个详细表。然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。这个时候剩下的那些不存在于Group By语句后面作为分组依据的字段就有可能出现多个值,但是目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregate functions)了。

常见的聚合函数如下表:

 

函数作用支持性
sum(列名) 求和     
max(列名) 最大值     
min(列名) 最小值     
avg(列名) 平均值     
first(列名) 第一条记录 仅Access支持
last(列名) 最后一条记录 仅Access支持
count(列名) 统计记录数 注意和count(*)的区别

 Group By All [expressions] :

Group By All + 分组字段, 这个和前面提到的Group By [Expressions]的形式多了一个关键字ALL。这个关键字只有在使用了where语句的,且where条件筛选掉了一些组的情况才可以看出效果。

如果使用ALL关键字,那么查询结果将包括由GROUP BY子句产生的所有组,即使某些组没有符合搜索条件的行。没有ALL关键字,包含GROUPBY子句的SELECT语句将不显示没有符合条件的行的组。

 

首先我们不使用带ALL关键字的Group By语句:

SELECT COUNT(*) AS 水果种类, ProductPlace AS 出产国 FROM t WHERE(ProductPlace<>\'Japan\') GROUP BY ProductPlace

那么在最后结果中由于Japan不符合where语句,所以分组结果中将不会出现Japan。

 

现在我们加入ALL关键字:

SELECT COUNT(*) AS 水果种类, ProductPlace AS 出产国 FROM t WHERE(ProductPlace<>\'Japan\') GROUP BY ALL ProductPlace

重新运行后,我们可以看到Japan的分组,但是对应的“水果种类”不会进行真正的统计,聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。

 

 GROUP BY [Expressions] WITH CUBE | ROLLUP:

这个暂时没看,不过想看的话 可以看看这两个,两位都做了总结:  http://www.cnblogs.com/glaivelee/archive/2010/11/19/1881381.html       http://blog.csdn.net/dreamwbt/article/details/53437118    

 

Group By 和 Having, Where ,Order by语句的执行顺序:

当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:
--执行where子句查找符合条件的数据;
--使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。
--having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.
--having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
--having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

--然后按照Order By语句对视图进行排序,这样最终的结果就产生了。只有在Order By语句中才可以使用最终视图的列名

SELECT FruitName, ProductPlace, Price, ID AS IDE, Discount FROM table WHERE(ProductPlace=\'china\') ORDER BY IDE

这里只有在ORDER BY语句中才可以使用IDE,其他条件语句中如果需要引用列名则只能使用ID,而不能使用IDE。

 

8、Having与Where的区别

  • where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
  • having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

示例8

select 类别, sum(数量) as 数量之和 from A
group by 类别
having sum(数量) > 18

示例9:Having和Where的联合使用方法

select 类别, SUM(数量)from A
where 数量 gt;8
group by 类别
having SUM(数量) gt; 10

 

以上是关于sql的 select的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Mybatis

6.mybatis里面的动态sql是怎么设定的,常用标签有那些以及其

Mybatis动态sql

sql数据库截取字符串函数

sql sql里面的代码片段

在 Rails 上为连接、限制、选择等(不是条件)的 SQL 片段安全地转义字符串