Mysql基础

一.概念

1.DB:数据库(database),存储数据的“仓库”,保存了一系列有组织的数据。

2.DBMS:数据库管理系统(Database Management System)。数据库是通过DBMS创建和操作的容器

3.SQL:结构化查询语言(Structure Query Language)。专门用来与数据库通信的语言。

二、常用sql语句

(1)基础篇

1.通配符查询: %(匹配多个字符) _匹配单个字符

select * from temp where name like '%a%'; #名称中含a的数据

select * from temp where name like '__a%'; #名称中第三个字符含a的数据

2.ESCAPE关键字指定转义符或\:转义字符

select * from temp where name like '_a_' escape 'a'; #名称中第二个为_的数据

3.安全等于 <=> 可以判断null值,也等价于=

(2)函数篇

字符函数:

1.length 获取参数值的字节个数

2.concat 拼接字符串

3.upper、lower 字母大小写

4.substr、substring 截取字符,索引从1开始,一个参数时表示从该下标往后截取,两个参数表示从该下标截取指定长度

5.instr 两个参数,返回子串参数2在参数1中第一次出现的索引,没有则返回0

6.trim 截取空格

例:select trim('a' from 'aaaaaaaahehcnaiosc ksin aaaaaaaaa');结果为hehcnaiosc ksin 。

7.lpad(参1,数字,参3) 用参3实现左填充指定长度,长度不够就进行截取;

8.rpad(参1,数字,参3) 用参3实现有填充指定长度,长度不够就进行截取;

9.replace(参1,参2,参3)在参1串中将参2替换为参3

数学函数:

1.round() 四舍五入;一个参数时,返回整数,两个参数时,保留指定小数四舍五入

2.ceil() 向上取整

3.floor() 向下取整

4.truncate() 截断

5.mod(a,b) 求余

6.rand()随机取数,返回0-1之间小数

日期函数:

1.now() 返回当前系统日期+时间

2.curdate() 返回系统当前日期,不包含时间

3.curtime() 返回系统当前时间,不包含日期

4.year(a) month(a)/monthname(a) day(a) hour(a) minute(a) second(a) 获取指定部分

5.str_to_date(str,format) 将字符串通过指定格式转化为日期

6.date_format(date,format) 将日期转化为字符串

7.datediff(largerdate,smallerdate) 计算largerdate与smallerdate相差的天数

 

 

其他函数:

1.version()

2.database()

3.user()

4.password(str) 返回str的密码形式

5.md5(str) 返回该字符串的md5加密形式

流程控制函数:

1.if(exp,res1,res2)

2.case 要判断的字段或者表达式

when 常量1 then 要显示的值1或者语句1

when 常量2 then 要显示的值2或者语句2

.....

else 要显示的值n或者语句n;

end

3.case

when 条件1 then 要显示的值1或者语句1

when 条件2 then 要显示的值2或者语句2

.....

else 要显示的值n或者语句n;

end

分组函数:

sum()、avg()、max()、min()、count()

1.sum()和avg()一般处理数值型,max()、min()、count()可以处理任何类型

2.以上分组函数都忽略null值

3.可以和distinct搭配实现去重的运算

4.count()性能问题

MYISAM存储引擎下,count(*)效率高

INNODB存储引擎下,count(*)和count(1)效率差不多,比count(字段)要高一些

分组查询:

select 分组函数,列(要求出现在group by之后)

from 表

【where 条件】

group by 分组的列

【order by 子句】

注意:查询列表必须特殊,要求是分组函数和group by后出现的字段

特点:1.分组查询中的筛选条件分为两种:

数据源 位置 关键字

分组前筛选 原始表 group by子句前 where

分组后筛选 分组后的结果集 group by子句后 having

①分组函数做条件时一定是放在having子句中

②能用分组函数前筛选的,有限考虑使用分组前筛选

2. 支持多个字段查询

(3)多表连接

语法:

sql92语法:了解(等值连接、非等值连接、)

sql99语法

select 查询列表

from 表1 别名

【连接类型】 join 表2别名 on 连接条件

【连接类型】 join 表3别名 on 连接条件

....

【where 筛选条件】

【group by 分组】

【having 筛选条件】

【order by排序列表】

分类:

内连接:inner

外连接:

左外连接:left 【outer】

右外连接:right 【outer】

全外连接:full 【outer】

交叉连接:cross:笛卡尔乘积

(4)分页查询

语法:

select 查询列表

from 表1 别名

【连接类型】 join 表2别名 on 连接条件

【连接类型】 join 表3别名 on 连接条件

....

【where 筛选条件】

【group by 分组】

【having 筛选条件】

【order by排序列表】

limit 【offset,】 size;

注:offset为显示条目的起始索引,从0开始,size表示查询的数目

特点:

①limit语句放在查询语句最后

②要显示的页数page,每页条目size:limit (page-1)*size,size;

(5)子查询

1.标量子查询(单行单列)

2.列子查询(单列多行)

(6)联合查询:将多条查询语句的结果合并成一个结果

语法:

查询语句1

union

查询语句2

union

查询语句3

....

应用:查询结果来自多张表,且多个表没有直接连接关系,但查询信息一致

特点:

1.各个查询语句查询的列数相同且对应

2.union关键字默认是去重的,使用union all包含重复项

三、DML语言

(1)插入语句:insert

语法:1.insert into 表名(column,...) values(value,...) ,(value,...) --可插入多行

2.insert into 表名 set column=value,...

(2)修改语句:update

语法:update 表名 set column=newValue,column=newValue,... where 筛选条件

(3)删除语句:

语句:1.delete from 表名

多表删除时,delete a,b from a [连接类型] join b where 筛选条件

--a,b选择哪个表,删除那个表的数据

2.truncate table 表名; --相当于清空整张表数据,效率比delete from table高

比较:1.delete可加条件,truncate不能加条件

2.truncate比delete效率高一点

3.truncate清空再插入,增长列从1开始;delete清空再插入,增长列继续递增

4.truncate删除没有返回值,delete删除有返回值

5.truncate不能回滚,delete可以回滚

四、DDL语言:数据定义语言

(一)、库的管理

1.库的创建:create database [if not exists] 库名;

2.库的修改(修改库的字符集):alter database 库名 character set gbk;

3.库的删除:drop database [if exists] 库名;

(二)、表的管理

1.表的创建:create table [if not exists] 表名 (列名 类型[长度 , 约束],

列名 类型[长度 , 约束],

....);

2. 表的修改:alter table 表名 add|drop|modify|change column 类名 [数据类型 约束];

①修改列名:alter table 表名 change column 列名 新列名 数据类型;

②修改列类型或者约束:alter table 表名 modify column 类名 数据类型;

③新增列:alter table 表名 add column 新列名 数据类型 [first] or [after column];

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

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

3.表的删除:drop table [if exists] 表名;

4.表的复制:①.仅复制表的结构:create table 复制表名 like 表名;

②复制表的结构+数据:create table 复制表名 select [列名,...] from 表名 [条件]

注:跨库的表可以通过[库名.表名]形式获取

(三)数据类型

1.整型:

 

特点:①默认字段为无符号,加上unsigned表示无符号

②插入数值超出范围,报out of range异常,并插入临界值

③不设置长度,会有默认长度,长度为显示长度,搭配zerofill会填充长度

2.小数

 

特点:①M:整数部分+小数部分 ,D:小数部分 ,如果超过范围,则插入临界值

②M和D可以省略;Decimal,M默认为10,D默认为0;float和double,根据插入的数值来决定精度

③定点型的精确度较高

3.字符型

 

特点:char长度固定,效率高;varchar长度可变,效率较慢

(四)、约束:六大约束

1.not null:非空约束

2.default:默认约束,保证该字段有默认值

3.primary key:主键约束,保证字段唯一性且非空,支持组合,但不推荐

4.unique:唯一约束,可以为空,支持组合,但不推荐

5.check:检查约束(mysql不支持),check(条件)

6.foreign key:外键约束(mysql不支持),保证字段值来自另外一张表的某列值,字段类型必须一致或兼容:refrences 外表(列名,必须为key,一般为主键或唯一)

注:①列级约束:在字段后加上约束,外键约束没有效果(?)

②表级约束:[constraint 外键名] primary key(列名)

[constraint 约束名] unique(列名)

[constraint 约束名] check(列名条件)

[constraint 约束名] primary key(列名) references 外表名(列名)

不支持非空和默认约束

③修改表时添加约束:alter table 表名 modify column 字段名 字段类型 新约束;

alter table 表名 add [constraint 约束名] 约束类型 【外键引用】

④修改表时删除约束:

删除非空:alter table 表名 modify column 列名(数据类型) null

删除默认:alter table 表名 modify column 列名(数据类型)

删除主键:alter table 表名 drop primary key;

删除唯一:alter table 表名 drop index 索引名

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

④标识列:auto_imcrement

create table 表名(列名 int|float key auto_increment)

alter table 表名 modify column int|float key auto_increment

五、TCL语言(Transaction Control Language)

(一)事务:事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。

(二)存储引擎:在mysql中用不同的技术存储在文件(或内存)中,show engines来查看mysql支持的存储引擎,常用的存储引擎有innodb,myisam,memory等,innodb支持事务,myisam和memory不支持。

(三)事务的ACID属性:

1.原子性:事务是不可分割的一个工作单位,事物的执行要么全部成功,要么全部失败

2.一致性:事务使数据库从一个一致性状态变换为另一个一致性状态

3.隔离性:一个事务的执行不能被其他事务干扰,并发执行的各个事务不能相互干扰

4.持久性:事务一旦被提交,对数据库的影响是永久性的

(四)事务的隔离级别

1.数据问题

①脏读:对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还 没有被提交的字段之后, 若 T2 回 滚, T1读取的内容就是临时且无效的.

②不可重复度:对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段之后, T1再次读取同一个字段, 值就不同了

③幻读:对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行之后, 如果 T1 再次读取同一个表, 就会多出几行

2.隔离级别

 

注:oracle支持read commited,serializable,默认为read comminted;mysql支持四种隔离级别,默认为repeatable read

(五)相关sql语句

1.隐式事务:比如insert、update、delete

2.显性事务:

set autocommit=0;

start transaction;

sql语句...

commit;

rollback;

 

savepoint 断点

commit to 断点

rollback to 断点

3.设置隔离级别

set session|global transaction isolation level 隔离级别 [别名];

4.查看隔离级别

select @@tx_isolation;

六、视图

(一)好处

1.提高sql语句重用性,效率高

2.保护原始数据安全

(二)创建和增删改查

1.创建:

create view 视图名

as

查询语句;

2.增删改查与sql语句一致

注:某些视图不可更新:

包含以下关键字的sql语句:分组函数、distinct、group  by、having、union或者union all

常量视图

Select中包含子查询

join

from一个不能更新的视图

where子句的子查询引用了from子句中的表

3.更新:

①create or replace view 视图名 as 查询语句

②alter view 视图名 as 查询语句

4.删除

drop view 视图名

5.查看

①desc 视图名;

②show create view 视图名

七、存储过程

(一)创建

create procedure 存储过程名(in|out|inout 参数名 参数类型,....)

begin

存储过程体

end $

注意:①需要设置心得结束标记 delimiter $

②当存储过程体仅有一条sql语句时,可以省略begin end

(二)调用

call 储存过程名(实参列表)

八、函数

(一)创建

create function 函数名(参数名 参数类型) returns 数据类型

begin

函数体

end

(二)调用

select 函数名(实参列表)

九、变量

(一)全局变量

作用域:针对所有会话(连接)有效,但不能跨重启,除非修改配置文件

查看全局变量:show global variables like ’‘;

查看指定系统变量:select @@global.autocommit;

赋值:set @@global.autocommit=0 或者 set global autocommit=0;

(二)会话变量

作用域:当前会话有效

查看会话变量:show session variables like '';

查看指定会话变量:select @@autocommit;select @@session.tx_isolation; session可以省略

赋值:set @@session.tx_isolation='read-uncommit';或者set session tx_isolation='read-commited'

(三)用户变量

声明并初始化:

①set @变量名=值;

②set @变量名:=值;

③select @变量名:=值;

赋值:

方式一:用于简单的赋值

①set 变量名=值;

②set 变量名:=值;

③select 变量名:=值;

方式二:一般用于表的赋值

select 字段名or表达式 into 变量名 from table;

使用:select @变量名;

(四)局部变量名

声明:

declare 变量名 类型 【default 值】;

赋值:

方式一:

set 变量名=值;

set 变量名:=值;

select 变量名:=值;

方式二:

select 变量名or表达式 into 变量 from table

使用:

select 变量名

十、分支

(一)if函数

语法:if(条件,值1,值2)

特点:可以用在任何位置

(二)case语句

语法:

情况一:类似于switch

     case 表达式

     when 值1 then 结果1或语句1(如果是语句,需要加分号) 

     when 值2 then 结果2或语句2(如果是语句,需要加分号)

     ...

     else 结果n或语句n(如果是语句,需要加分号)

     end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)

 

情况二:类似于多重if

     case 

     when 条件1 then 结果1或语句1(如果是语句,需要加分号) 

     when 条件2 then 结果2或语句2(如果是语句,需要加分号)

     ...

     else 结果n或语句n(如果是语句,需要加分号)

     end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)

特点:可以放在任何地方

(三)if elseif语句

语法:

    if 情况1 then 语句1;

    elseif 情况2 then 语句2;

    ...

    else 语句n;

    end if;

特点:只能放在begin end中

(四)循环

语法:

【标签:】while 循环条件 do

循环体

end while【标签】;

特点:只能放在BEGIN END里面

    如果要搭配leave/iterate跳转语句,需要使用标签,否则可以不用标签

    leave类似于java中的break/continue语句,跳出所在循环!!!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值