zoukankan      html  css  js  c++  java
  • mysql基础记录

    1. 概念介绍

    • 数据库:专门存储数据,存储数据的仓库,同时提供了对数据的操作方法,增删改查的方法

    事务

    事务:是作为一个单元的一组有序的数据库操作,如果组当中所有操作都成功,则事务执行成功,如果有一个操作执行失败,则事务执行失败,回滚操作。

    四大特性 ACID

    • 并发操作,一个事务的操作以及操作的数据对另一个事务是隔离的,通过锁的机制实现的

      并发 并行

      并发 交替做不同的事情 不同的代码块交替执行

      并行 同时做不同的事情 不同的代码块同时执行

    1. 原子性:事务包含的所有操作全部成功,要么全部失败回滚;成功必须完全应用到数据库,失败则不能不能对数据库产生影响。

    2. 一致性:事务执行前和执行后必须处于一致状态。

    3. 隔离性:当多用户并发访问数据库时候,数据库为每一个用户开启一个事务,这个事务不被其他事务操作干扰,多个并发事务直接互相隔离。

    4. 持久性:一旦事务被提交了,那么数据库当中的数据改变是永久性的,即便数据库系统发生故障,也不会丢失事务操作。

    事务回滚 rollback

    用户定义操作,当事务全部成功的时候,当事务某一条操作失败的时候,回滚 将之前以及成功的操作 撤销。

    2. 事务隔离级别

    如果不考虑隔离级别会出现的问题

    • 脏读

      • 读取到脏数据,读取到别的事务未提交的数据

      • A找B买鞋子,A发起转账,通知b去查看账户,b账户上面看到了金额,a转账事务发生了问题,b账户没有转账, b 读取到了a事务未提交的数据。

    • 不可重复读

      • 一个事务在执行的过程当中,多次读取数据,但是结果不一样(update,delete)

    • 幻读

      • 一个事务对自己之前的操作产生质疑,仿佛出现了幻觉(insert)

     

    有了隔离级别,能够避免这几种情况

    • 读未提交 最低的级别 什么问题都可能发生

    • 读已提交 解决的是一个脏读的问题

    • 可重复读 解决 脏读 不可重复读的问题

    • 串行 解决 脏读,不可重复读,幻读

    具体选择哪种隔离级别?

    两方面考虑: 安全性 效率

    安全性: 串行 》 可重复读》读已提交》读未提交

    效率 : 串行< 可重复读《读已提交《读未提交

    数据库分类

    关系型数据库:采用关系模型来组织数据的,已行列存储数据

    mysql,orcle,PostgreSQL

    非关系型数据库: nosql(not only sql) 是以 key-value 形式存储的,有很多结构

    nosql {'name':'tangwei','img':[1.jpg,2.jpg,3.jpg]}

    三范式 数据库优化相关的

    设计表的时候 要遵循一个规则,三范式

    1. 第一范式(1NF):

      数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。

    2. 第二范式(2NF):

      要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识

    3. 第三范式(3NF):

      满足2NF后,要求:表中的每一列都要与主键直接相关,而不是间接相关(表中的每一列只能依赖于主键)。

      数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c ?属性之间含有这样的关系,是不符合第三范式的。

    数据库引擎

    数据库用来存储数据,处理数据,保护数据的核心

    • innodb mysql默认引擎,支持事务,事务型首选引擎,行锁,外键,

    • Myisam 是对Isam升级,不支持事务,表锁,在查询,或者插入的时候效率很高,

    选择:

    提供事务支持,回滚,崩溃恢复这些能力,选择innodb

    针对单纯用来查询,插入的,不要求事务的 选择 Myisam

    一个数据库中有多张表,每张表可以拥有自己独立的引擎,提供数据库的性能

    使用数据库

    数据库是一个服务,需要开启,暂停,关闭这些状态

    sql语句语法

    • 以分号结尾

    • 不区分大小写

    • select show insert 尽量大写

    1.连接mysql
    	mysql -h主机地址 -u用户名 -p用户密码
    	退出 exit
    2.创建数据库,数据表,删除数据库,数据表
    	show databases;#展示所有数据库
    	use stu;#使用一个数据库
    	show tables;# 展示当前数据库下的表
    	show create table tableName;# 展示表的创建命令
    	create database testdb  charset=utf8;;# 创建testdb数据库,并指定字符集
    	create table class(id int primary key auto_increment,name char(10))# 创建数据表class指定主键自增
    
    	drop database 数据库名;# 删除数据库
    	drop table 表名;# 删除数据表
    3.插入数据
    	insert into 表名 ( 字段名1,···, 字段名n ) values ( 值1, ···, 值n );# 插入单条数据
     	insert into class(name,sex,degree) values('charles','1','80.5'),('tom','1','80.5');# 插入多条数据
    
    4.查询数据
    	格式: select 字段1, ···, 字段n from 表名 where 表达式 
    		select 字段1, ···, 字段n
    	    from 表名或视图名
    	    [where <条件>]
    	    [group by <分组表达式>]
    	    [having <条件>]
    	    [order by <排序表达式>[ASC|DESC]]
    
    	select * from class limit 2; # 查看前两行
    	select * from class limit 5,10; # 查看6-15行,10为查看多少行
     	1.AS子句的格式为:列名或计算表达式 [AS] 列标题
      	模板:select <字符型字段> as 列标题1,<字符型字段> as 列标题2, <字符型字段> as 列标题3 from bt_name;
      	2.消除查询结果中的重复行
      	select distinct <字符型字段>[,<字符型字段>,...] from tb_name;
      	3.使用比较运算符:
                  模板:select * from tb_name where <字符型字段> >= n ;
            1.指定范围:
                  用于指定范围的关键字有两个:between...and和 not between...and。
                  格式为:select * from tb_name where [not] between <表达式1> and <表达式2>;
                  其中:between关键字之后的是范围的下限(即低值),and关键字之后的是范围的上限(即高值)
                  用于查找字段值在(或不在)指定范围的行。
           2.使用列举:
                 使用in关键字可以指定一个值的集合,集合中列出所有可能的值,当表达式的值与集合中的任一元素个匹配时,即返回true,否则返回false。
                 模板:select * from tb_name where <字符型字段> [not] in(值1,值2,...,值n);
           3.使用通配符进行模糊查询:
                 可用like 子句进行字符串的模糊匹配查询,like子句将返回逻辑值(true或False)。
                 like子句的格式: select * from tb_name where <字符型字段> [not] like <匹配串>;
                 其含义是:查找指定字段值与匹配串相匹配的记录。匹配串中通常含有通配符%和_(下划线)。
                 其中:  %:代表任意长度(包括0)的字符串
           4.使用null的查询
                 当需要判定一个表达式的值是否为空值时,使用 is null关键字。
                 当不使用not时,若表达式的值为空值,则返回true,否则返回false;当使用not时,结果刚好相反。
                 模板:select * from tb_name where <字符型字段> is [not] null;
           5.多重条件查询:使用逻辑运算符
                 逻辑运算符and(与:两个条件都要满足)和or(或:满足其中一个条件即可)可用来联接多个查询条件。and的优先级高于or,但若使用括号可以改变优先级。
                 模板:select * from tb_name where <字符型字段> = 'volues' and <字符型字段> > n;
    	4.对查询结果排序
            order by子句可用于对查询结果按照一个或多个字段的值(或表达式的值)进行升序(ASC)或降序(DESC)排列,默认为升序。
            格式:order by {排序表达式[ASC|DESC]}[,...n];
            其中:排序表达式既可以是单个的一个字段,也可以是由字段、函数、常量等组成的表达式,或一个正整数。
            模板:select * from tb_name order by <排序表达式> <排序方法>;
    	5.使用统计函数:又称集函数,聚合函数
            在对表进行检索时,经常需要对结果进行计算或统计,T-SQL提供了一些统计函数(也称集函数或聚合函数),用来增强检索功能。统计函数用于计算表中的数据,即利用这些函数对一组数据进行计算,并返回单一的值。
            常用统计函数表
                  函数名      功能
                  AVG         求平均值
                  count        求记录个数,返回int类型整数
                  max          求最大值
                  min           求最小值
                  sum          求和
            1. SUM和AVG
                 功能:求指定的数值型表达式的和或平均值。
                 模板:select avg(<字符型字段>) as 平均数,sum(<字符型字段>) as 总数 from tb_name where <字符型字段> ='字符串';
            2. Max和Min
                 功能:求指定表达式的最大值或最小值。
                 模板:select max(<字符型字段>) as 最大值,min(<字符型字段>) as 最小值 from tb_name;
            3. count
                 该函数有两种格式:count(*)和count([all]|[distinct] 字段名),为避免出错,查询记录个数一般使用count(*),而查询某字段有几种取值用count(distinct 字段名)。
                 (1).count(*):
                     功能:统计记录总数。
                     模板:select count(*) as 总数 from tb_name;
                 (2).count([all]|[distinct] 字段名)
                     功能:统计指定字段值不为空的记录个数,字段的数据类型可以是text、image、ntext、uniqueidentifier之外的任何类型。
    	6.对查询结果分组
            group by子句用于将查询结果表按某一列或多列值进行分组,列值相等的为一组,每组统计出一个结果。该子句常与统计函数一起使用进行分组统计。
            格式为:group by 分组字段[,...n][having <条件表达式>];
            1.在使用group by子句后
                 select列表中只能包含:group by子句中所指定的分组字段及统计函数。
            2.having子句的用法
                 having子句必须与group by 子句配合使用,用于对分组后的结果进行筛选(筛选条件中常含有统计函数)。
            3. 分组查询时不含统计函数的条件
                 通常使用where子句;含有统计函数的条件,则只能用having子句。
                 模板:select <字符型字段>,count(*) as 列标题 from tb_name where <字符型字段>='字符串' group by <字符型字段>;
    5.修改数据(Update)
    
        Update 语句用于修改表中的数据。
              格式:update tb_name set 列名称 = 新值 where 列名称 = 某值;
    6.删除数据(Delete)
    
          删除单行
              格式:delete from tb_name where 列名称 = 某值;
          删除所有行
              可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
              格式:delete * from tb_name   或  delete from tb_name;
    7.alter 修改表结构
    
    	 alter add命令用来增加表的字段。
    	 alter add命令格式:alter table 表名 add字段 类型 其他;
    
    	 例如,在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0:
    		alter table MyClass add passtest int(4) default '0';
    	 添加两个字段  
    		alter table Person add age int,add address varchar(11); 
    	 删除两个字段
    		alter table Person drop column age,drop column address;
    	 修改字段的注释
    		alter table `student` modify column `id` comment '学号';
    	 1) 加索引
    	   	alter table 表名 add index 索引名 (字段名1[,字段名2 …]);
    	 	alter table employee add index emp_name (name);
    	 2) 加主关键字的索引
    		alter table 表名 add primary key (字段名);
    		alter table employee add primary key(id);
    	 3) 加唯一限制条件的索引
    	  	alter table 表名 add unique 索引名 (字段名);
    	 	alter table employee add unique emp_name2(cardnumber);
    	 4) 删除某个索引
    	 	alter table 表名 drop index 索引名;
    		alter table employee drop index emp_name;
    	 5) 增加字段
    		ALTER TABLE table_name ADD field_name field_type;
    	 6) 修改原字段名称及类型
    		ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;
    	 7) 删除字段
    		ALTER TABLE table_name DROP field_name;
    	 8) 重命名表
    		ALTER TABLE table_name rename table_name_new;
    	 9) 修改字段类型
    		ALTER TABLE table_name modify field_name  new_field_type;
    	 10) 添加外键
    		alter table table_name add foreign key(table_name.column) references 表名(字段)
    	 11) 删除外键
    		alter table 表名 drop foreign key 外键名
    	 12)删除主键自增
    	 	先删除自增,再删除字段
    	 	ALTER TABLE table_name modify field_name  field_type;
    	 	alter TABLE table_name drop primary key
    	 13) 删除|添加外键字段
    	 	添加时先添加字段,后设置外键
    	 	alter table 表名 add 字段 类型
    	 	alter table 表名 add foreign key(字段)references 表名(字段)
    	 	删除时先删除外键,后删除字段
    	 	alter table 表名 drop foreign key 外键名
    	 	alter table 表名 drop 字段 
    8.创建视图,触发器,索引
    
    索引高效获取数据的存储结构
    alter table 表名 drop index 索引名;# 添加索引
    alter table employee drop index emp_name;# 删除索引
    
    视图:只保存语句,不保存数据,类似虚表
    create view view_name as (select * from students);# 创建视图
    drop view view_name# 删除视图
    
    触发器:执行插入删除修改时制动触发,激活此对象
    create trigger trigger_name after/before insert on tb1 for each row
    	bengin
    		insert into tb2 values()
    	end
    9.用户授权
    	1、将root密码改为newroot。 
    	alter user root@localhost identified by ‘newroot’ 
    	2、新增用户
    	create user ‘用户名’@’主机地址’ identified by ‘密码’;
    	3.授权
    	grant select/insert/delete/Update on database.table to user@host;
    

      

     

  • 相关阅读:
    ConcurrentHashMap源码分析
    HashMap源码与相关面试题
    字符串学习笔记(三)---- StringBuilder
    字符串学习笔记(二)---- StringBuffer
    Vue一些基本操作技巧
    PHP代码及命名规范
    Js返回顶部的方法
    linux下镜像网站的几种方法
    单例模式示例
    工厂模式和IOC练习
  • 原文地址:https://www.cnblogs.com/songdanlee/p/11368729.html
Copyright © 2011-2022 走看看