【mysql-基础篇】

mysql-基础篇

一、常见命令

1、sql常见命令

  • 查看当前所有的数据库:show databases;
  • 打开指定的库:use 库名;
  • 查看当前库的所有表:show tables;
  • 查看其它库的所有表:show tables from 库名;
  • 创建表:create table 表名(列名 列类型, 列名 列类型);
  • 查看表结构:desc 表名;
  • 查看服务器版本:
    方式一:登录状态:select version();
    方式二:未登录状态:mysql --versionmysql -V

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、字符函数

  • length(str):计算字节长度
  • concat(str...):拼接字符串
  • upper(str):大写
  • lower(str):小写
  • substr(str, pos):pos索引从1开始,截取str从索引pos的位置到结尾,同substring(str, pos)
  • substr(str, pos, len):索引指定长度的字符长度
  • instr(str1, str2):返回str2在str1第一次出现的索引,找不到返回0
  • trim(str):去除前后空格
  • trim('a' from 'aa史蒂芬aa'):去除前后a
  • lpad(str,len,padstr):用指定的padstr左填充str到len长度
  • rpad(str,len,padstr):用指定的padstr右填充str到len长度
  • replace(str1, str2, str3):用str3替换在str1中的所有str2

1.2、数学函数

  • round(x):将x四舍五入
  • round(x,d):小数点保留后d位
  • ceil(x):向上取整,返回>=该参数的最小整数
  • floor(x):向下取整,返回<=该参数的最大整数
  • truncate(x,d):截断,小数点后截断d位小数
  • mod(x1,x2):取模,x1%x2

1.3、日期函数

  • now():返回当前系统日期+时间
  • curdate():返回当前系统日期,不包含时间
  • curtime():返回当前的时间,不包含日期
  • year(now()) :指定部分,年、月month(),monthname()、day()日、hour()小时、minute()分钟、seconde()秒
  • str_to_date('9-13-1999','%m-%c-%Y'):将字符根据格式转换为日期
  • date_format(now(),'%y年%m月%d日'):将日期转换为字符
  • datediff(date1,date2):相差天数
image.png

1.4、其他函数

  • version():版本
  • database():当前数据库
  • user():当前用户

1.5、流程控制函数

  • if(expr1, expr2, rxpr3) :效果等同于expr1?expr2:expr3
    case:类似switch case的效果,可以当表达式或者单独的语句
# switch
case ?
when ? then ?
when ? then ?
else ?
end 

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

2、分组函数

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

2.1、简单实用

  • sum(字段):求和
  • avg(字段):平均值
  • min(字段):最小值
  • max(字段):最大值
  • count(字段):计数值(非空)

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、分类标准

按年代分类:

  • sql92标准:仅支持内连接
  • sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接

按功能分类:

  • 内连接:
    • 等值连接
    • 非等值连接
    • 自连接
  • 外连接:
    • 左外连接
    • 右外连接
    • 全外连接
  • 交叉连接

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 ?
连接类型关键字:

  • 内连接:inner
  • 外连接:
    • 左外:left【outer】
    • 右外:right【outer】
    • 全外:full【outer】
  • 交叉连接:cross

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

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

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

4)交叉连接
笛卡尔集

五、子查询

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

1、分类

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

  • select后面:仅支持 标量子查询
  • from后面:仅支持 表子查询
  • where或者having后面:支持 标量子查询、列子查询、行子查询
  • exists后面(相关子查询):仅支持 表子查询

结果集分类:

  • 标量子查询(结果集只有一行一列)
  • 列子查询(结果集只有一列多行)
  • 行子查询(结果集只有多行多列)
  • 表子查询(结果集一般为多行多列)

2、特点:

  • 子查询放在小括号内
  • 子查询一般放在条件右侧
  • 标量子查询、一般搭配这单行操作符使用> < >= <= = <>
  • 列子查询,一般搭配着多行操作符使用in、any/some、all

六、分页查询

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

limit (page-1)*size,size

七、联合查询

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

  • union:有去重效果
  • union all:不去重

八、数据库操作语言(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

  • delete删除后,自增长从断点开始;truncate删除后,自增长从1开始
  • delete删除有返回值;truncate删除没有返回值
  • delete删除可以回滚;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
  • 如果不设置符号,默认是有符号,如果设置无符号:unsigned
  • 超出范围,报out of range,填充临界值
  • 如果不设置长度,会有默认长度,长度为填充0到长度,配合使用zerofill int (11) zerofill

2、小数

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

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

  • m:整数部位+小数部位的总长度
  • d:小数部位长度
  • m和d都可以省略。
    如果是decimal,m默认是10,d默认是0;
    如果是float和double,没有精度

3、字符

短文本

  • char(m):固定长度的字符,空间耗费,效率高,省略默认1
  • varchar(m):可变长度的字符,空间节省,低,不可省略
  • enum(str...):枚举,插入只能是a/b/c不区分大小写,例如:c1 enum('a','b','c')
  • set(str...):集合,插入可以是集合('a')('a,b')...,例如:s1 set('a','b','c','d')

长文本
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、事务的创建

  • 隐式事务:事务没有明显的开启和结束标志,比如insert、update、delete语句
  • 显式事务:事务具有明显的开启和结束的标志

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

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

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

步骤3:结束事务

  • commit; 提交事务
  • rollback; 回滚事务

示例:

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
  • 参数列表: 参数名 参数类型

  • 函数体:肯定有return语句,如果没有会报错,如果return语句没有放在函数体最后也不会报错,当不建议。函数体中只有一句话,可以省略begin end。使用delimiter语句设置结束标记

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

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

查看函数
show create function 函数名

删除函数
drop function 函数名

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

十九、流程控制结构

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342