MySQL基础学习

2020年9月13日学习日记

insert into 表名(id,name)value(1,john);往表中插入行
desc 表名;显示表的结构
create table 表名(
id int
name varchar(20));建一个新的表
show databases;显示数据库所有的表,show table from啥的也可以,show所有东西都行
select database(),这个地方要加括号,因为是一种函数
update 表名 set name = xxx where id = 1 更新表中的信息
delete xxx from 表名 where id = 1;delete的用法和selete基本相同

基础查询

查询列表可以是:表中的字段、常量值、表达式、函数
``是用来表示字段的,作用是来和关键字区分开来
起别名:SELECT last_name AS 结果,别名中AS可以用空格代替
去除重复元素:SELECT DISTINCT department_id from employees;
MySQL中字段的拼接用的是concat函数
MySQL中将某列中的为NULL的元素置为某个别的值的函数为IFNULL,IFNULL( , )

条件查询

SELECT … FROM … WHERE

条件表达式、逻辑表达式、模糊表达式

前两者都很简单,模糊表达式指的是:like、between and(包含临界值,并且左小右大)、in、is null、is not null
另外值得一提的是,!=和<>是相同的,并且用<>更好

like是用来指定包含关系的条件
例子:
select * from employees where last_name like ‘%a%’
%是通配符,可以和任意长度的字符匹配,可以为0
_也是一种通配符,但是是指定长度为一的字符
escape是用来指定转义字符的WHERE last_name LIKE ‘$_%’ ESCAPE $(此处有单引号,汗颜)
in的含义是判断某字段的

2020年9月14日学习日记
DB:数据库,存储数据的容器
DBMS:数据库管理系统,又被称为数据库软件或者数据库产品
SQL:结构化查询语言

排序查询

select * from employees order by salary DESC/ASC(降序和升序)
length(),获取字段的长度,也是MySQL中的一个函数
可以加多个排序条件,几个并列的排列条件,先满足前面的,当前者属性值相等时,再按后者排序
order语句一般写在查询语句的最后,除了limit子句之外

2020年9月15日学习日记

常见函数

单行函数:concat、length、ifnull等,主要五类,字符函数、数学函数、日期函数、其他函数、流程控制函数
多行函数:做统计使用,又被称为统计函数
单行函数介绍:
1.字符函数
upper、lower、substr、substring、instr、trim、lpad、replace、rpad
所有的SQL中,序号都是从1开始,而不是0
用length返回汉字的字节长度,而不是字符长度,一个汉字的字节长度为3
trim是去除空格的函数,lpad是填充的函数,lpad(‘殷素素’, int, char);(int是指填充后的字符长度)
2.数学函数
round(四舍五入)、ceil(向上取整数)、floor(向下取整数)、truncate(截断)、mod(取余)、rand(随机返回0-1小数)
3.日期函数
now(返回当前日期加时间)、curdate(只返回当前的日期)、curtime(只返回当前的时间,不包含日期)、year、month、str_to_date、date_format、datediff(日期差)、
转换格式:%Y%y%m%c%d%h%i%s等等
4.其他函数
version、database、user
5.流程控制函数
if、case when then else end(两种用法都要掌握)

分组查询

分组函数介绍:
sum、avg、max、min、count(计算行数,也就是个数),group by,having(这是对于某个group而言的)、
2020年9月16日
按多个字段分组,相当于与运算,多个字段均相同的元素放在一组

连接查询

又叫做多表查询,由于涉及多个表,一般会为表起别名
直接将两列的元素从两个表取出,那么相当于是直接完全连接,得出的结果是m*n,因为没有有效的连接条件
连接分为三类
内连接:等值连接,非等值连接,自连接
外连接:左外连接,右外连接,全外连接
交叉连接

如果为表起了别名,那么查询的字段就不可以使用原来的表明来限定

2020年9月17日
自连接:把现在这张表,当作两张表甚至多张表来使用
join on:这个用法在于将几个表直接进行完全连接,on后面是约束条件
外连接得应用场景:外连接的查询结果为主表中的所有记录
左外连接:left join左边是主表
右外连接:right join右边的是主表
全外连接:内连接的结果+表一和表二不重合的部分,这个MySQL不支持,但是Oracle支持

2020年9月22日
这几天被项目搞心态,今天重新开始
交叉连接:cross join,其实交叉连接就是完全连接,只不过是将逗号变成了cross join罢了
子查询:出现在其他语句中的select语句,称为子查询或者内查询
外部的查询语句,被称为主查询或者外查询

子查询

按结果集的行列数不同:
变量子查询(单行单列)、列子查询(一列多行)、行子查询(一行多列)、表子查询(一般多行多列,咋咋都行)
按子查询出现的位置:
select后面:
仅仅支持标量子查询
from后面:
支持表子查询
where 或者 having 后面:
标量子查询(重点)、列子查询(重点)、行子查询
exists后面(相关子查询):
表子查询

标量子查询,一般搭配着单行操作符使用, > < >= <= = <>
列子查询,一般搭配着多行操作符使用,in any/some all

SELECT *
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE last_name = ‘Abel’
);

子查询的执行是优先于主查询的
子查询主要讲究一个逻辑正确,其实很简单

2020年9月23日
多行操作符,IN/NOT IN(等于任意一个)、ANY/SOME(和任意某一个作比较)、ALL(和所有作比较)

行子查询,非常啰嗦,用得不多:同时筛选索格条件,其实这个并不一定可以返回出结果

直接在select后面加子查询也可以,当作一个新的变量查询出来就完事了

在from后面加入子查询的情况:相当于构造了一个新的表,一定要起别名,不然新表没有别名

在exists后面加入子查询的情况,相当于布尔类型
select exists(子查询语句)
返回的是0或者1,和C和C++中的布尔类型相似

分页查询

语法:
select 查询列表
from 表
[join type] join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by [排序字段]
limit offset size;

offset 要显示的条目的起始索引(这个从0开始,和SQL语句大部分地方都不同)
size 要显示的条目个数

limit语句需要放在最后,其次是order by

联合查询

就是多个select取并集,和where后面加的or筛选条件是一样的,select… onion select…
onion一般用于查询多个表,但是没有连接关系,并且查询的内容意义相同时,因此列数还有顺序都得相同

2020年9月25日

DML语言

插入语句:
方式一:insert into 表名(列名1…) values(值1…);
方式二:insert into 表名 set 列名=值,列名=值;

方式一支持插入多行,方式二并不支持
方式一支持子查询,方式二不支持

修改语句:
update,最前面写过了

删除语句:
delete,最前面写过了,返回修改的行数,update也会返回修改的行数
truncate,删除的效率更高,清空数据,不能加where语句,没有返回值

DDL语言(数据定义语言)

2020年9月26日

库的管理

库的创建:create;
create database 库名;

库的修改:rename,alter;
rename database 库名 to 新库名;
alter database 库名 character set gbk;(更改库的数据集)

库的删除:drop(注意,这些都是对表的操作,而不是数据)
drop database 库名;

表的管理
表的创建:

create table 表名 values(
列名 列的类型(长度约束),
列名 列的类型(长度约束),

列名 列的类型(长度约束),
)

表的修改:

修改列名:alter table 表名 change column 列名 新列名 数据类型;(数据类型必须要写上,其实数据类型也能改,可以同时改,或者不加上新列名单纯改数据类型也可以)

添加新列:alter table 表名 add column 列名 数据类型;

删除列:alter table 表名 drop column 列名;

修改表名:alter table 表名 rename to 新表名;

表的删除:

drop table 表名;

表的复制:

仅仅复制表的结构:create table 新表名 like 表名;

复制表的结构加数据:create table 新表名 select * from 表名;(通过改变查询的结果,可以只复制部分数据)

常见的数据类型

整型:Tinyint,Smallint,mediumint,Int,integer,Bigint

小数 :float,double,decimal,这个需要注意的是,decimal(M,D),M是指小数点前后的位数之和,D是指小数点后的位数,如果不设置的话,默认M=10,D=0;

字符型:
短文本:char、varchar,都需要写成char(M)、varchar(M),M表示最长的字符数,varchar可以保存更多的字符,并且varchar是可变长度的文本,char的效率更高,varchar耗费的空间更小
binary、varbinary用于保存短的二进制
:枚举类型,选取的值必须要是其中一个
Set:和Enum很类似,但是一次性可以选取多个成员,而Enum只能选一个
长文本:text、blob

日期型:
date、datetime、timestamp、time、year

常见约束

六大约束:
not null、default、primary key、unique、check(检查约束,MySQL中不支持)、foreign key
在创建表、修改表时都可以加约束
有列级约束(外键约束没有效果)和表级约束(非空和默认没有效果)

表级约束:在各个字段的最下面
constraint 约束名 约束类型(字段名)

标识列

又称为自增长列:可以不用手动地插入值,系统提供默认的序列值
在设置的列后面增加auto_increment(创建、修改、删除时都可以,删除就直接不写就完事了)
自增加修饰的不一定是主键,但是要求是一个key,即唯一
一个表至多有一个自增长列,只能是数值型,可以通过手动插入,设置起始值

TCL语言

2020年9月27日
事务控制语言
一个或者一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
在这个单元内,每个MySQL语句是相互依赖的,如果某条SQL语句一旦执行失败或者产生错误,会直接回滚到最开始的地方

查看存储引擎:show engines
事务的ACID四个属性:原子性、一致性、隔离性、持久性

事务分为隐式事务和显式事务,区别在于有没有明显的开启和结束的标记
显式事务:
步骤1.开启事务:
set autocommit = 0;
start transaction;
步骤2.编写事务中的SQL语句
步骤3.结束事务
commit;(提交事务)
rollback;(回滚事务);

同时运行的事务会出现的并发问题:
脏读:对于两个事务,如果T1读取了T2更新的数据,但是T2回滚了,T1读取的更新数据是无效的
不可重复读:不可重复读,T1读取了字段,T2更新了,T1再次读,值已经不同了
幻读:T1读某一字段,T2在表中加了几行,T1再次读,发现已经不对劲了

数据库存在四种隔离级别,越高的隔离级别可以预防越多的并发问题,但是相应的性能就越低下
set transaction isolation level 隔离级别;(设置隔离级别)
MySQL默认第三个隔离级别,即可避免前两个,第三个避免不了
Oracle默认第二个隔离级别,即避免第一个,后两个避免不了
select @@tx_isolation9(查看隔离级别)

2020年9月29日

视图

含义:虚拟表,和普通表一样使用,MySQL15.1才出现的新特性
视图的数据都是来自于表中的数据

创建视图:create view 视图名 as 查询语句;

修改视图:
方式一:create or replace 视图名 as 查询语句;
方式二:alter view 视图名 as 查询语句;

删除视图:drop view 视图名、视图名…;

查看视图:desc view 视图名;

其他的插入、删除、更新视图数据什么的和表并没有什么区别

变量

系统变量

全局变量
会话变量

查看全局或者会话变量:show global/session variables;
查看某个指定的系统变量的值:select global/session.系统变量名;
赋值某个指定的系统变量的值:set global/session.系统变量名 = 值;
不加global,默认为session

自定义变量

用户变量
局部变量

用户变量的作用域针对于当前会话(连接)有效,同于会话变量的作用域
set @变量名 = 值;

存储过程

创建语法:
create procedure 存储过程名(参数列表)
begin
存储过程体
end

结尾可以通过delimiter重新设置
参数列表由三个部分,参数模式、参数名、参数类型
参数模式:in(作为输入) out(作为输出) inout(既可以作为输入也可以输出)

调用语法:
call 存储过程名(实参列表);

2020年9月30日
存储过程的删除:drop procedure 存储过程名
查看存储过程的信息:
desc 存储过程名;
show create procedure 存储过程名;
存储过程的逻辑语句是无法修改的,只能直接删除然后重新建立

函数

存储过程可以有0-N个返回,适合增删改;函数只能由一个返回,函数比较适合查询一个值;

函数创建语法:
create function 函数名(参数列表) returns 返回类型
begin
函数体
end

函数调用语法:
select 函数名(参数列表);

查看、删除什么的和存储过程完全相同

流程控制结构

分支结构

if结构:
if(表达式1,表示式2,表达式3);
如果1成立,则返回2的值,否则返回3的值;

case结构:
case
when 条件 then 返回值

else 返回值
end;

(上述所有值都可以是语句)

循环结构

while结构:
循环名字 while(循环条件) do(
循环体;
)
end while 循环名字;

loop结构:
循环名字 loop
循环体;
end loop 循环名字;

repeat结构:
循环名字 repeat
循环体;
until 结束循环的条件
end repea 循环名字;

只有加上循环名字才可以搭配循环控制语句

终于在九月的尾巴把MySQL基础学习完啦,奥里给!!!接下来冲一波Linux!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值