MYSQL 语法基础 随记

1 各种JOIN

2 临时表、文件


CREATE TEMPORARY TABLE tmp_table (

name VARCHAR(10) NOT NULL,

value INTEGER NOT NULL

)



CREATE  TEMPORARY  TABLE a (select * FROM sys_user_role);

Select * into outfile 'c://outfile.txt' from test;

 3 变量(局部变量、用户变量 、会话变量 、全局变量)

深入MySQL用户自定义变量:使用详解及其使用场景案例 - GenialX - 博客园

MySQL中变量的定义和变量的赋值使用(转) - EasonJim - 博客园

3.1 使用set或select直接赋值,变量名以@开头,可以在一个会话的任何地方声明,作用域是整个会话,称为用户变量。

       set @var=1;

3.2 以declare关键字声明的变量,只能在存储过程中使用(begin..end),或者是给存储传参数中,称为存储过程/局部变量,例如: 

  declare var1 int default 0;

4 查询结果增加序号列

在mysql中给查询的结果添加序号列 - 爱笑的我_smile - 博客园

4.1.法一:

select  (@i:=@i+1)  i,a.url from  base_api_resources a  ,(select   @i:=0)  t2 order by a.id desc limit 10;

4.2.法二:有序号就不能 select *,一定要指定显示类名

set @rownum=0;
select @rownum:=@rownum+1 as rownum, a.url from base_api_resources a order by a.id desc limit 10

分序号:

一个select中按照分组排序

--sqlserver
--同种商品按求货数量排序
select ROW_NUMBER() OVER (PARTITION BY spid ORDER BY qhshl) AS sn,
spid as 商品,qhr as 求货人,qhshl  as 求货数 from tsqh_qhmx
where plid='TQHF00000000008'

5 时间处理

格式化

select FROM_UNIXTIME(1344887103);  //参数:一般为10位的时间戳(秒级别)
2012-08-14 03:45:03     

select unix_timestamp("2012-08-14 03:45:03") //秒级时间戳
1344887103
  
select unix_timestamp(NOW())* 1000 //粗算毫秒时间戳

SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s') //参数:datetime
2012-08-14 03:45:03 

SELECT DATE_FORMAT(NOW(),'%H')
03

 时间差

//datediff函数,返回值是相差的天数,不能定位到小时、分钟和秒
select datediff('2018-03-22 09:00:00', '2018-03-20 07:00:00');

//TIMESTAMPDIFF函数 定位到天数、小时、分钟和秒
select TIMESTAMPDIFF(DAY, '2018-03-20 23:59:00', '2015-03-22 00:00:00');
select TIMESTAMPDIFF(HOUR, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
select TIMESTAMPDIFF(SECOND, '2018-03-20 09:00:00', '2018-03-22 10:00:00');

时间计算

DATE_ADD(date,INTERVAL expr type) 给日期添加指定的时间间隔

DATE_SUB(date,INTERVAL expr type) 从日期减去指定的时间间隔

type:SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR

select date_sub(now(),interval 1 day); //减一天  返回格式 2018-12-19 23:35:39

6 NULL处理

1.isnull(exper) 判断exper是否为空,是则返回1,否则返回0

2.ifnull(exper1,exper2)判断exper1是否为空,是则用exper2代替

3.nullif(exper1,exper2)如果expr1= expr2 成立,那么返回值为NULL,否则返回值为   expr1。

7 MySQL类型转换

CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。两者具体的语法如下:

1、CAST(value as type) 就是CAST(xxx AS 类型) 

2、CONVERT(value, type) 就是CONVERT(xxx,类型)

但是要特别注意,可以转换的数据类型是有限制的。这个类型可以是以下值其中的一个:

二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED (小数丢失,不是四舍五入)
无符号整数 : UNSIGNED

8 动态SQL

推荐都使用?占位符预编译sql,不要直接拼接,防止注入

set @stmt = concat('select * from ',table_name,' limit ?,?');--table_name 表名字符串
prepare s1 from @stmt;
set @s1 = page_begin;
set @s2 = page_end;
execute s1 using @s1,@s2;
deallocate prepare s1;

9 返回影响

SqlServer、mysql 要用变量在执行后立即记录影响行数,因为影响行数只返回上一条语句的,且不立即记录有可能会出现意想不到的失准情况。

MYSQL

found_rows() : select
row_count()  : insert update delete

insert into `MyTestTable`(`ID`,`Name`)
  select '1','role1' union all
  select '2','role2' union all
  select '3','role3';
select row_count(); -- 输出3(返回新添加的记录数),[注:如果使用insert into...values只返回1]
 
select * from `MyTestTable`;
select found_rows(); -- 输出3(返回选择的行数)

update `MyTestTable` set `Name`='people';
select row_count(); -- 输出3(返回修改的行数)

delete from `MyTestTable`;
select row_count(); -- 输出3(返回删除的行数)

SqlServer

declare @rcount int  
update task_hz set is_ysh='是',state='分配'  where djbh='' and is_ysh='中' 
//记录受影响的行数
set @rcount=@@rowcount

if  @rcount= 0 //判断上句UPDATE是否有受影响的行
begin
   //没有,表示没有djbh='' and is_ysh='中' 的数据
   update task_hz set is_ysh='中'  where djbh='' and is_ysh='否'

   //记录受影响的行数
   set @rcount=@@rowcount 
end

select @rcount  as rcount

10 WHILE 循环

while do   ..... end while

    DECLARE COUNT INT DEFAULT 0;
    DECLARE SUM INT DEFAULT 0;
    WHILE COUNT < in_count DO
        SET SUM = SUM + COUNT;
        SET COUNT = COUNT + 1;
    END WHILE;
    SELECT SUM;

11 TRIM

SELECT TRIM('  bar   ');   --去除空格-> 'bar'
SELECT LTRIM('  barbar');
SELECT RTRIM('  barbar  ');
SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');   --删除指定的首字符 x -> 'barxxx'
SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');     --删除指定的首尾字符 x -> 'bar' 
SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');  --删除指定的尾字符 xyz -> 'barx'

12 OFFSET 显示偏移

第二高的薪水

力扣

SELECT DISTINCT
    Salary AS SecondHighestSalary
FROM
    Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1  #显示1条数据,从[1]开始。默认是从[0]

存储过程(函数)

//推荐用navicat创建

CREATE DEFINER=`root`@`%` PROCEDURE `selectuser`(IN `flag` int,INOUT  getresult int )
BEGIN

if flag=1 THEN

  select getresult ;

  set getresult=10;//INOUT

end IF;
  
END
执行

set @getresult=1;  
call selectuser(1,@getresult) ; //INOUT参数 必须由@变量传入

select @getresult //接收INOUT参数结果 10

UPDATE原子性的获得原值和新值

MYSQL:
update pack_dhhm  set  je=@old:=je, je=@new:=je+10  where dhhm=12345678901;

select @old,@new,ROW_COUNT();

SQLSERVER:
declare @old,@new int 
update pack_dhhm  set  @old=je, @new=je=je+10  where dhhm=12345678901

select @old,@new,@@rowcount

Update From

mysql

update kb_tbrecordinfo_monthreport1124_new t2
inner join kb_tbrecordinfo_monthreport1124 as t1 
on t1.id = t2.id
set t2.corpname = t1.corpcode
where .....

sqlserver

update kb_tbrecordinfo_monthreport1124_new 
set corpname=b.corpcode
from kb_tbrecordinfo_monthreport1124_new a
join kb_tbrecordinfo_monthreport1124 b 
on a.id=b.id;
where .....

insert转update

执行insert时已存在,则执行update

INSERT INTO user_admin_t (_id,password) 
VALUES ('1','第一次插入的密码') 
ON DUPLICATE KEY UPDATE --下边是执行update的set
_id = 'UpId',
password = 'upPassword';

replace into 

相当于insert into,若主键冲突则替换旧数据。

group_concat

原文:mysql之group_concat函数详解_u012620150的专栏-CSDN博客_group_concat函数

è¿éåå¾çæè¿°

select id, group_concat(price) from goods group by id;  

è¿éåå¾çæè¿°

查看执行日志

sqlserver

SELECT     TOP 30 QS.creation_time, SUBSTRING(ST.text, (QS.statement_start_offset / 2) + 1,
                      ((CASE QS.statement_end_offset WHEN - 1 THEN DATALENGTH(st.text) ELSE QS.statement_end_offset END - QS.statement_start_offset) / 2) + 1)
                      AS statement_text, ST.text, QS.total_worker_time, QS.last_worker_time, QS.max_worker_time, QS.min_worker_time
FROM         sys.dm_exec_query_stats QS CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE     
--QS.creation_time BETWEEN '2017-09-09 10:00:00' AND '2017-09-11 18:00:00' 
ST.text LIKE '%%'
ORDER BY QS.creation_time DESC

数字辅助表

MySQL中数字辅助表的建立_江南听雨-CSDN博客

行列互换

MySQL行转列与列转行 - ken-jl - 博客园

MySQL 实现行转列SQL_个人博客:https://micai-code.github.io 欢迎来访哟!-CSDN博客

创建Function时报错误码1418

MySQL创建Function时报错误码1418的解决方案_yown的专栏-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值