MySQL学习笔记2

数据库引擎

MYISAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间大小 较小 较大约为两倍

常规操作:

  • MYISAM:节约空间,速度较快

  • INNODB:安全性高,事务处理多表操作

所有数据文件都存放在data目录下,一个文件夹对应一个数据库,本质是文件的存储

设置数据表的字符编码

charset=utf8

MySQL默认字符编码不支持中文Latin1;

可以在my.ini中添加charset-set-server=utf8;设置默认编码形式;

修改

alter table 旧表名 rename as 新表名 -- 修改表名

alter table 表名 add 字段名 列属性 --增加表字段

alter table 表名 modify 字段名 新字段属性 -- 修改约束但是不能重命名字段名
alter table 表名 change 字段名 新字段名  字段属性 --可以重命名也可重新修改约束

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

drop table if exists 表名 -- 如果表存在就删除表

--创建和删除最好进行判断,字段名最好用` `包裹起来;

-------------------------------------------------------------------------------------
update 表名 set `列名`=`值`,`列名`=`值` where 条件 -- 修改属性值

表内创建:

key `约束名(FK_名字)`(`外键的列`),
constraint `约束名(FK_名字)` foreign key (`外键的列`) references `引用表名`(`引用字段`)

表外创建:

alter table `表名`
add constraint `约束名(FK_名字)` foreign key (`外键的列`) references `引用表名`(`引用字段`)

以上是物理外键,数据库级别的外键(不建议使用,容易造成数据过多造成困扰)

最佳实现:应用层实现(数据库的表就是单纯的一个表只用来存数据,只有行和列,使用多张表的数据使用外键最好用程序实现)

添加

insert into 表名([字段名1,字段名2,字段名3])values('值1','值2','值3') -- 插入语句,字段和值要一一对应,字段名可以省略但是值要一一对应。

删除

delete from `表名` where 条件 -- 删除指定数据

------------------------------------------------------
truncate table `表名` -- 清空数据库表,表的结构和索引约束不变

--相同点:都能删除数据不删除表结构
--不同点:truncate重新设置自增列会归零。turncate不会影响事务

DQL(重点)

select * from 表名 --查询表内的所有数据

select 字段名,字段名 from 表名 --查询指定表内的字段

select 字段名 as 别名 ,字段名 as 别名 from 表名 as 别名 --可以给查询的结果起一个别名也可以给表起一个别名

select concat('x',字段名)as 新名字 from 表名 -- 函数concat(a,b)将ab连接起来

-- distinct去重
select distinct `字段名` from 表名


--数据库的列(表达式)
select version() --查询系统版本

select 100-1 as 计算 --计算结果

select @@auto_increment_increment --查询自增的步长

--select 表达式 from 表名
--------------------------------------------------------------
--模糊查询
select `字段名` from `表名` where `字段名` like 条件 -- 如果字段名匹配到条件则为真

-- %是值0或多个; _是一个

 a is null -- 如果为null结果真
 
 a is not null --如果部位null则结果为真
 
 a between b and c --a在b和c区间之间则为真
 
 a in (b,c,d) --如果a是b,c,d中某一个值则为真

联表查询

inner join :如果表中至少有一个匹配,就返回行
left join :从左表中返回所有值即使右表没有匹配
right join :从右表中返回所有值即使左表没有匹配


--inner join
select 别名1.表1字段名,表2字段名 
from 表1 as 别名1
inner join 表2 as 别名2
on 别名1.表1字段名=别名2.表1字段名

--left join
select 别名1.表1字段名,表2字段名 
from 表1 as 别名1
left join 表2 as 别名2
on 别名1.表1字段名=别名2.表1字段名

--right join
select 别名1.表1字段名,表2字段名 
from 表1 as 别名1
right join 表2 as 别名2
on 别名1.表1字段名=别名2.表1字段名

步骤:

  • 查询的数据 select .....
  • 从那些表中查询 from 表 方式 join 连接的表 on 交叉条件

自连接

--自连接就是把一张表看成两张一样的表

select 别名3.`字段名` as 别名1, 别名4.`字段名` as 别名2
from 表 as 别名3,表 as 别名4
where 条件

分页和排序

limit(起始值下标,pagesize(页面大小)) --分页

------------------------------------------------
order by 字段名 排序方式 -- 排序,排序方式:升序 ASC 降序 DESC

分组和过滤

select 字段名...
from 表1
inner join 表2
on 表1.字段名=表2.字段名
group by 字段名  --通过什么字段分组
having 条件  --过滤

常用mysql函数

数学运算

select ABS(-1) --取整
select ceiling(9.2) --向上取整
select floor()--向下取整
select rand() --返回一个随机0-1的随机数
select sign() --返回一个数的符号 负数返回-1 0返回0;正数返回1
----------------------------------------------------------------------

字符串函数

select char_length() --返回字符串的长度
select concat()  --拼接字符串
select insert() --查询 ,替换
select lower() --小写字母
select upper() --大写字母
select instr() --返回第一次出现字母所在的索引
select replace() --替换字符串
select substr() --返回指定的字符串
select reverse() --反转字符串

时间日期函数

select current_date() --获取当前日期
select curdate() --获取对当前日期
select now() --获取当前的时间
select localtime() --本地时间
select sysdate() --系统时间
select year(now()) --获取年

系统

select system_user() --系统用户
select user() --系统用户
select version() --版本

聚合函数

--查询一个表中有多少个记录用count
select count(字段名) from 表名  -- 计数使用字段名计数会忽略null值
select count(*) from 表名     --不会忽略null 本质计算行数
select count(1) from 表名     --不会忽略null 本质计算行数

--------------------------------------------------------------
select sum(字段名) as 总和 from 表名 -- 计算总和
select avg(字段名) as 平均数 from 表名 -- 计算平均数
select min(字段名) as 最小数 from 表名 -- 计算最小数
select max(字段名) as 最大数 from 表名 -- 计算最大数

select语法:

select 去重 查询的字段 from 表
inner/left/right join 连接的表 on 条件
where 条件
group by 通过那个字段进行分组
having 过滤分组记录的条件
order by 排序
limit 分页

事务

要么成功,要么失败

事务原则

ACID:

  • 原子性:要么一起成功要么一起失败;
  • 一致性:事务前后的数据要一致;
  • 隔离性:多个用户操作数据库,事务之间不会影响;
  • 持久性:事务结束后数据不随外界原因导致丢失;(事务没有提交就恢复原装,一旦提交就持续到数据库,不可逆)

脏读:一个事务读取了另一个事务未提交的事务;

不可重复读:在一个事务内读取表中某一行数据时多次读取结果不同;

虚读:指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致;

--mysql默认开启事务
set autocommit=0 --关闭事务
set autocommit=1 --开启事务(默认)

--------------------------------------------------
--手动处理事务
set autocommit=0 --关闭自动提交
--事务开启
start transaction --标记一个事务的开始
insert ...
insert ...
--提交:持久化 成功
commit
--回滚 回到原来的数据样子  失败
rollback
--事务结束
set autocommit=1 --开启事务自动提交

--------------------------------------------------------
savepoint 保存点名 --设置一个事务的保存点
rollback to savepoint 保存点名 --回滚到保存点
release savepoint 保存点名  --删除保存点名

索引

索引是帮助MySQL获取数据的数据结构

分类

  • 主键索引 (PRIMARY KEY)
    • 唯一标识,主键不可重复,只能有一个列是指为主键
  • 唯一索引 (UNIQUE KEY)
    • 避免重复的列出现,可以重复设置
  • 常规索引 (KEY/INDEX)
    • 默认,index/key关键字设置
  • 全文索引 (FullText)
    • 快速定位数据,在特定的引擎下才有MyISAM
select index from 表名 --显示表中的所有索引信息

alter table 表名 add  索引类型    索引名 列名

--explain 分析sql执行的状况

用户权限管理

create user 新用户名 identified by 密码 --创建用户

set password for 用户名=password(密码)--修改密码

rename user 用户名 to 新名字 --修改用户名

grant all privileges on *.* to 用户名 --设置权限除了给别人授权其它都可以

show grants for 用户名 -- 产看用户权限
show grants for 主机名

revoke all privileges on *.* from 用户名 --撤销权限

drop user 用户名 --删除用户

备份

  • 直接拷贝物理文件
  • sqlyog可视化工具导出
  • 使用命令myqldump命令行使用
    • mysqldump -h主机名 -u用户名 -p密码 数据库 表名 > 物理磁盘位置/文件名
soure 备份文件 --登录的情况下导入

三大范式

第一范式

  • 原子性,每列不可再分

第二范式

  • 每张表只描述一件事,前提是满足第一范式

第三范式

  • 每一列的数据和主键相关,而不能间接相关

JDBC

步骤

  • 加载驱动

    class.forname("com.mysql.jdbc.driver");//固定写法,加载驱动
    
  • 连接数据库

    String url="jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=true";
    String username="用户名";
    String pssword="密码";
    Connection connection=DriverManager.getConnection(url,username,password);//connection是sql对象
    
  • 获得执行的sql对象

    Statement statement=connection.createStatement();//statement是sql对象
    String sql="sql语句"
        
     //
    
  • 获得返回的结果集

    Resultset resultset=statement.executeQuery(sql);//executequery查,executeupdate增删改
    
    
    
  • 释放连接

resultset.close();
statement.close();
connection.close();
原文地址:https://www.cnblogs.com/wanglong1/p/13934717.html