mysql 学习记录

mysql常用方法 总结:

---limit---
1、当 limit后面跟一个参数的时候,该参数表示要取的数据的数量
例如 select* from user limit 3 表示直接取前三条数据
2、当limit后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量,例如
select * from user limit 1,3;
3、当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量 。
例如select * from user limit 3 offset 1;表示跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数据
LIMIT 有一个参数和两个参数的情况:一个参数表示限制返回记录的条数,两个参数,第一个表示数据偏移量,第二个表示返回记录的条数

----日期比较----
select * from table_name where date(start_time) between '2022-03-21' and '2022-03-22'
2. 时间比较
SELECT * FROM table_name WHERE start_time <= '2022-03-22 00:00:00' and start_time >= '2022-03-21 00:00:00'
select  sysdate() + interval  1 day ,now(); 
now()返回一个常量,语句开始时候的值,sysdate()返回当前时间,执行时的时间;
 日期筛选: date_add(sysdate(),interval -1 month) / date_add(now(),interval -1 day) ;
 
-----case用法-----
 case key 
 when 条件 then '结果'
 when 条件 then '结果'
 when 条件 then '结果'
 else '结果'
 end
 
 
----if 用法----
if(expr1,expr2,expr3) 
expr1为条件返回一个bool值,成立则返回expr2,否则返回 expr3
例如:
if(sex=0,'','') 
类似于C# 三元表达式  expr1==true?"true":"false"


 --创建临时表 --
create temporary table -tableName as (select * from xxx);
drop temporary table if exists -tableName;

-- 链接字符串--
相当于 string.join(",",arr)
select GROUP_CONCAT(a.Name separator ',') as PartsName from tableName

 .cast(Id as char) as id 转换字段类型。
 .concat('a','b','c') 拼接字符串print abc 。
 .GROUP_CONCAT(a.Name separator ',')  分组后的组合,指定分割符号的。

-- 存储过程 --
drop  procedure if exists  my_procedure; -- 删除存储过程,清空环境
delimiter // -- 执行相当于 ;
create procedure  my_procedure (time datetime) -- 创建存储过程,相当于函数,参数+类型
    begin -- 开启一个事务
        select * from `log`; -- 具体逻辑
    end -- 事务结束
call  my_procedure(now());-- 调用存储过程,并传递参数
drop  procedure if exists  my_procedure; -- 删除存储过程,如果是临时的话需要删除

-- 事务 trancaction
begin 或者 START TRANSACTION 开启事务 end , rollback 回滚;


----join----

left join  on  and还是会查出来左表所有的值,对左表的筛选没用 ,对右表筛选才有用
and放到 where后 是进行最后的过滤

left join中关于where和on条件的几个知识点:
多表left join是会生成一张临时表,并返回给用户
where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件的记录
on条件是对left join的右表进行条件过滤,但依然返回左表的所有行,右表中没有的补为NULL
on条件中如果有对左表的限制条件,无论条件真假,依然返回左表的所有行,但是会影响右表的匹配值。也就是说on中左表的限制条件只影响右表的匹配内容,不影响返回行数。
1.对左表添加条件限制需在where条件中添加,不能放到on后面
2.对右表添加条件限制需放到on后面,在where条件中添加会有数据行数差异出现问题。


left join 会查出左表所有的数据
on 后面的and条件会影响到右表相关行的数据展示,筛选右表,但不影响两表交际的数据行数
WHERE 后面的条件会对两表的交集进行再次筛选
如果想要展示左表的所有行则用left join  B_Table on and 处理B表的数据展示
如果要少选最终的数据,条件需要放到where后面


  
  datediff(date1.date2); 相差的天数
  TIMESTAMPDIFF(时间单位,date1,date2);其中时间单位可以精确到天(DAY)、小时(HOUR),分钟(MINUTE)和秒(SECOND)
  
  null 值和 空字符串和 0 都不相同,null 只有两种操作 is null, is not null 
  无法比较null和0 他们是不等价的.
  
  
  group by 配合使用 聚合函数 count(条件 要加上 or null) 不然不起作用,加上or null 后不符合条件的数量均为0;
  
  
  查看表结构和备注 show full columns from vacuummaterial;
  
  添加索引 ALTER TABLE user ADD INDEX name_index(name);
  查看索引 SHOW INDEX FROM 
  CREATE INDEX t_device_prop_UI_name_IDX USING BTREE ON smooremeshmdata.t_device_prop (UI_name);

-- function

-- 1.function的创建语法

create function 函数名([参数列表]) returns 数据类型
begin
 sql语句;
 return 值;
end;

-- 调用
select 函数名();

-- 例子:
CREATE FUNCTION test.func_getsum(n int)
RETURNS INT
BEGIN
	declare total int default 0;
	while n>0 do
	  set total:=total+n;
	  set n:=n-1;
	end while;
	return total;
END

select  func_getsum(10); -- 返回55


-- 存储过程
-- 语法:

-- 1、创建存储过程
create procedure 存储过程名称(in/out/inout 参数名 参数类型(长度))
begin
     SQL语句;
end;
 
 
-- 说明:
-- in:该类型参数作为输入,也就是需要调用时传入值
-- out:该类型参数作为输出,也就是该参数可以作为返回值
-- inout:既可以作为输入参数,也可以作为输出参数
-- 参数类型长度:不指定长度时mysql会默认一个长度,如int会默认int(11),为什么是11,因为int的有符号类型的最大长度就是-2147483648,是11位的。

 -- 例子:
 
 CREATE PROCEDURE test.GetSum(in  n int)
BEGIN
    declare total int default 0;
	while n>0 do
	  set total:=total+n;
	  set n:=n-1;
	end while;
	SELECT total;
END

-- 执行的话要用 
CALL test.GetSum(10);

-- 触发器 trigger 可以在某个表的增删改操作动作前后执行下一个动作, insert update delete ,before after
-- 例子:
-- 新增触发器
CREATE DEFINER=`root`@`%` TRIGGER trigger1
AFTER INSERT
ON Test_Cap01 FOR EACH ROW
INSERT INTO test.Sys_Logs
(ID, Logger, `Level`, Url, Host, `Method`, UserAgent, Cookie, QueryString, Body, Message, Elapsed, CreateTime, IPAddress)
VALUES(uuid(), '触发器', '', '', '', '', '', '', '', concat('Test_Cap01新增一条数据->',new.ID), '', 0, now(), '')
-- 更新触发器
CREATE DEFINER=`root`@`%` TRIGGER trigger_update
AFTER UPDATE 
ON Test_Cap01 FOR EACH ROW
INSERT INTO test.Sys_Logs
(ID, Logger, `Level`, Url, Host, `Method`, UserAgent, Cookie, QueryString, Body, Message, Elapsed, CreateTime, IPAddress)
VALUES(uuid(), '触发器', '', '', '', '', '', '', '', concat('Test_Cap01更新一条数据旧数据:',old.ID,'新数据:',new.ID), '', 0, now(), '')
-- 查看触发器
show triggers;

  

  

 

 

posted @ 2022-07-15 17:32  互联网CV工程师  阅读(22)  评论(0编辑  收藏  举报