mysql学习

安装:https://blog.csdn.net/qq_37350706/article/details/81707862

mysql8.0官方中文文档:https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html

窗口函数学习:https://blog.csdn.net/m0_38063172/article/details/83789830

窗口函数运用:https://blog.csdn.net/zhangshk_/article/details/82756557

一千行sql详细学习笔记:http://mp.weixin.qq.com/s?__biz=MzIwMTY0NDU3Nw==&mid=2651937786&idx=1&sn=8608b5fd933a551d784ac0388343d708&chksm=8d0f34b4ba78bda267c6674379f20359195d25985f5ed1cc2b2743b760941018e70568bb1d32&scene=0#rd

事务:在mysql中只有使用了Innodb的数据引擎的数据库才支持

  保证成批的SQL语句(insert,update,delete)要么全部执行,要么全部不执行

  事务的满足条件(ACID):原子性,一致性、隔离性、持久性

  原子性:一个事务中操作要么全完成、要么全部不完成,发生错误时Rollback到事务开始前状态

  一致性:事务开始前,和开始之后,数据库的完整性没有被破坏,表示写入的资料必须完全符合预设规则

  隔离性:允许多个并发事务同事对数据进行读写和修改能力

  持久性:事务处理结束后,对数据的修改是永久的

  mysql中默认是自动提交事务,可通过set autocommit =0 来禁止自动提交

                   set autocommit=1 启动自动提交

  begin开启事务

  rollback回滚事务,回到事务开启之前

  commit提交,确认事务

存储过程:

格式create procedure pro_name (参数) 特性描述  routine_body

参数:in、out、inout name type

特性描述:language sql 说明后面部分是sql语句组成

     [not] deterministic说明执行结果是确定的,not deterministic说明执行结果是非确定的

     contains sql说明子程序包含sql语句

     no sql说明子程序不包含sql语句

     reads sql date 说明子程序中包含读数据语句

     modifies sql date说明子程序包含写数据语句

     sql security 指明谁有执行权限,definer只有定义者有,invoker调用者有

例:

create procedure num_from_employee(in emp_id int, out count_num int) reads sql date

begin

  select count(*) into count_num from employee where d_id=emp_id;

end

执行过程

说明:mysql的默认结束符是;,存储过程中的sql语句需要用分号;来结束,为了避免冲突可以用delimiter 改变sql的结束符,如delimiter &&,存储过程执行完之后再改变回来

函数

格式:create function name(参数)returns type 特性描述 routine_body

参数:name type

 变量的使用:

使用 declare定义变量:declare name[...] type [default value]

 DECLARE关键字是用来声明变量的;var_name参数是变量的名称,这里可以同时定义多个变量;type参数用来指定变量的类型;DEFAULT value子句将变量默认值设置为value,没有使用DEFAULT子句时,默认值为NULL

如:declare a int default 10;

为变量赋值:使用set ,一个set语句可以为多个变量赋值,使用,分开

如set a=10,b=20;

定义条件和处理程序:用于事先定义执行过程中可能遇到的问题,并在处理程序中定义解决问题的办法

格式:declare condition_name condition for condition_value

condition_value:

sqlstate sqlstate_value、mysql_error_code

定义处理程序:

mysql中的用户变量:

mysql变量分为两类:用户变量、系统变量

用户变量:局部变量、会话变量

系统变量:全局变量、会话变量

ps:用户定义的会话变量和系统定义的会话变量有什么区别?

局部变量用于SQL的语句块中,如存储过程中的begin和end中,作用域仅限于改语句块,生命周期也限于该存储过程

如:create procedure add(in a int ,out b out)

begin

  declare c int default 0;#局部变量

  set c=a+b;

  select c as c;

end&&

会话变量:服务器对每个客户端连接维护的变量,作用域和生命周期限于当前客户

。。。。。

窗口函数:

语法:函数名(变量) over子句

 over关键字用于指定函数的窗口范围,支持一下四种语法来设置窗口

window给窗口指定一个别名

partition指定分组字段

order by指定排序字段

frame当前分区的一个子集,子句用来定义子集的规则,通常用来作为滑动窗口使用

select* from (select row_number() over  w as row_num,order_id,user_no,amount,create_date from order_tab window w as (partition by user_no order by amount desc))t;

https://www.cnblogs.com/DataArt/p/9961676.html

索引

  mysql索引:可以提高检索速度

  单列索引:一个索引只包含一列,一个表可以有多个单列索引

  组合索引:一个索引包含多个列

临时表

  只对当前连接有效,关闭连接之后自动删除并释放空间:create temporary table tmp_table1(int id,string name);

  使用show tables无法查看到临时表,断开此次连接之后,临时表自动删除

匹配模式:like 或 not like

_匹配单个字符

%匹配任意数量字符

-------------------------------------------------------------

正则表达式:REGEXP_LIKE

.    匹配任意单个字符

[xyz]  匹配[ ]中的任意字符,如[0-9]表示匹配数字,[a-z]表示匹配字母

*    匹配任意个数量,如a*表示匹配任意个数量的a,[0-9]*表示匹配任意个数字,.*表示匹配任意个数量的字符

^b   匹配以b开头

$b   匹配以b结尾

select *  from pet where regexp_like(name,'^b');  表示查询所有名字以b开头的

order by 根据某个记录进行排序   desc 降序,asc 升序

group by 根据某个记录进行分分组

partition by

having:对前面筛选出的结果再次进行筛选

select distinct Email from Person group by Person.Email having count(Email)>1;

where

 列属性:

primary 主键   :create table tab(id int,name varchar(10),primary key(id));

unique 唯一约束,使某字段的值不能重复复

null:当前列可以为空

default默认值:create table tab (add_time timestamp default current_timestamp);

auto_increment自动增长,必须为primary或者unique,且只能存在一个列自动增长

comment注释内容:create table tab(id int)comment "注释内容";

foreign key外键约束:用于限定主表与从表数据完整性  alter table tab constraint 't1_t2_fk' foreign key(t1_id) references t2(t2_id)

将t1的外键t1_id关联t2_id,外键还可以通过constraint指定名字

存在外键的表为从表,外键指向的表为主表

指定主键的删除(on delete)和更新(on uodate)时外键的操作,如果不指定,主表的操作是拒绝的

1.cascade,级联操作,主表更新,从表更新,主表删除,从表删除

2.set null:主表主键更新时从表的外键被设置为null,主表主键删除时,从表外键设置为null,此时从表的外键不能有not null约束

3.restrict:拒绝主表的删除和更新操作

范式:

第一范式:字段具有原子性,不能再分

第二范式:满足第一范式为前提,不能出现部分依赖

第三范式:满足第二范式,不能出现传递依赖

 MYSQL中的表连接方式:外连接、内连接、交叉连接、自连接

https://blog.csdn.net/qiushisoftware/article/details/80489128

外连接分为:左外连接、右外连接、全外连接

1.左外连接:将左边表的数据全部显示,右外表中条件不符合的显示为null

2.右外连接:将右边表的数据全部显示,左外表中条件不符合的显示为null

3.全连接:所有表的所有行、列都会显示,彼此条件不满足的值为null(mysql不支持,但可以通过union实现)

内连接:查询结果仅仅包含满足条件的行,内连接inner join 可简写为join

交叉连接:笛卡尔积连接,左右表的元组任意组合,一般情况没有意义

连接过程中的on和where

on表示建立连接的关系

where对建立连接关系进行筛选

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下:

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

以下为练习:

IFNULL的使用:

IFNULL(exp1,exp2),如果查询结果为空返回exp2,不为空时返回exp1

 使用DATEDIFF来表示来个日期类型的数据的天数差:DATEDIFF(date1,date2)=n

hiving对聚合函数的操作结果进行筛选,where在聚合函数之前进行筛选

判断奇数以及不等于

使用case then 来判断:

case的使用格式:

case case_expression

  when exp1 then com1

  when exp2 then com2

  else com

end

例如将男改为1,女改为2

case sex

  when "男" then 1

  when "女" then 2

end

________________________________

case score

  when score>90 then "优秀"

  when score<60 then "及格"

  else “良好”

end

if(exp,exp1,exp2)如果exp为真则返回exp1,否则返回exp2

select a.Name as Employee from Employee a join Employee b on a.ManagerId=b.Id where a.Salary > b.Salary;

原文地址:https://www.cnblogs.com/chengdonghui/p/10404570.html