Mysql 史上最全学习资料十分硬核

1.DDL 数据库-操作

查询所有数据库: show Databases

查询当前数据库: select DATBASE()

创建数据库: create database [ if not exists ]数据名称 

删除 : Deop   database   【if  exists】 [数据库名]

使用数据库 : use  数据库名 

DDL 表操作-查询

查询当前数据所有表: show tables 

查询表结构: desc 表名;

查询指定表的建表语句:show create table 表名;

DDL-表操作-创建

create table 表名( 字段1 字段1类型 [comment]  ‘具体值’,)

DDL-表操作-数据类型

  TINYINT   1byte   +unsigned 表示 无符号 数值 

SMALLINT  2byte 

IMEDIUMINT 3byte 

INT  或 INTECER 4byte 

BIGINT 8byte

FLOAT 4byte 

DOUBLE 8byte 

DECTMAL  

DDL-表操作-修改:

添加字段: alter Table  表名 add 字段名  类型(长度) [comment注释] [约束]

修改数据类型: alter Table 表名 Modify   字段名 新数据类型 (长度)

修改字段名和字段类型 : alter Table  表名 change 旧字段名 新字段名 类型(长度) [comment z注释] ;

删除字段:  alter Table 表名 Drop 字段名;

修改表名: alter  Table 表名 Rename to 新表名;

删除表:drop table  【if exists 】 表名;

删除指定表,并重新创建该表 :truncate table 表名

2.DML-添加数据 

给指定的字段添加数据: Insert  into 表名(字段名 1 字段名2 。。。)values(值1 值2。。。);

给全部字段添加数据 : Insert into 表名 values (值1 值2.。。。);

DML-修改数据

update 表名 set 字段名1=值1 字段名2=值2.。。。[where 条件];

例题:Update emply set name=itheim  where id=1;

update employ set enttrdate ='2001-10-29';

DML-删除数据

delete From 表名 [where 条件];

DQL-语法-结构:

select 字段列表 from 表名  where 条件查询  group by   分组字段列表

order by 分组后条件列表  limit  分页参数。

DQL-基本查询:SQL编写顺序

select   [ distinct   去除重复数据]字段1[as ‘别名’ ] from 具体表名

DQL-条件查询:

Selsect 字段列表 from 具体表名 where(>,<,=,in(),like isnull,and,or not ) 条件列表;

between  min and max 

查询 姓名字段为两个字段的   like'_ _'    

聚合函数:将一列数据作为一个整体,继续纵向计算。

count:统计数量;   max; min;  avg;  sum;

语法:select 聚合函数(字段列表)  from 表名;

DQL-分组查询:

语法:select  字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过条件]

where和having区别:

执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组,而having是分组之后对结果进行过滤。

判断条件不同:where不能对聚合函数进行判断,但是having可以  (即在分组的基础上在进行筛选)。

根据性别分组,统计男女的数量:

select gender ,count(*)from emp group by gender;

查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址;

select workaddress  count(* ) from emp where  age<45 group by workaddress having conut(*)>=3;

执行顺序:where>聚合函数>having.

分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

DQL-排序 :

select 字段列表 from 表名  order by 字段1 排序方式  ,字段2排序方式

根据年龄进行排序 (降序desc)

selsect * from emp  order by  age  asc(升序);

先根据 年龄对公司员工进行排序,如果年龄相同,就按照入职时间再排。

select * from emp order by age asc ,entrdate desc;

DQL-分页查询:

select 字段 from 表名 Limit 起始索引,查询记录数;

注意:起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。

分页查询的是数据库的方言,不同的数据库有不同的实现,MySQL中是limit。

如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10.

分页查询:

查询第一页员工数据, 每页展示10行;

select * from emp limit 0,10 ;

查询第二页员工数据,每页展示10条数据,

select *from emp limit10,10;

例题:

1.查询 年龄为20,21,22,23岁的女性员工信息:

select * from emp  where gender='女' &&age= in (20,21,22,23)

2.查询 性别为男,并且年龄在20-40以内 名字为三个字的员工;

select * from emp where gender='男' &&age= between 20 and 40&& name like '_ _ _'

3. 统计员工表中,年龄小于60岁,男性员工和女新员工的数量 ;

select  gender,count(*) from emp where age<60 gruop by gender 

4.查询所有年龄小于等于35岁的员工姓名和年龄,并对查询结果进行升序如果年龄相同就按照入职时间进行降序。

select name,age where age<='35 '  order by age esc,entrdata desc;

5.查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同的按照入职时间进行升序排序。

select * from emp where  gender='男' and age = between 20 and 40 order by age esc,entrdate desc limit 0,5;

DQL-执行顺序:

DCL-介绍:DCL是data control language ,用来管理数据库用户,控制数据库的访问权限。

DCL-用户管理:

查询用户:

use mysql ;

select * from user ;

创建用户:

create user ‘用户名’ @‘主机名’ IDENTIFIED BY ‘密码’;

修改用户密码:

ALTER user ‘ 用户名’@‘主机名’ IDENTIFIED WITH mysql_native_password BY '新密码';sh

DCL-权限控制:

DCL-权限控制:

1.查询权限:show Grants  for '用户名'@‘主机名’;

2.授予权限:

grant 权限列表 on 数据库。表名 to ‘用户名’@'主机名';

3.撤销权限:

revoke 权限列表 on 数据库.表名 from ‘用户名’@‘主机名’。

字符串函数:

 concat 字符串拼接:

select concat('hello)

select substring("hello Mysql",1,5)

例题由于业务需求的变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0,例如1号员工应该为00001。

lpad(字段名,位数,’填充字符‘)字符串填充 在左边  相同的还有rpad();

update emp set workno =lpad(workno,5,'0')

数值函数:

Ceil(x) 向上取整,

select ceil(1.9)  ==>2

floor(x)向下取整 

floor(1.9)===>1

mod(x,y)返回x/y的模 

mod(5/4)===>1

rand()返回0-1的随机数  

 round(x,y)求参数x的四舍五入的值,保留y位小数。

select round(2.345,2)  ===>2.35

:通过数据库的函数,生成一个六位数的随机验证码;

select  lpad(round( rand()*100000,6),6,'0')

日期函数

 select curdate();  ====>当前日期;

select  curtime()=====> 当前时间;

select  now()=====>当前日期和时间;

year(now() )====>2022;

date_add(date,interval  expr type ):

select  date_add (now(),INTERVAL 70 day);当前时间向后推70天。

select datediff('2021-12-01','2021-11-01' );===> 61

例:查询所有员工的入职天数,并对入职天数进行倒叙排序

select  name, datediff(curdate(),entrdate  )  as '入职天数' from emp    order by  入职天数 desc

流程控制函数

 select if(true ,'ok','error' )====>ok;

ifNull( 'ok','default')====>ok

if(null,'default')=====>defalut

case  when  then else  end

需求:查询emp表的员工姓名和工作地址;(北京、上海-----》一线城市,其他-----》二线城市)

select  name  ( case  workdress  when '北京' then   '一线城市' workdress when    then '一线城市'  else  ‘二线城市’  end)  as '工作地址'

from emp 

约束: 

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的:保证数据库中的数据的正确,有效和完整性。

分类:

 根据需求,完成表结构的创建:

id 自动增长 需要用 auto_increment    

建表语句:create table user(  

id int primary key auto_increment comment '主键',

name varchar(10)  not null  unique  comment ' 姓名',

age int check( age>0&&age<=120)  comment '年龄',

status char (1) defailt  '1'  comment' 状态',

gender char(1)  comment '性别'

)comment  '用户表';

外键:

概念:外键是用来让两个表的数据之间建立连接,从而保证数据的一致性和完整性。

添加 主键与外键的关系:

 alter table  表名 addconstraint 外键名称  foreign key (外键字段名)  references 主表列名;

  

 多表查询:

 

多表查询:

 select * from emp,dept;(笛卡尔集);多表查询时要消除笛卡尔积

select * from emp,dept   where emp.dept_id=dept.id;对相应的条件进行筛选

内连接 :相当于时查询A,B表交集部分

   隐式内连接:select  字段名 from 表一 表二 where 条件。。。;

显示内连接: select  字段名 from 表一 【inner】 表2  on  连接条件。。。;

例题:查询 每一个员工的姓名,及关联的部门的名称(隐式内连接)

select   emp.name ,dept.name from  emp,dept where  emp.dept_id= dept.id;

显示内连接: INNER join 。。。on 

select    e.name d.name from  emp e inner(可省略)   join dept   on    e.dept_id=d.id;

外连接:

       左外连接 :查询左表所有的数据,以及两张表交集的部分

       右外连接:查询右表所有数据,以及两张表交集部分

自连接:当前表与自身进行连接查询,自联结必须使用别名。

 例题 :查询 emp表的所有数据和对应的部门信息(左外连接 ): 

操作的表结构 emp 和dept   

   select   e.*, d.name from  emp e left   outer(可省略) join  dept  d     on e.dept_id= d.id;

例题 :查询 dept表的所有数据 和对应的员工信息(右外连接)

select    d.*  ,  e.*  from emp e right join  dept d on   d.id= e.dept_id ;

自连接:

 自连接查询 ,可以是内连接查询,可以是外连接查询。

例题: 查询员工 及其所属领导的名字:

select    a.name  b.name from emp a emp b  where  a.manager_id=b.id

select a.name ' 员工'  b.name ' 领导'   from emp a left  join emp b on   a.managerid=cb.id;

联合查询

   将 薪资低于5000的员工  和 年龄大于 50岁的员工 全部查询出来:

  select * from emp where  salary  <5000 

union all

select *from emp where age >50;

子查询:

 标量子查询:

 

 查询 比研发部其中任意一个人工资高的员工信息:

 1.查询 研发部 所有人的工资:

   select salary from emp where  dept_id =(select id from dept where  name='研发部');

2.比研发部其中任意一个人工资高的员工信息;

some ==any

selsect * from emp  where  salary >any ( select salary from emp where  dept_id =(select id from dept where  name='研发部'));

 

表 子查询:

 事物:

  事物操作:

查看、设置设置事物提交方式:

 select @@autocommit ;

set @@autocommit=0;   0为手动 1为自动;

提交事物  commit ;  回滚事物  rollback

开启事物  start transaction

事物四大特性:

 多个并发事物执行之中出现的问题:

 事物的隔离级别:

read uncommitted   读未提交;

read committed   读已提交;

repeatable read  (默认)可重复读;

serializable 串行化  ;

 性能从高到低  隔离级别 低到高    隔离级别越高性能越差

查看事物隔离级别:

select  @@ transaction_isolation;

 设置事物隔离级别:

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值