Mysql基础片学习笔记

本片MySQL都是基于linux下操作,根据黑马视频记录的笔记。

1.

linux下的mysql启动

service mysql start

linux下的mysql启动,输入以下指令后再输入MySQL密码即可登录。

mysql -u root -p

2.SQL语句的分类

DDL语句:数据定义语句,用于定义数据库对象(数据库,表,字段)。

DML语句:数据操作语句,用来对数据库表中的数据进行增删该。

DQL语句:数据查询语句,用于查询数据库表中的记录。

DCL语句:数据控制语句,用于创建数据库用户,权限等语句。


数据库操作:

查询所有数据库
show databases;

查询当前数据库
select database();

创建数据库
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];

删除
drop database [if exists] 数据库名;

使用
use 数据库名;

表结构操作:

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

查询表结构
desc 表名;

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

创建表
create table 表名(
字段1(就是名字) 字段1类型 [comment 注释],
字段2 字段2类型 [comment 注释],
字段3 字段3类型 [comment 注释],
字段4 字段4类型 [comment 注释],
.....
字段n 字段n类型 [comment 注释]
)[comment 注释]

往表中添加字段 注意不是添加数据
alter table 表名 add 类型 [comment 注释] [约束]

往表中修改数据类型
alter table 表名 modify 字段名 新数据类型
//注意修改字段类型是指定字段名

修改字段类型和名字
alter table 表名 change 旧字段名 新字段名 数据类型 [comment 注释] [约束]

删除字段名
alter table 表名 drop 字段名 

修改表明
alter table 表名 rename to 新名字

删除某一张表
drop table [if exists] 表明


对于字段类型,mysql中的数值类型多用于int ,bigint(long),float(M,N),double(M,N).这里的浮点类型,M指代的是数据的总长度,N代表的是小数点数目最多多少位。比如score double(3,1),这里就是指明score字段为两位整数+1位小数组成。

想要使用无符号类型指定unsigned,比如 age int unsigned.

字符数据多用于char(定长字符串)和varchar(变长字符串).

char(10):固定占用10字节,哪怕只存入一个字符,也是占用10字节储存空间,其他9个字符会以空格进行补位。性能比较好,浪费储存空间。

varchar(10):最大占用10字节,存入一个字节就是1字节储存空间,其可以动态扩展。超过10位就会报错。性能相比于char较差。

时间日期如下:


QML语句(增 insert 删delete 改 update):

添加数据
1.给指定字段添加数据
insert into 表名(字段1,字段2,..) values(值1,值2, ...);//插入一条

2.给全部字段进行添加数据
insert into 表名 values(值1,值2, ...);//插入一条

3.插入多条数据
给指定字段进行插入数据
insert into 表名 (字段1,字段2,..) values (值1,值2, ...),(值1,值2, ...).....(值1,值2, ...);
给所有字段进行插入数据
insert into 表名  values (值1,值2, ...),(值1,值2, ...).....(值1,值2, ...);

注意:
插入数据时,指定的字段顺序需要与值的顺序一一对应。
字符串和日期类型需要包含在引号内。
插入的数据大小应该在指定类型的范围内。
DML修改数据

update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3 .... where 条件

注意没有where就是修改表的所有数据

删除数据
delete from 表名 where 条件

注意如果没有where条件将会删除表中的所有数据

DQL查询语句

查询语句的总体大概如下:

select 字段列表

from 表名列表

where 条件列表

group by 分组字段列表

having 分组后的条件列表

order by 字段排序

limit 分页参数

基础查询:

查询多个字段

select 字段1,字段2,...  from 表名;
select * from 表名;//查询全部字段
注意:查询的结果组成一张表,通过select进行筛选出来,这里是通过字段筛选。即原来表中你定义的哪些字段。

还可以给字段名取别名

select 字段1 [as 别名1],字段2 [as 别名2],...  from 表名;
//as是可以省略的


对查询结果进行去重 
select distinct 字段列表 from 表名;

条件查询:

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

注意查询值是否为NULL,一定要使用 where is null。
注意使用between A and B 来表示范围时,A是较小的一方。 
注意使用in代替or时,要带().

注意使用like模糊匹配时,_是代替一个字符,%为通配符。一定要有''包含_或者% .

select * from emp where name like '__';
上面就是查询姓名为两个字的员工信息 。

select * from emp where age like '%0'
上面查询的就是年龄以0结尾的员工信息,注意移动要用''包含

where后面可以有如下条件:

DQL聚合函数:聚合函数一般是配合查询使用,必须跟在select字段后面聚合函数是作用于表中的某一列的。


 

使用聚合函数时,NULL值是不会参与计算的

下面介绍常用的字符串函数(这个不是聚合函数)

1. length()函数计算其中的字符串的长度。
   SELECT LENGTH('MySQL字符串函数') AS len1,//len1=20

2. CONCAT(str1,str2,…))函数用于返回多个字符串连接之后的字符串
   SELECT CONCAT('MySQL', '字符串', '函数') AS str; //str=MySQL字符串函数
   

   注意如果其中的拼接函数有NULL,那么函数就是返回NULL。
   SELECT CONCAT('MySQL', NULL, '函数') AS str.//NULL

3. LOWER(str) 该函数将字符串里的所有字符变为小写。
   UPPER(str) 该函数将字符串的所有字符变为大写

4.lpad(str,n,pad) 该函数对字符串str进行使用pad进行左填充 直到长度变为n.
  rpad(str,n,pad) 该函数对字符串str进行使用pad进行右填充 直到长度变为n.
  上面两个函数使用NULL进行填充 直接返回NULL

  select lpad("aa",5,'ab');//ab a aa--> abaaa

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

6 substr(str,start,len) 从str中的start位置开始截取len长度的字符
注意mysql中字符串下标是从1开始的,而不是0

 select substr("abcdefg",1,3);//abc 



   
介绍常用的数值函数
cel(x)往上取整

floor(x)往下取整

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

rand() 返回0~1之内的随机数

round(x,y)对数X进行四舍五入,保留y位小数

select round(2.345,2) 进行四舍五入保留两位 2.35

 常见的日期函数:

常见的流程函数:

select if(false,0,1) as ans;
//if就是三元表达式 第一个位置可以是true/false或者0/1,
//或者非零表达式,对表达式的结果进行判断falas/true


select ifnull(1,2);
返回的是1 这个判断的是第一个数是否为NULL值,
空字符串不是NULL。
注意判断的字段是不是NULL。

select ifnull('',1);//返回空字符串

case when va1 then m1 when va2 then m2 ... else defalut end
这种适用于不同字段的范围取值

case exper  when va1 then m1 when va2 then m2 ... else defalut end
这种适用于单个字段的多个确定值的情况。


案例: 统计班级各个学员的成绩,展示的规则如下:
-- >= 85,展示优秀
-- >= 60,展示及格
-- 否则,展示不及格

select
  id,
  name,
(case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ) '数学',
(case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end )'英语',
 (case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end ) '语文'
from score;


所以注意以字段范围进行判断就是case when。 一个字段的多种精确值情况就是case expr when.

DQL分组查询:

SELECT 字段列表 FROM 表名 [where 条件] GROUP BY 分组字段名字 [HAVING 分组后过滤条件]

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

判断条件不同 where不能对聚合函数进行判断,但是having可以。

对于分组查询group by,可以理解为将where查询后的结果又进行分组,一组只包含GROUP BY的一个数据。比如有一张表的gender字段有三种数据,男,女,人妖。这时通过group by字段分组后就有三张表,每张表还是一样维护着原来的表结构(原来的字段,只不过将数据分类,相同的一类放在一张表中,比如性别为男在一张表,女在一张表,人妖在一张表上。)

进行分组后,进行having和select操作时,是对每一个组进行相同的操作,然后再将结果组成一张表。

查询年龄小于45岁,根据工作地址分组,获得员工数量大于等于3的工作地址
select workaddress,count(*) from emp where age<45 group by workaddress having count(*)>=3;

DQL排序查询:

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

排序方式:asc 升序排序
        desc 降序排序

注意:对于多排序字段,当排序字段值相同时,相同的字段才会按照字段2的排序方式进行排序。

DQL分页查询:

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

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

比如我要查询第二页,每页展示10条记录
select * from emp limit 10,10; //(2-1)*10=10,记住更着的是索引和每页显示的记录。

如果只想显示X条数据,那么可以指定like X ,即在第一页展示X条数据

DQL的执行顺序:

select 字段列表    ---------------->5

from 表名列表       --------------->1

where 条件列表      --------------->2

group by 分组字段列表  ------------>3

having 分组后的条件列表  ----------->4

order by 字段排序    ----------->6
 
limit 分页参数          ---------------->7

所以这里注意了 having是在select之前,所以可以先通过having(聚合函数操作)过滤一些信息再进行select
操作进行算出想要的数据。

DCL 管理用户

1 查询用户
use mysql;
select * from user;

2.创建用户
create user '用户名'@'主机名'  identified by '密码';

3.修改用户密码

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

4. 删除用户
drop user '用户名'@'主机名';

MYSQL 约束:zhu

非空约束 限制该字段不能为NULL   NOT NULL

唯一约束 保证该字段的数据是唯一的,不重复。  UNIQUE

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

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

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


限定约束 用来限制数据的条件 check
比如限制年龄>0 小于120 那么就是 age int check(age>0&&age<120),


一个字段有多个约束直接写就行,不用逗号隔开 比如非空且唯一就是
age int not null unique,

外键约束

创建外键
alter table 表名 add constraint 外键名称 foreign key(外键字段) references 主表(主表列名)
注意创建外键时,外键字段所在的表为从表。另外一张表是父表。
一般外键关联的是主表的主键(perimary key)

删除外键
alter table 表名 drop foreign key 外键名称


创建/删除外键指定的数据行为
alter table 表名 add constraint 外键名称 foreign key(外键字段) references 主表(主表列名) on update M1 on delete M2.
即更新数据时执行M1行为,删除数据时进行M2行为。

对于外键约束,其有一些默认的数据行为(注意是删除父表的数据,从而引发关于外键所在表的数据变化):

        上图的前两个行为是MYSQL的默认行为,即存在外键不允许删除主表的数据。 

我们准备如下两张表,dept和emp.同时对emp增加外键,指定关联为dept的主键,同时设置外键约束的数据行为在修改和删除时都是cascade.

对于第二张图,我们将dept中研发部的id变为6。由于指定cascade。外键所在的子表的dept_id字段关联的emp的id也会发生变化,1变为6,如下图。


多表查询

 对于表情况,分为1表对多表(多表对1表),1表对1表,多表对多表。

注意多对多情况,这里引入第三张表进行设置外键,增加多个字段,从而取关联更多表。

多表查询,直接在from后面跟着多张表的名字,用逗号隔开。
select * from 表1,表2,表3...

多表查询的结果的笛卡尔集,即将表数据的所有的组合情况多进行反馈出来。
比如查询两张表,第一张表有5个数据,第二章表有4个数据,进行多表查询所得的结果就是4*5=20条数据。
所以在多表查询时要进行消除无效的笛卡尔集。

一般消除笛卡尔集的方法就是从表的外键字段的值=主表主键的值。

多表查询又分为如下几种情况:

内连接查询:其查询返回的结果是两张表的交集
隐式内连接:select 字段列表 from 表1,表2 where 条件...;
显示内连接: select字段列表 from 表1 inner join 表2 on 连接条件 where ...;

//注意显示内连接on后面的是连接条件,而不是查询条件where,可以在连接条件后跟上查询条件
//隐式内连接的连接条件是在where后面

一般在多表查询时候可以给表取别名从而简化SQL语句,但是一旦取了别名,后面就要都使用别名,而不要适用原来的名字。

select * from emp m1 ,dept m2  where m1.dept_id=m2.id;
select * from emp m1 inner join dept m2 on m1.dept_id=m2.id;
外连接查询

左外: select 字段列表 from 表1 left outer join 表2 on 连接条件 where...
相当于查询的是表1的所有数据+两张表的交集部分

右外: select 字段列表 from 表1 right outer join 表2 on 连接条件 where...
相当于查询的是表2的所有数据+两张表的交集部分

注意左外/右外 ,查询的结果没有匹配会只用NULL字段进行填充(比如左外 有部分数据没有匹配但是要保留左表的全部字段,所以就会使用NULL进行填充)

自连接查询(自己连接自己 一定要取别名!!!)
select 字段列表 from 表1 别名1 join 表2 别名2 on 连接条件 where...

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

假如select后面是 *,对于多表查询from后面返回拼接结果。通过条件----进行组合后拼接的表是包含两张表的所有字段的。这一点注意。

比如上面的emp表进行自连接,筛选结果是select *,我们可以看到组合后的表包含了两张emp表的字段值。其他多表查询也是一样的。上面的大表就理解为两张表的组合。select字段还是可以进行多表操作的(尤为重要),从而返回自己想要的数据。比如是 select m1.name,m2.name.

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

SQL的联合查询

联合查询:union,union all
对于联合查询,是将多次查询的结果合并在一起,形成一个新的查询结果集。

select 字段列表 from 表A ...
union [all]
select 字段列表 from 表B ...;


 比如将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.
select * from emp where salary < 5000
union all
select * from emp where age > 50;

//union all是直接将结果合并,但是假如一个人工资不仅低于5000,而且年龄大于50,由于联合查询是将多次查询合并在一起,所以这时就会出现重复数据。

select * from emp where salary < 5000
union
select * from emp where age > 50

//union是将数据进行去重,即对于上面的情况进行去重。


对于联合查询,查询的多张表的列数必须保持一致,而且查询的字段类型也要保持一致。(select 的查询字段一样)

如下图,我们可以看见第二次没有all的查询比第一次有all的查询(重复了鹿杖客)进行了去重 

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

 SQL的子查询

子查询
即SQL语句中嵌套了select语句,称为嵌套查询,又称子查询

select * from t1 where column=(select column from t2)
多个select进行嵌套 
子查询的外部语句可以是insert/update/delete/select的任意一个

子查询的结果可以分为四个,1. 标量子查询,子查询结果为单个值。
                        2. 列子查询 子查询的结果返回一列。
                        3. 行子查询 子查询的结果返回一行。
                        4.表子查询 子查询返回的结果是一张表。

标量子查询内部的查询,where的条件是一个确定的值,select查询的是一个字段,确定了查询结果是单个值。 

 列子查询内部的查询,where的条件是一个范围,select查询的是一个字段,确定了查询结果是一列。

行子查询内部的查询,where的条件是一个确定的值,select查询的是多个字段,确定了查询结果是

 表子查询内部的查询,where的条件是一个范围,select查询的是多个字段,确定了查询结果是一张表。

上面图片中的操作符和关键字都是作用于内层查询的结果的。 

注意子查询就是内层查询的结果作为外层查询的条件
内层查询的整体语句注意要加上小括号

标量子查询例子:
查询“销售部”的员工信息
select * from emp where emp.dept_id= (select dept.id from dept where name = '销售部');
这里注意,内层查询的就是销售部的ID,返回的是一个值,然后赋值给emp表的dept_id字段作为条件。

列子查询例子
内部查询返回的多行数据(返回的是一列或者是多列作为条件,一列多行)
查询比研发部任意一人工资都高的员工信息(任意一人 即最小的那个,或者理解为任意一个)
select * from emp where salary > some (select salary from emp where dept_id=(select id from dept where name='研发部'));
//注意上面的内查询就是返回的是salary那一列

行子查询例子
内部查询返回的是一行多列数据(即select后面查询的是多个字段)
查询与张无忌的信息及其领导相同的员工信息
select * from emp where (salary,managerid) = (select salary,managerid from emp where name =' 张无忌');
//这里注意返回的是一行多列数据,进行匹配时使用元组进行匹配,就是如上的括号匹配

表子查询例子
内部结果返回的是一张表(select是多个字段,where条件不是一个精确值,而是一个范围),多行多列数据。将返回结果与外部查询进行匹配时,匹配也是使用元组,但是使用关键字in,而不像行子查询是=

查询与鹿杖客,宋远桥的职位和信息相同的员工信息
 select * from emp where (job,salary) in (select job,salary from emp where name ='鹿杖客' or name ='宋远桥');



MYSQL事务 

MYSQL事务是一组操作的集合,它是不可分割的工作单位。事务会将所有的操作绑定为一个整体,这些请求要么同时成功,要么同时失败。MYSQL的事务是自动提交的,默认情况下,每条语句都是一个事务,一条语句执行成功,那么就会进行提交。

查询事务/设置事务   若值为1,则是自动提交,若值为0.则手动提交。
select @@autocommit;
set @@autocommit=0;

提交事务
commit;

回滚事务//数据出错 进行回滚
rollback;



下面不用设置事务类型,直接进行事务开启
开启事务
start transaction  /  begin

提交事务
commit;

回滚事务//数据出错 进行回滚
rollback;

未提交事务,数据库中的数据是不会变化的

隔离性:每个事务的运行都是独立的,不会影响别的事务操作。

事务并发引起的问题:

脏读:一个事务读取到另一个事务还没有提交的数据(注意是未提交)。

不可重复读:一个事务先后读取同一条记录(另一个并发事务在两次读期间已经提交),但两次读取的数据不同。

幻读:假设事务隔离界别在可重复读的情况下(解决了不可重复读的情况,并发事务下,读不到别的事务新提交的数据,但是插入数据时,数据已经在数据库了),一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在了。

事务隔离级别:

查看事务的级别
select @@TRANSACTION_ISOLATION;

设置事务级别
set TRANSACTION ISOLATION LEVEL {read uncommitted|read committed|repeatable read|serializable};


可重复读就类比于屏蔽了其他事务,不论别的并发事务有没有提交,前后的查询操作都是一样的。

串行化:只允许一个事务进行执行,执行期间进行加表锁,别的事务修改表时会被阻塞,直到那个事务提交以后才解除阻塞,进行执行。

事务的隔离级别越高,安全性越高,但是性能越低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值