sql语句那些事——你的脸庞渐渐变得清晰

    这几天都在sql中挣扎,有惊奇,有欣喜,渐渐你的脸庞变得不再模糊,在实践中,你的视线渐渐变得清晰。理理思路,整理一下工作中遇到的问题和收获,与大家共享。
1.mysql出现错误“ Every derived table must have its own alias”
 这句话的意思是每个派生出来的表都必须有一个自己的别名。一般会在多表查询的时候,会出现这种错误。因为在嵌套查询的时候子查询出来的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名。
例如sql语句:
select count(*)from(select * from ......) as total;
上面的as total 就是表的一个别名,但是这个别名还是必须的。(PS:多积累一下单词,还是挺有用的。)

2.字符串截取

如下图:


 (1)方法一:substr和Substring 
Mysql中的substring函数和C#中差不多,是用来截取字符串的。不同的数据库中可能稍微有点差别,Mysql和sqlserver中都是substring()。
常用的格式如下:subStr(str,pos):由中选择所有从第n位置开始的字符串。SubStr(str,pos,len):由字符的第n个位置开始,选出接下来的字符。
全部的格式是substr(string string,num start,num length),string 为字符串,start为起始位置,length 为长度。需要注意的是,mysql中的start是从1开始的,不是0 ,我写从0开始就犯错误了。
 例如:
--  substr直接是字符串
 SELECT SUBSTR('20130127',1,4)  as grade  from sc_class_info  as ty
--  substr 参数是字符串
SELECT  SUBSTR(tt.classno ,1,4)  as grade from sc_class_info  as tt
-- substing 的使用方法相同
 SELECT SUBSTRING('20130127',1,4) as grade from sc_class_info as ky

(2)方法二:left和right
left (str,length) 是左截取和right(str,length)是 右截取,表示从左(右)边开始截取,length 是截取的长度。
-- 截取前4位
 SELECT  LEFT ( zy.classno,4) as grade FROM sc_class_info as zy

3.mysql去重。
(1)在项目业务中也用到了sql去重的地方,主要有distinct) 和 groupby
在单表中,distinct用于返回唯一不同的值。
select  distinct sex from B

如果是选择多列,那么选择应该是 两个条件都满足的。也就是 sex和age同时满足才可以查出来。
注意:多个字段放在一起,distinct字段必须放在开头,不然会报错。

(2)groupby一般在多个表查询的时候用的比较多。

SELECT * from sc_class_info   GROUP BY  partno

通过分组之后,partno是1 的全都合并。虽然不报错,但是也有问题。合并之后默认parno和其他行的关系全都变成了一对多的关系,所以现在也理解了经常说的group by和聚合函数在一起,才有意义。

再看sqlserver,直接报错,还是比较好。



刚开始挺郁闷的,在mysql中可以执行的成功,但是sqlserver中就会报错。  经过搜索下面这位老兄跟我遇到了同样的问题,此处便不再赘述。强烈推荐看一下哦。点击打开链接。 出错的原因,还是不理解group  by的工作原理是什么,以后要多动动脑子。
4.Group_concat 函数
正确语法:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
select group_concat(IP) as ip from sc_login_trace tt group by id //得到一组IP地址。

以id 分组,把IP字段的值显示出来,默认是逗号分隔,自己可以设置。

6.limit

在我们查询数据的时候,需要返回前几条数据。或者中间几行数据,那么这个时候mysql里面的limit就很好地帮助了我们。limit子句可以被用于强制select语句返回指定的记录数。limit接收一个或者两个数字参数。参数必须是一个整数常量,如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是0 ,而不是1.

//返回表中的第一条记录。
SELECT * from sc_class_info  as tt  LIMIT 1
2代表从第三行开始选择,选择出来的条数是5行。
SELECT * from sc_class_info  as tt  LIMIT 2,5

小结:
  1.多多使用,多多积累。
  2.有时候没有封装好的东西,挺好的,基础的知识多练习。



评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值