sql 语法 函数 【vaynexiao】

group by having count

select deptid,count(*) from pcmc_user group by deptid;
–根据一个或者多个字段的组合来分组
select deptid ,max(deptid) from pcmc_user group by deptid having deptid > 100;
–group by的条件有哪些,select就只能查出对应的字段 以及 聚合函数
–having 是对分组后的数据刷选,having子句中可使用聚合函数

select userid,username,
CASE
when phone is not null THEN
 'phone is not null'
when phone is  null THEN
'phone is null'
else '' END
from pcmc_user
group by userid,username,phone

–注意:此处的phone也必须写在group by中

case when else end

1,可以不写else但是一定要有end ,没有else如果不满足条件会以null填充
2,报错:CASE 说明中的任一结果表达式均不能是NULL
解释:满足第一个when就赋值为null,没写else就默认不满足所有when时指定值为null,这样这一列就一定全部是null,无意义,所以报错,
解决方法:加一个when 且 then 是非null值,这样sql会认为可能这样sql认为可能会出现非null值,这一列有意义了,就不报错;哪怕没有满足frozen is null,真实的结果是这一列全部null,也不报错,程序不看真实结果,只会验证理论上是否合理。

select * from pcmc_user where 1=(case when 1=1 then 1 else 2 end)

–一般case when是作为字段来select,此时作为一个where条件,即一个值

top 5 / top 5 percent

select top 5 percent * from pcmc_user – 注意*,不用*就得写明确字段
– top 5 表示返回前五行记录 top 5 percent 表示返回前5%记录

newid()

select top 5 * from pcmc_user order by newid()
–只返回根绝new出的列id返回前5行,注意newid()每次生成的值是随机的,如:8E913070-D630-4F2D-991E-1B4EC309BE8B
–所以如果需要固定顺序就必须有其他排序方式

select name from sysobjects where type=‘U’;

–列出数据库里所有的表名 U代表用户

select name from syscolumns where id=object_id(‘fruits’);

–列出表里的所有的列名

truncate table table_name;

–格式化表,即清空数据

distinct 记录去重

select distinct year_id,offcer_name FROM review_kpi_config --以多行组合后的值作为检测是否唯一的标准
select distinct(deptid) as 别名 from pcmc_user

like not like

where USERNAME like ‘高[博叶]’ --会查出 高博 或者 高叶
where USERNAME like ‘高%’ --会查出高开头的所有
select year_id FROM rz_review_kpi_config WHERE year_id NOT LIKE ‘%2017%’

alter

–添加列
ALTER TABLE pcmc_user ADD remark VARCHAR(50) NULL
–添加主键约束
ALTER TABLE pcmc_user ADD CONSTRAINT pk_usercode PRIMARY KEY(usercode)
–删除列
ALTER TABLE pcmc_user DROP COLUMN column_name
–修改列类型和长度
ALTER TABLE flow_sl_assets_purchase ALTER COLUMN reason VARCHAR(549)

between and/not between and

select USERCODE,USERNAME from pcmc_user where USERNAME between 2 and 4
–查询的就是2、3、4【包括边界的哦】
select year_id FROM forbook.dbo.rz_review_kpi_config WHERE year_id not BETWEEN 2016 AND 2017
–查询不在2016到2017之间的数据(包括2016和2017)
SQL Server中 between and是包括边界值的,not between不包括边界值

insert into…values…

–插入数据
INSERT INTO tablename (usercode,username)VALUES(‘11’,‘Bob’)
INSERT INTO tablename VALUES(‘11’,‘Bob’,‘23’)–不写具体的列,就必须插入全部列
–多条插入
insert into user_info (user_account,user_name) values (‘00001’, ‘张三’), (‘00002’, ‘李四’);

insert into select

insert into Table2(field1,field2) select value1,value2 from Table1
–1,没有values,和insert一条记录不一样。
–2,插入字段数量上要能对应上。
–3, Table2必须存在,并且字段field,field2也必须存在
–或者: insert into Table2 select * from Table1
–或者: insert into Table2(a, b, c) select e,f,10 from Table1

insert into b(a, b, c) select d,e,f from b; --只复制表结构到新表

mysql:create table 新表 select * from 旧表 where 1=2
或 create table 新表 like 旧表

insert into table_name execute …将存储过程查到的的数据存入表中

Insert into [pro_sheet_month_hz_table] execute [pro_sheet_month_hz] @date_start=‘2019-02-01’,@date_end=‘2019-02-28’,@org_code=‘01’

复制表和数据

select userid,username into table2 from table1 【追加where 1<>1就是复制表结构(会丢掉主键??)】
–注意:Table2必须不存在,插入的列,数据类型和长度也会和Table1一样
select USERCODE,USERNAME INTO Table2 from pcmc_user where 1<>1
–1<>1永远不满足,所以此句用来创建表,表的结构来源于select后所指定查询的字段
select * INTO [boss_1211].[dbo].action_analy from [boss_0328].[dbo].action_analy --跨库复制数据
法一:select * into b from a where 1<>1(仅用于SQlServer)
法二:select top 0 * into b from a
mysql:create table tb_data_copy select * from tb_data where id<=10

mysql:insert into 新表 select * from 旧表 --只复制数据(需新表已存在)

mysql:insert into 新表 select * from 旧表 --只复制数据(需新表已存在)

delete / delete from

delete from tableA where age between 18 and 20
–单表操作可省略from,连表操作必须有from

drop

drop table tablename --删除表和表里的数据
drop tablename pro_sheet_month_hz; --删除存储过程
alter table tablename drop constraint uk_tablename_colnumName

update

update tablename set usercode=‘zhangsan’,username=‘张三’
–更新数据 不写where默认更新所有记录

contains

select USERCODE, USERNAME FROM pcmc_user WHERE CONTAINS (username, ‘文’)
–类似like,不设置全文索引会报错,针对大量数据时适用(默认左右加了%,就不用再继续写%了)

order by (asc 升序desc降序)

select * from pcmc_user order by deptid asc,usercode desc
–先按照deptid升序排,deptid相同的按照usercode降序排
当存在null时,有些场景null也需要参与排序,不能按照数据库默认的排在最前或最后,sqlserver可以这样处理:
order by z.username, z.kq_bdate, case when z.daka_time is null then ‘12:59:59’ else z.daka_time end asc

escape

select * from Table2 where username like ‘%/%肖文’ ESCAPE ‘/’
–escape ‘/’ 是指在’/'后面的字符不是通配符,而是普通符, 查出username=%肖文的记录

in、not in、>any、=any、<any、<>any、>all、=all、<all

select * from pcmc_user where usercode in (‘xiaowen’,‘huangks’)
in 和 =any --效果一样

any --比子查询最小的大
<any --比子查询最大的小
<>any --不等于子查询任意一个
all --比子查询所有的的大
<all --比子查询所有的的小
<>all --不等于子查询所有的
–查出usercode='xiaowen’且usercode='huangks’的记录

newid()

SELECT TOP 10 *,NEWID() FROM fh_dept ORDER BY NEWID() --给每一行记录随机生成一个类似uuid的字段,此时便可做到随机取10条记录

exists 、not exists

select deptid from pcmc_user where EXISTS (select * from pcmc_user )
select * from pcmc_user where not EXISTS (select * from pcmc_user where 1=2 )
–括号中表达式有返回结果则where条件成立,只判断是否有行,所以效率比in高很多

exec

exec sp_rename ‘old_name’, ‘new_name’;–重命名表名
exec sp_databases; --查看数据库
exec sp_tables; --查看表
exec proc_mypro; --执行存储过程
exec pro_mypro @date_start=‘2019-01’, @date_end=‘2019-01’;–带参数执行存储过程

插入的字符中包括单引号

INSERT INTO [aaa] ([id], [name]) VALUES(‘1’, ‘abc’); --插入abc
INSERT INTO [aaa] ([id], [name]) VALUES(‘2’, ‘’‘abc’’’); --插入’abc’
INSERT INTO [aaa] ([id], [name]) VALUES(‘3’, ‘a’‘b’‘c’); --插入a’b’c
–结论:单引号要使用转义字符,即两个单引号表示一个字符单引号,sql就不会报错

isnull()

select isnull(jslevel_id, 0) from pcmc_user
–jslevel_id列如果是null就设置默认值0,类似java的三目运算符

with as

with as 用来定义一个片段sql,提高可读性
with dt as (select * from pcmc_user )
select * from dt

!=null、=null、is null、is not null、<>null区别

有的值是空字符串,有的是null,数据库客户端可能看不出来差别,但这个差别确实存在,很致命

通配符

[] % [^] _

datetime

sqlserver datetime 日期格式不允许存空,强行存空的话会默认为1900-01-01 00:00:00.000,可以设置为null;所以业务需要存空就把空处理为存null,或者不要使用datetime格式。

发布了75 篇原创文章 · 获赞 106 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/vayne_xiao/article/details/105321047