• 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();
    
  • 相关阅读:
    win7_64 下redis安装并进行php-redis扩展
    redis 与 memcache 性能测试比较
    前端一班:HTML5当天学习总结-摘抄张果博客园
    Hibernate ORM框架——项目一:Hibernate事务的生命周期,不建议使用openSession而改造
    Hibernate ORM框架——Hibernate查询之Criteria接口、Native SQL 查询、Query接口(批量操作)
    Hibernate ORM框架——Hibernate分页查询and多表查询
    Hibernate ORM框架——项目一:Hibernate查询;项目二:集合相关查询
    Hibernate ORM框架——连接池相关
    Hibernate ORM框架——综合
    Hibernate ORM框架——续第二章:Hibernate映射关系:双向关联
  • 原文地址:https://www.cnblogs.com/wanglong1/p/13934717.html
Copyright © 2020-2023  润新知