2019-09-09 SQL功能语句收集+laravel 分组统计

1、创建数据库

CREATE DATABASE database-name

2、删除数据库

drop database dbname

3、说明:创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)**

3.1根据已有的表创建新表:

A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only

4、增加一个列

Alter table tabname add column col type

5、添加主键:

Alter table tabname add primary key(col) 

5.1、删除主键:

 Alter table tabname drop primary key(col) 

6、创建索引

create [unique] index idxname on tabname(col….) 

6.1、删除索引:

drop index idxname

注:索引是不可更改的,想更改必须删除重新建。

7、创建视图:

create view viewname as select statement

7.1删除视图:

drop view viewname

8、几个简单的基本的sql语句

选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1

9、说明:几个高级查询运算词

A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALLUNION一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1就是来自 TABLE2
B:EXCEPT 运算符
EXCEPT运算符通过包括所有在TABLE1 中但不在 TABLE2中的行并消除所有重复行而派生出一个结果表。当 ALLEXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C:INTERSECT 运算符
INTERSECT运算符通过只包括 TABLE1TABLE2中都有的行并消除所有重复行而派生出一个结果表。当ALLINTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。

10、使用外连接

A、left (outer) join
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:right (outer) join
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full/cross (outer) join
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

11、改数据库的名称:

sp_renamedb 'old_name', 'new_name'

批量替换sql
update 表名 set 指定字段 =replace(指定字段,'要替换的字符串','想要的字符串') where条件;
例子:
update `t_user` set url =replace(url,'192.168.','222.222.') ;

12、CONCAT函数:用于将两个字符串连接起来,形成一个单一的字符串。

举例:查询当前系统时间
正常查询:select current_date ;
添加前缀:select CONCAT("系统时间:",current_date);
添加后缀:select CONCAT(current_date,",aaa");
代码

select concat ("系统时间:",current_date) as info from data_db;
12、去重统计
select count(distinct 去重字段) from 表

查找表中多余的重复记录,重复记录是根据单个字段(order_key )来判断

select * from eb_credit
where order_key in (select order_key from eb_credit group by order_key having count(order_key) > 1)

删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

delete from people 
where peopleId  in (select peopleId  from people group by peopleId having  count(peopleId) > 1)
and rowid not in (select min(rowid) from   people group by peopleId  having count(peopleId )>1)

查找表中多余的重复记录(多个字段)

select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from vitae a
where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seqhaving count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq havingcount(*)>1)

查找表中多余的重复记录(多个字段),不包含rowid最小的记录

select * from vitae a
where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seqhaving count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq havingcount(*)>1)

结果:


image

image

image

laravel 分组统计

EventInfo::select('ajly', DB::raw('count(*) as num'))->where('wg_id', $wg_id)
            ->groupBy('ajly')
            ->get()->toArray();

SQL语句统计每天、每月、每年的 数据

1、每年
select year(ordertime) 年,
sum(Total) 销售合计
from 订单表
group by year(ordertime)
  
2、每月
select year(ordertime) 年,
month(ordertime) 月,
sum(Total) 销售合计
from 订单表
group by year(ordertime),
month(ordertime
  
3、每日
select year(ordertime) 年,
month(ordertime) 月,
day(ordertime) 日,
sum(Total) 销售合计
from 订单表
group by year(ordertime),
month(ordertime),
day(ordertime)
  
另外每日也可以这样:
select convert(char(8),ordertime,112) dt,
sum(Total) 销售合计
from 订单表
group by convert(char(8),ordertime,112)

找出当前是哪个月用 dataprat

创建一个FOR循环,一个个来扫描,扫描时用数据列占用日期的部份COUNT(*)就可以了

select @i, count(*) where @ i=datepart(mm,dd)

SQL 一年内每月数据统计

SELECT YEAR(insert_time) AS year,
MONTH(insert_time) AS month,
count(*) as count
FROM tb1
WHERE YEAR(insert_time)=2019
GROUP BY YEAR(insert_time), MONTH(insert_time);
 //按天统计
 select count(dataid) as every_day_ num,sum()from tab1 where group by trunc(createtime, 'DD'))

//按自然周统计
select to_char(date, 'iw " ) ,sum()from tab1 where group by to_char(date, "iw ')

//按自然月统计
select to_char(date, 'mm " ) ,sum( )from tab1 where group by to_char(date , ' mm ' )

// 按季统计
select to_char(date, 'q' ) ,sum()from tab1 where group by to_char(date, "q ')

//按年统计
select to_char(date, ' yyyy " ) , sum()from tab1 where group by to_char(date , ' yyyy ')

数据库查询某年数据(sql server)

select *from 表名 where YEAR(存时间的字段名) =某年
select *from News where YEAR(create_time) =2017
//查询某月
MONTH( create_time )= 月份
MONTH( create_time )= 8

DAY()示例1:

使用DAY()功能并从指定的日期获取月份中的日期。

SELECT DAY('2020/01/02');
输出:2
示例-2:

将DAY()函数与变量一起使用,并从指定的日期获取月份中的某天。

DECLARE @date VARCHAR(50);
SET @date = '2020/01/05';
SELECT DAY(@date);
输出:5
示例3:

使用带有日期作为参数的DAY()函数,其中还包括时间。

SELECT DAY('2018/11/22 07:44');
输出:22
示例4:

使用带有变量和日期作为参数的DAY()函数,该参数还包括时间。

DECLARE @date VARCHAR(50);
SET @date = '2020/11/30 23:59';
SELECT DAY(@date);
输出:30

DATEPART()

DATEPART ( datepart , date )

//以整数值的形式返回日期的指定部分。此部分由datepart 来指定。

DATEPART (dd, date) 等同于DAY (date)

DATEPART (mm, date) 等同于MONTH (date)

DATEPART (yy, date) 等同于YEAR (date)

日期部分 缩写

年份            yy、yyyy 

季度            qq、q 

月份            mm、m 

每年的某一日    dy、y 

日期            dd、d 

星期            wk、ww 

工作日*         dw

小时            hh 

分钟            mi、n 

秒              ss、s 

毫秒            ms

SQL查询当天、本周、本月记录详解

--查询当天:

select * from info where DateDiff(dd,datetime,getdate())=0      

--查询24小时内的:

select * from info where DateDiff(hh,datetime,getDate())<=24      

--info为表名,datetime为数据库中的字段值

--查询当天:

select * from table where DateDiff(dd,datetime,getdate())=0 --查询24小时内的: select * from table where DateDiff(hh,datetime,getDate())<=24  

--table 为表名,datetime为数据库中的字段值

DATEDIFF 函数:
语法:

select * from table where DateDiff(dd,datetime,getdate())=0 --查询24小时内的: select * from table where DateDiff(hh,datetime,getDate())<=24  

备注:
enddate 减去 startdate。如果 startdate 晚于 enddate,则返回负值。
如果结果超出整数值范围,则 DATEDIFF 将产生错误。对于毫秒,最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒,最大数是 68 年。
跨分钟、秒和毫秒等边界计算的方法使得 DATEDIFF 指定的结果在所有数据类型中均一致。结果是带正负号的整数值,它等于跨第一个和第二个日期间的 datepart 边界数。例如,在 1 月 4 日(星期日)和 1 月 11 日(星期日)之间的星期数是 1。

--本月记录

SELECT * FROM 表 WHERE datediff(month,[dateadd],getdate())=0      

--本周记录

SELECT * FROM 表 WHERE datediff(week,[dateadd],getdate())=0      

--包括本年这些查询方式是一样的

--本月记录

SELECT * FROM 表 WHERE datediff(month,[dateadd],getdate())=0  

--本周记录

SELECT * FROM 表 WHERE datediff(week,[dateadd],getdate())=0   

--包括本年这些查询方式是一样的

sql server中的时间函数

  1. 当前系统日期、时间

select getdate()

  1. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值
    例如:向日期加上2天
select dateadd(day,2,'2004-10-15')   --返回:2004-10-17 00:00:00.000  
  1. datediff 返回跨两个指定日期的日期和时间边界数。
select datediff(day,'2004-09-01','2004-09-18')    --返回:17  
  1. datepart 返回代表指定日期的指定日期部分的整数。
SELECT DATEPART(month, '2004-10-15')   --返回 10  
  1. datename 返回代表指定日期的指定日期部分的字符串
SELECT datename(weekday, '2004-10-15')   --返回:星期五  
  1. day(), month(),year() --可以与datepart对照一下
select 当前日期=convert(varchar(10),getdate(),120),当前时间=convert(varchar(8),getdate(),114)  
select datename(dw,'2004-10-15')  
select 本年第多少周=datename(week,'2004-10-15')  
//今天是周几=datename(weekday,'2004-10-15')  

举例:

1.GetDate() 用于sql server :select GetDate()
2.DateDiff('s','2005-07-20','2005-7-25 22:56:32')返回值为 514592 秒
DateDiff('d','2005-07-20','2005-7-25 22:56:32')返回值为 5 天
3.DatePart('w','2005-7-25 22:56:32')返回值为 2 即星期一(周日为1,周六为7)
DatePart('d','2005-7-25 22:56:32')返回值为 25即25号
DatePart('y','2005-7-25 22:56:32')返回值为 206即这一年中第206天
DatePart('yyyy','2005-7-25 22:56:32')返回值为 2005即2005年

判断表存在不存在:

select   count(*)   from   sysobjects   where   type='U'   and   name='你的表名'   

判断字段存在不存在:

select   count(*)   from   syscolumns  
where   id       =   (select   id   from   sysobjects   where   type='U'   and   name='你的表名')      
and       name   =   '你要判断的字段名'  

SQL当前日期获取技巧

一个月第一天的SQL 脚本:

SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)  

本周的星期一

SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)  

一年的第一天

SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)  

季度的第一天

SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)  

当天的半夜

SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

上个月的最后一天

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) 

SQL将一个表中的某些字段更新到另一个表中(多表联合更新)

自定义的 sql
update zhxx,rkxx
set zhxx.rk_id=rkxx.id
where zhxx.zjbh=rkxx.zjbh
  • user表
userId username password sex addr phone
1 张珊 123 北京市 1562356586
2 李思 456 北京市 1562354256
3 王武 789 北京市 1562345544
4 王柳 113 北京市 1562445778
  • score表
scoreId userId username score course phone
1 1 80 语文
2 1 85 数学
3 3 52 语文
4 2 67 数学

现在score表中的username和phone字段是空的,需要从user表中,查找出相应的值插入score表中,SQL语句如下:

update score,user
set score.username=user.username,score.phone=user.phone
where score.userId=user.userId

或者

update score join user on score.userId=user.userId
set score.username=user.username,score.phone=user.phone 

sql 获取 从右到左 截取。

rk_id=RIGHT(b.id,1)

感谢提供参考:
https://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html
https://www.cnblogs.com/ray-mr-huang/p/10389246.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 经典MSSQL语句大全和常用SQL语句命令的作用 下列语句部分是Mssql语句,不可以在access中使用。 SQ...
    Keropok阅读 2,424评论 0 30
  • 一、基础 1、创建数据库(create) CREATE DATABASE database-namecreate ...
    YBshone阅读 659评论 0 1
  • 基础 创建数据库 CREATE DATABASE database-name 删除数据库 drop databas...
    RoronoaZoro丶阅读 437评论 0 0
  • SQL语句参考,包含Access、MySQL 以及 SQL Server 基础 创建数据库 CREATE DATA...
    清茶了了_阅读 1,585评论 0 2
  • 1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop dat...
    sakura_L阅读 397评论 0 6