【mysql-基础篇】

2020-06-12  本文已影响0人  giraffecode9668

mysql-基础篇

一、常见命令

1、sql常见命令

2、mysql语法规范

二、select查询

1)select 查询列表 from 表名;

查询列表:表字段、常量值、表达式、函数
查询的结果是虚拟表格
查询所有列使用:select *

2)别名 使用as或者缺省
select mother as mom from x
select mother mom from x
select mother "ma mi" from x

如果为表起了别名,原来表名不能使用

3)去重:使用distinct关键字
select distinct 字段 from 表

4)+号
mysql只有加法功能

例子说明:
select 1+1;  数值型,做加法运算
select '123'+90; 将其中非数值型装换为数值型做运算,装换失败装换为0做运算
select 'j'+10; =10
 只要一方为null,结果为null

5)拼接:concat(str ... )
如果一个字段为null结果为null
select concat(last_name,first_name) as 姓名 from employee

6)ifnull(expr1,expr2)
如果expr1为null,返回expr2值。相当于if(expr1=null,expr2,expr1);

7)条件查询where
select 字段 from 表名 where 筛选条件

条件表达符:> < = != <> >= >=
逻辑表达符:&& || ! 或者 and or not
模糊查询:like between and in is null

8)模糊字符
%包含多个任意字符,包含0个字符
_包含一个任意字符,普通符号'_'使用转义字符\进行转义,如:\_

9)转义
默认 \
使用ESCAPE指定某个符号位转义字符
select sdf$_sdf escape $;

10)is null
因为没有= null,使用is null
反则:is not null

11)安全等于:<=>
<=> 相当于is=的结合

12)排序
order by 排序列表 【asc|desc】
缺省为升序(asc)

13)length()
select length(last_name);字符串字节的长度

三、常见函数

1、单行函数

如concat、length、ifnull等,一行只有一个参数返回值

1.1、字符函数

1.2、数学函数

1.3、日期函数

image.png

1.4、其他函数

1.5、流程控制函数

# switch
case ?
when ? then ?
when ? then ?
else ?
end 

# if else
case 
when ? then ?
when ? then ?
else 
end

2、分组函数

做统计使用,传入多个参数进行统计返回值,又称统计函数、聚合函数、组函数

2.1、简单实用

2.2、支持类型

1)sum、avg一般用于处理数值型
max、min、count可以处理任何类型

2)是否忽略null值
sum、avg、max、min、count都忽略null值

3)可以和distince搭配
sum(distinct salary):去重求和

count(*):计算总行数,建议使用此方式,效率更快
count(1):也是统计行数

2.3、分组数据

group by
语法

select  ? ,列(要求出现在group by 的后面)
from 表
[where 筛选条件]
group by 分组的列表
[order by 子句]

having:对group by结果的数据进行进一步筛选

四、连接查询

1、分类标准

按年代分类:

按功能分类:

2、sql92标准

1)等值连接
select ? from ?,? where ?=?

2)非等值连接
select ? from ?,? where ?beteween ? and ?

3)自连接
select ? from emp e,emp m where ?=?

3、sql99标准

语法:
select ? from ? [连接类型] join ? on ?
连接类型关键字:

1)内连接
inner join
inner可以省略
交集

2)外连接
查询结果是主表中的所有记录
如果有和它匹配的,显示匹配的值;否则显示null
左外连接,left join左边的是主表
右外连接,right join右边的是主表
左外和右外交换两个表的顺序,可以实现同样的效果

3)全外连接
mysql不支持,效果:左连接+右连接的并集

4)交叉连接
笛卡尔集

五、子查询

子查询外部称为:主查询或外查询

1、分类

按子查询可以出现的位置分类:

结果集分类:

2、特点:

六、分页查询

语法:limit offset,size
offset:开始索引,起始从0开始,0时可以省略
size:要显示的条目个数
limit放在查询语句最后

limit (page-1)*size,size

七、联合查询

语法:查询语句1 union 查询语句2 union xxx

八、数据库操作语言(DML)

数据操纵语言(DML)DataManipulationLanguage,是数据库的增删改操作的sql语句。

1、插入语句

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

方式一:
insert into 表名(列名,...)
values (值1,...)
// 如果列名没有,表示所有的列名

方式二:
insert into 表名
set 列名=值, 列名=值....

2、修改语句

# 修改单表的记录
update 表名
set 列=新值, 列=新值, ...
where xxx

# 修改多表的记录
update 表1 别名
join 表 别名
on 条件
set 列=值, ...
where 连接条件

3、删除语句

方式一:delete
delete from 表名 where 筛选条件
delete 表别名,表别名 from 表1 别名,表2 别名 where ? and ?
delete 表别名 from 表 别名 join  ? on ? where ?

方式二:truncate
truncate table 表名; #清空表所有数据,不允许用where

delete VS truncate

九、数据定义语言DDL

数据定义语言DDL(Data Definition Language),针对数据库/表操作的sql语言。

1、库的管理

1)创建库
create database xxx;
create database if not exists xxx

2)修改库
更改库的字符集
alter database xxx character set gbk;

3)删除库
drop database xxx;
drop database if exists xxx;

2、表的管理

1)创建表

create table 表名(
    列名 列的类型【(长度) 约束】
    列名 列的类型【(长度) 约束】
    列名 列的类型【(长度) 约束】
)

2)修改表
①修改列名
alter table 表名 change [column] 旧列名 新列名 类型
②修改列的类型或约束
alter table 表名 modify column 列名 新类型
③添加新列
alter table 表名 add column 列名 类型
④删除列
alter table 表名 drop column 列名
⑤修改表名
alter table 表名 rename to 新表名

3)删除表
drop table 表名
drop table if exists 表名

4)复制表
仅复制表结构
create table 新表 like 旧表
复制表结构+数据
create table 新表 select * from 旧表
仅复制某些字段
create table 表 select 列 from 表 where 0

十、类型

1、整型

类型 字节
tinyint 1
smallint 2
mediumint 3
int integer 4
bigint 8

2、小数

浮点
float(m,d)、double(m,d)

定点
dec(m,d)/decimal(m,d) 字节:m+2

3、字符

短文本

长文本
text
blob

4、日期

date:日期
datetime:日期+时间,8字节
timestamp:时间戳,4字节,最大2038年
time:时间
year:年

十一、约束

1、六大约束

NOT NULL:非空,保证字段值不能为空
DEFAULT:默认,保证有默认值
PRIMARY KEY:主键,唯一非空
UNIQUE:唯一,可以为空
CKECK:检查约束【mysql中不支持】
FOREIGN KEY:外键,用于限制两个表的关系,保证该表的字段值必须来自关联字段值

添加约束的时机:创建表时,修改表时

2、约束添加分类

1)列级约束:六大约束语法上都支持,但外键约束没有效果

# 列级约束直接在字段后面添加
create table student(
    id int primary key,#主键
    stuName varchar(20) not null,#非空
    gender char(1) check(gender='男'or gender = '女'),#检查
    seat int unique,#唯一
    age int default 18,#默认
    majorId int references major(id)#外键(语法不报错但无效)
)

create table major(
    id int primary key,
    majorName varchar(20)
)

2)表级约束:除了NOT NULL、DEFAULT,其他都支持

create table student(
    id int ,
    stuName varchar(20) ,
    gender char(1) ,
    seat int ,
    age int ,
    majorId int
    # 【constraint 约束名】 约束类型(字段)
    constraint pk primary key(id),#主键,mysql中改名没效果,还是primary key
    constraint uq unique(seat),#唯一
    constraint ck check(gender='男'or gender = '女'),#检查
    constraint fk_stuinfo_major foreign key (majorid) refferences major(id)#外键  
)

show index from 表:查看表中所有的索引;
unique只能有一个null

外键:
1)在从表设置外键关系
2)类型一致
3)主表的关联列必须是一个key(一般是主键或唯一)
4)插入数据时,先插入主表,再删除从表
5)删除数据时,先删除从表,再删除主表

3、修改表时添加约束

列级:alter table 表 modify column 列 类型 约束
表级:alter table 表 【constraint 约束名】 add 约束(字段) 【外键引用】

4、修改表时删除约束

alter table 表 modify column 列 类型
alter table 表 drop primary key
alter table 表 drop index 唯一键名
alter table 表 drop foreign key 约束名称

十二、标识列(自增长列)

可以不用手动插入值,系统提供默认的序列值auto_increment,标识列要求是一个key,一个表至多只有一个标识列,标识列的类型只能为数值型

1、创建时设置标识列

create table 表(
    id int primary key auto_increment,
     ...
);

2、修改表时设置标识列

alter table 表 modify column 列 类型 xxx auto_increment

3、删除表时设置标识列

alter table 表 modify column 列 类型

十三、事务

1、ACID属性

A:atomicity原子性,要么都发生,要么都不发生
C:consistency一致性,事务状态变换到另一个一致性状态
I:isolation隔离性,事务之间不能互相干扰
D:durability持久性,事务一旦提交,改变就是永久的

2、事务的创建

前提:必须先设置自动提交功能为禁用

步骤1:开启事务
set autocommit = 0;针对当前会话有效
start transaction;可选的

步骤2:编写事务中的sql语句(select insert update delete)

步骤3:结束事务

示例:

set autocommit=0;
start transaction;
update ...;
update ...;
commit; 
#rollback;

delete支持回滚,truncate不支持回滚

十四、隔离

mysql隔离级别

1、read uncommitted:出现赃读、不可重复读、幻读
2、read committed:避免赃读,出现不可重复读,幻读
3、repeatable read:避免赃读,不可重复读,出现幻读(默认)
4、serializable:避免赃读、不可重复读、幻读(性能低)

查看当前隔离级别:select @@tx_isolation
设置当前会话隔离级别:set transaction isolation level 隔离级别
设置全局隔离级别:set global transaction isolation level 隔离级别(需要重启)

savepoint 节点名:设置断点

十五、视图

好处:可重用sql,简化sql操作,不必知道查询细节,安全保护数据,

1、创建视图

create view 视图名
as
select ...

2、使用

select x from 视图名

3、视图修改

方式一:
create or replace view as 视图名 
as 
select ...;

方式二:
alter view 视图
as 
select ...;

4、删除视图

drop view 视图名,视图名....;

5、查看视图

desc 视图
show create view 视图名

6、视图的更新

可以执行插入修改删除,如果字段允许的话。
具备特点的视图不允许更新:
1)sql语句包含:分组函数、distinct、group by、having、union或union all
2)常量视图
3)select 中包含子查询
4)join
5)from一个不能更新的视图
6)where子句中的子查询引用了from字句中的表

十六、变量

1、系统变量

1)查看所有的系统变量
show globle |【session】 variables
2)查看满足条件的部分系统变量
show globle |【session】 variables like ''
3)查看指定的某个系统变量的值
select @@global | 【session】.系统变量名
4)为某个系统变量赋值
方式一:
set global | 【session】 系统变量名=值
方式二:
set @@global | 【session】.系统变量名=值

指明global为全局变量,不指明或者指明session为会话变量

2、自定义变量

声明、赋值、使用
用户变量:作用域:当前会话
1)声明并初始化
set @用户变量名=值
set @用户变量名:=值
select @用户变量名:=值

2)赋值(更新用户变量的值)
方式一:通过set或select
set @用户变量名=值
set @用户变量名:=值
select @用户变量名:=值

方式二:通过select into
select 字段 into 变量名 from 表

3)使用(查看用户变量的值)
select @用户变量名

局部变量:作用域:仅仅定义在它的begin end中有效;在begin end应用中的第一句话;
1)声明
declare 变量名 类型
declare 变量名 类型 default 值
2)赋值
方式一:通过set或select
set 用户变量名=值
set 用户变量名:=值
select @用户变量名:=值

方式二:通过select into
select 字段 into 变量名 from 表

3)使用
select 局部变量名

十七、存储过程

含义:一组预先编译好的sql语句

1、创建语法

create procefure 存储过程名(参数列表)
begin 
    存储过程体(一组合法的sql语句)
end

参数列表包含三部分:参数模式 参数名 参数类型
IN stuname varchar(20)
参数模式:
IN:该参数作为输入 ,需要调用方传入值
OUT:该参数作为输出,作为返回值
INOUT:该参数既可以输入,又可以输出;既需要传入值,又可以返回值
存储过程只有一句话,begin end可以省略
存储过程体中每条sql语句的结尾要求必须加分号;存储过程结尾可以使用delimiter重新设置;delimiter 结尾标记

2、调用

call 存储过程名(实参列表) 结束标记

使用实例:

delimiter $
create procedure myp1()
begin
    insert into admin(username,'password') values('john1','000'),.... 
end $

删除存储过程

drop procedure 存储过程名 #只能一次删除一个

查看存储过程的信息
show create peocedure 存储名

十八、函数

create function 函数名(参数列表) returns 返回类型
begin
    函数体
end

调用函数
select 函数名(参数列表)
示例:

create function myf1() returns int
begin 
    declare c int default 0;
    ...
    return c;
end $

查看函数
show create function 函数名

删除函数
drop function 函数名

函数 vs 存储
函数只有1个返回,适合处理结果返回一个结果
存储可以有0个或多个返回,适合批量插入更新

十九、流程控制结构

顺序结构
分支结构
循环结构

上一篇 下一篇

猜你喜欢

热点阅读