mysql基础篇

Mysql

net start mysql80

net stop mysql80

启动或者停止mysql服务,mysql开机默认自动启动

客户端连接

方式一,直接启动mysql的命令行客户端

方式二, 系统自带的命令行 mysql [-h 127.0.0.1] [-P 3306] -u root -p

配置完环境变量后只需要在cmd里面输入mysql -u root -p

关系型数据库:

建立在关系模型的基础上,由多张相互连接的二维表组成的数据库

通过表形式来建立的数据库叫做关系型数据库

SQL

SQL语句可以单行或者多行书写,以分行结尾.

可以通过空格和缩进来增加语句的可读性.mysql的SQL语句不分大小写,关键字建议大写.

注释:单行注释 --或者 # (mysql特有)

多行注释 /* 内容 */

分类:

DDL Data Definition language 数据定义语言,用来定义数据库对象

DML Data Manipulation Language 数据操作语言,用来对数据库的数据进行增删改

DQL Data Query Language 数据查询语言,用来查询数据库中表的记录

DCL Data Control Language 数据控制语言,用来创建数据库用户,控制数据库的访问权限

DDL

查询

查询所有数据库 SHOW DATABASES;

查询当前数据库 SELECT DATEBASE();

创建 CREAT DATABASE [IF NOT EXITS] 数据库名 [DEFAUL CHARSET 字符集] [COLLATE 排序规则];

[IF NOT EXITS]如果这个数据库不存在就创建,如果存在就不执行任何操作

[]里面的内容都是可选的

删除 DROP DATABASE [IF EXITS] 数据库名;

使用 USE 数据库名;

DDL - 表操作 - 查询

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

​ 查询表结果:desc 表名;

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

DDL - 表操作 - 创建

​ create table 表名(

​ 字段1 字段1类型[comment 字段注释1],

​ 字段2 字段2类型[comment 字段注释2]

)[comment 表注释];

[]中为可选选项,最后一个字段后面没有","

字符串verchar()括号里面控制字符串长度

数值类型

tinyint,smallint,mediumint,int,bigint,float,double,decimal(得指定精度和标度,精度就是它的总长度,标度就是它的小数位)

double(4,1) 4表示总体长度,1表示小数位数

字符串类型

char,verchar,tinyblob,tinytext,blob,text,longblob,longtext.

char是定长字符串,verchar可变字符串,char(10)字符串长度一定是10,不够长补空格到10.

verchar(10)字符串会进行判断来决定它真正的长度.

时间日期类型

time,date,year,datetime

DDL - 表操作- 修改

​ 添加字段

​ ALTER TABLE 表名 ADD 字段名 类型(长度) [comment 注释] [约束];

​ 修改数据类型

​ alter table 表名 modify 字段名 新数据类型(长度);

​ 修改字段名和字段类型

​ alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];

​ 删除字段

​ alter table 表名 drop 字段名

​ 修改表名

​ alter table 表名 rename to 新表名

​ 删除表

​ drop table [if exits] 表名;

​ 删除指定表,并重新创建该表

​ truncate table 表名;

Mysq图形化界面

DML

增加insert 修改update 删除delete

给指定字段添加数据

insert into 表名 (字段1,字段2) values(值1,值2);

给全部字段添加数据

insert into 表名 values(值1,值2…);

批量添加数据

insert into 表名(字段1,字段2…) values(值1,值2…)(值1,值2…)

修改数据

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

删除数据

delete from 表名 [where 条件];

DQL

select

​ 字段列表

from

​ 表名列表

where

​ 条件列表

group by

​ 分组字段列表

having

​ 分组后字段 列表

order by

​ 排序字段列表

limit

​ 分页参数

查询多个字段

select 字段1,字段2… from 表名

select * from 表名

设置别名

select 字段1[as 别名 1],字段2[as 别名2]…from 表名;as可以省略

去除重复记录

select distinct 字段列表 from 表名;

DQL- 条件查询

select 字段列表 from 表名 where 条件列表

条件>,>=,<,<=,=,!=,between…and,in(…)like 占位符,is null,and &&,or ||,not !.

like 占位符(_匹配单个字符,%匹配任意个字符) 比如说两个字的

like ‘__’;

DQL-聚合函数

count,max,min,avg,sum;作用于某一列数据

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

null值不参与聚合函数的运算

DQL-分组查询

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

where在分组前进行操作,having在分组后进行操作且having可以使用聚合函数

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

DQL-排序查询

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

asc:默认的升序排序

dese:降序排序

DQL-分页查询

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

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

数据库中分页查询可能不同

从第一页开始查询起始索引可以省略

DQL-执行顺序

先执行form再执行where在执行group by 和having 接着才是select 再是group by 最后limit

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-acH5fhJr-1690688689754)(C:\Users\念天\AppData\Roaming\Typora\typora-user-images\image-20230726180543263.png)]

DCL

控制用户访问和用户权限

查询用户

use mysql

select * from user;

用户都是存储再mysql里面的user里面

创建用户

create user ‘用户名’@‘主机名’ identified by 密码;

主机名用’%'表示可以在任意主机上访问

修改密码

alter user ‘用户名’@‘主机名’ identified with mysql_native_password by ‘新密码’;

删除用户

drop user’用户名’@‘主机名’

再mysql里面只有通过用户名和主机名一起才能精准定位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1n1PuKXn-1690688689755)(C:\Users\念天\AppData\Roaming\Typora\typora-user-images\image-20230726185046797.png)]

查询权限

show grants for ‘用户名’@‘主机名’

授予权限

grant 权限列表 on 数据苦名.表名 to ‘用户名’@‘主机名’

撤销权限

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

多个权限间用,间隔

函数

一段可以直接被另一段程序调用的程序或代码

字符串函数

concat(s1,s2…sn) 字符串拼接,把s1,s2…sn拼接成一个字符串

lower(str) 把字符串str全部转成小写

upper(str) 把字符串str全部转为大写

lpad(str,n,pad) 左填充,用字符串pad对str的左边进行填充,使得str达到n个字符串长度

rpad(str,n,pad)右填充,用字符串pad对str的右边进行填充,使得str达到n个字符串长度

trim(str) 去掉字符串头部和尾部的空格

substring(str,start,len) 返回从字符串str从start位置起len长度的字符串

select 函数(参数);

数值函数

ceil(x) 向上取整

floor(x) 向下取整

mod(x,y) 返回x%y的值

rand() 得到0~1之间的随机数

round(x,y) 得到对x进行四舍五入,保留y个小数

日期函数

curdate() 返回当前日期

curtime() 返回当前时间

now()返回当前日期和时间

year(date) 获取指定date的年份

month(date) 获取指定date的月份

day(date) 获取指定date的日期

date_add(date,interval expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值

interval是固定的 expr是时间值,type是时间的单位

datediff(date1,date2) 返回起始时间date1和结束时间date2之间的天数,时间用字符串格式输入.

流程函数

用来条件筛选,提高语句的效率

if(vale,t,f) 如果value 为true 则返回t,否则返回f

ifnull(value1,value2) 如果value1不为空,则返回value1,否则返回value2

case when [val1] then [res1] …else [ default] end

val1为true 返回res1…否则返回default默认值,结尾end别忘记了

case [expr] when [val1] then [res1] …else [default] end

如果expr的值等于val1,返回res1…否则返回default默认值

select name,(case workadress when ‘北京’ then ‘一线城市’ when ‘上海’ then ‘一线城市’ else ‘二线城市’ end ) as ‘工作地址’

表头显示name 和工作地址,as可以省略

约束

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

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

非空约束 限制该字段的数据不为null not null

唯一约束 保证该字段的所有数据都是唯一的 unique

主键约束 主键是一行数据的标识,要求非空且唯一 primary key

默认约束 保存数据时,如果未指定该字段的值,则采用默认值 default

检测约束 保证字段值满足某一个或者多个条件 check

外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 foreign key

约束是作用于表中字段上的,可以在建表/修改表的时候添加约束

自动增长 auto_increment

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J0qBLhLg-1690688689755)(C:\Users\念天\AppData\Roaming\Typora\typora-user-images\image-20230727160958596.png)]

create table user(

​ id int primary key auto_increment comment ‘主键’,

​ name verchar(50) not null unique comment’姓名’;

​ age int check(age>0 && age<= 120) comment’年龄’;

​ status char(1) default ‘1’ comment ‘状态’;

​ gender char(1) comment’性别’;

)comment ‘用户表’;

如果插入到数据没有进入表,但是又auto_increment 的话,自增部分依旧会自动增加,数据依旧能申请到对应得到自增数据;

外键约束

通过外键让两张表之间的数据进行拼接,具有外键的表成为子表,从表;外键关联的叫做父表,主表;

两张表在数据库层面没有任何关系

在表结构创建时

[constraint] [外键名] foreign key (外键字段) referebces 主表(主表列表)

在表创建完后

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

alter table 表名 drop foreign key 外键名称;

外键约束删除/更新行为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z2QzNOWU-1690688689756)(C:\Users\念天\AppData\Roaming\Typora\typora-user-images\image-20230729143657040.png)]

not action 和restrict是默认的

要加入那些操作在语句后面加上 on update on delete
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (主表列名) on update cascade on delete cascade;

多表查询

一对一 在任意一方加入外键,关联另一方的主键,并设置外键为unique

多对多 创建一张中间表来存储两张表的关系

多表查询会出现多余的笛卡尔积,ab集合相乘得到所有的情况,所有多表查询得消除多余的无效笛卡尔积

连接查询

内连接

查询ab表交集部分

隐式内连接

select 字段列表 from 表1,表2 where 条件…;

显式内连接

select 字段列表 from 表1 [inner] join 表2 on 条件…;

如果给表起了别名,就不能再用表名去操作

外连接

左外连接查询,查询左表包括交集部分

select 字段列表 from 表1 left [outer] join 表2 on 条件…;

右外连接查询,查询右表包括交际部分

select 字段列表 from 表1 right [outer] join 表2 on 条件…;

自连接

当前表与自己的连接查询,自连接必须用表别名

select 字段列表 from 表a 别名a join 表a 别名b on 条件…;

select a.name b.name from emp a ,empb where a.managerid = b.id;

自连接一定要给自己起别名,可以用内连接也可以用外连接

联合查询

对于union 查询,就是把多次查询的结构合并起来,形成一个新的查询结果集;

select 字段列表 from a…

union [all]

select 字段列表 from b…;

联合查询加上all会重复两张表的重复部分,取消all就只会出现一次

也就是union all会重复,union会去重

对于多表查询的多张表的列数必须保持一直,字段类型也需要保持一致

子查询

sql语句中嵌套select语句,成为嵌套查询,又称子查询

select * from t1 where column1 = (select column 1 from t2);

子查询外部语句可以说insert/update/delete/select的任何一个

分为

标量子查询 子查询结果为单个值

常用操作符: = <> > >= < <=

列子查询 子查询结果为一列

常用操作符: in ,not in ,any ,some ,all

行子查询 子查询结果我一行

= <>(不等于) in ,not in 😭) =()

表子查询 子查询结果为多行多列

() in () ;

把查询结果当作一张表来起别名进行查询

根据子查询位置 分为where后,from后,select后

可以用reformat code格式化代码使其更美观

事务

是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,既这些操作要么同时成功,要么同时失败.

默认mysql是自动提交的.

可以设置事务提交方式为手动

select @@autocommit;

set @@autocommit=0;

执行完后不会直接提交事务

执行commit ; 操作才会把事务操作上传

如果事务执行错误,就可以通过

rollback;来回滚事务

开启事务 或者修改事务自动提交

start tansaction 或 begin

事务的四大特性:

原子性 : 事务是不可分割的最小操作单元,要么全部成功,要么全部失败

一致性 :事务完成时,必须使所有的数据保持一致状态

隔离性 :数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

持久性 :事务一旦提交或者回滚,它对数据库中的数据的修改是持久的,数据存储在磁盘中

并发事务的问题

脏读 一个事务读取到另外一个事务还没提交的数据

不可重复读 一个事务先后读取同一条记录,两次读取的数据不同

幻读 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,右发现这行数据已经存在,好像出现了一个"幻影"

我查询的时候没有,但是我插入的时候是有的

事务的隔离级别(解决并发事务的问题)

隔离级别 脏读 不可重复读 幻读

read uncommit √ √ √

read committed x √ √

repeatable read(m默认) x x √

serializable x x x

√是会出现,x是解决了

select @@transaction_isolation;

set [session(会话级别) \ golbal] transaction ioslation level [四种级别]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值