微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL知识总结

一、什么是数据库

用来存储和管理数据的仓库
本质就是一个文件系统,还是以文件的形式,将数据保存在电脑硬盘上。
为什么要使用数据库

    • 存储方式 优点 que’dian
      内存(变量 数组 集合) 速度快 不能持久化存储,数据实临时的
      文件 数据持久化 使用IO流来操作文件,不方便
      数据库 1.数据可以永久保存;2方便管理和存储数据库;3:使用统一的操作方式操作数据库sql语句) 占用资源,收费的
  • 开发中常用的数据库:
    MysqL :开源免费的数据库
    Oracle:收费的,安全性高
    DB2:IBM,收费的超大型的数据库,在银行系统中
    sql server: # .net 只能运行在windows

二、MysqL卸载和安装

●进入MysqL官网:https://www.MysqL.com/downloads/

三、MysqL和Java的关系

●问题1:数据库系统是一个独立的程序;设计的Java(web)应用程序也是一个独立的程序。两者之间如何联系?如何让Java访问数据库
处理方式:给两者之间搭建一个“桥”,也就是数据库连接,通过此桥,实现两者的沟通与信息交互。
●问题2:谁来搭建这个桥?
处理方式:找一个建筑队来完成。
在计算机上,建筑队就是一个类(DriverManager),要完成工作,必须由类的方法。即有类DriverManager中的方法getConnection(建连接所需要的资源),就可以创建一个数据库连接。
实现:Connection conn=DriverManager.getConnection(url);
url:建立连接所需要的资源。
●问题3:建桥需要哪些资源?
处理方式:需要至少三个资源,访问数据库所需要的:用户名、密码、数据库名。
(在计算机里,我们称为数据库连接字URL-------统一资源定位)。
●问题4:如何找到建筑队?
处理方式:必须有一个管理建筑队的机构,在计算机上,称为驱动程序(java.sql.Driver)
实现:获取“建筑队”------即:加载驱动程序。Class.forName(com.MysqL.jdbc.Driver);
其中,com.MysqL.jdbc.Driver为MysqL连接的驱动程序

四、使用数据库

●开启服务----》找到MysqL服务
○win+r ----->services.msc ------------->MysqL
○一定要是管理员的权限
登录MysqL
○win+r输入cmd:

MysqL -u用户名 -p密码
MysqL -h主机ip -u用户名 -p密码 -h 指定主机

退出

exit
quit

五、sql语句

1.操作表

●创建表

create table 表名

●创建和以前一样的表结构

create table 新表名 like 旧的表名

●查看表

show tables; -- 查看所有的表
desc 表名; 表的信息

删除

drop table 表名;
drop table if exists; 判断是否存在

2. 修改

修改表名

rename table 旧表 to 新表;

修改字符集

alter table 表名 character set 字符集;

●向表中添加列(字段)

alter table 表名  add 字段名称 字段的类型

修改表中字段的类型或长度

alter table 表名 modify 字段名称 字段类型

修改字段的名

alter table 表名 change 旧列名  新列名 类型(长度)

删除

alter table 表名 drop 列名

3.操作表数据

●插入全部数据,写字段名

insert into 表名(字段1,字段2,。。。) values(数据1,数据2,数据.....);

●插入全部数据,不写字段名

insert into 表名 values(数据1,数据2,数据.....);

●插入指定字段值

insert into 表名(字段名) values(数据);

●注意事项

* 值和字段必须要对应(个数/类型相同)
* 值的数据大小,必须在字段指定的长度范围内
* varchar char data 值必须使用单引号,或者双引号
* 如果插入空值,可以忽略不写,或者插入null
* 如果插入指定的字段的值,必须写字段名

修改列名的值(不带条件)

upate 表名 set 列名 = 值;

修改列名的值(带条件)

update 表名 set 列名 =  值 where  列名= 数值;

删除

detele from 表名;不推荐,有多少条记录,旧执行多少次的删除,效率低
trancate from 表名 :推荐使用, 删除的整张表,再创建一个新表

4.查询表

查询表中所有数据

select * from 表名;

查询表,只显示指定的字段

selcet 指定字段1,指定字段2... from 表名;

●将所有的员工信息查询出来,并将列名改为中文显示
○别名查询,使用关键字‘AS ’

SELECT 
	eid AS '编号',
	ename AS '姓名',
	sex AS '性别',
	salary AS '薪资',
	edate AS '入职日期',
	edpt AS '部门'
FROM emp

○查一共有几个部门

select disTINCT 字段名 from 表名;

查询所有的员工的工资+1000进行显示

select ename,salary + 1000 from emp;

六、排序(DQL)

●单排

/*select 字段名  from 表名
[where 字段 = 值]
order by 字段名 [ASC/DESC]
*/

SELECT * FROM emp ORDER BY salary DESC

●组合排序

  • 同时对多个字段进行排序,如果第一个字段相同,就按照第二个排序
  • 需求:薪资是一样的,按编号去排
  • SELECT 字段 FROM 表名 ORDER BY 字段名 [DESC],字段名 [ASC]

DQL之聚合函数

  • 对数据进行纵向的操作,对某一列的值进行计算,返回一个单一的结果(忽略null值)

  • count(1) 统计某列的行数(null)
    sum 计算某列数据的和
    max 计算该列的最大值
    min 计算该列的最小值
    avg 计算该列的平均值
  • 格式

select 聚合函数(字段名) from 表名;

DQL分组查询

SELECT * FROM emp GROUP BY 字段 [having 条件]

分组,只能显示集合中的第一条数据,因此单纯的使用分组查询是没有实际意义的
所以,经常使用聚合函数和分组结合使用
  • SELECT 聚合函数 FROM 表名 GROUP BY 字段(根据该字段进行分组)
SELECT AVG(salary) FROM emp GROUP BY sex;
  • 条件
where where 分组前的过滤,进行条件判断,后面不能跟聚合函数
having 分组后的过滤,进行条件判断,后面可以跟聚合函数

limit关键字(分页查询

  • limit offset,length
    • 格式
      • select 字段 from 表名 limit offset,length
        offset :从哪开始  认是0
        length :要查询的条数
        
    • 查询3条数据
    • 分页查询,每次显示2条数据
    • 起始索引= (当前页-1) * 每页的条数

七、约束

sql约束

  • 什么是约束

    • 对表中的数据进行进一步的限制,用来保证数据的正确性、有效性、完整性
  • 常见的约束

    • 约束 作用
      主键 primary key
      唯一 unique
      非空 not null
      外键 foreign key

主键

主键概述

  • 特点:不可重复 唯一 非空

  • 作用:修饰字段

  • 语法格式

    • CREATE TABLE s(
        sid INT PRIMARY KEY,
        sname VARCHAR(10)
      )
      
      DROP TABLE s
      
      CREATE TABLE s(
       sid INT,
       sname VARCHAR(10),
       -- 单独指定
       PRIMARY KEY(sid)
      
      )
      CREATE TABLE s1(
      
        sid INT,
        sname VARCHAR(5)
      )
      -- 创建的时候不指定主键,通过DDL语句进行设置主键
      ALTER TABLE s1 ADD PRIMARY KEY(sid)
      
    • 查看表结构 : desc 表名

    • 删除主键:

    ALTER TABLE s1 DROP PRIMARY KEY;
    
    • 哪些字段可以作为主键?
      • 针对业务去设计主键,每张表都要设计一个主键id
      • 主键没有实际的含义,给数据库和程序使用的,跟客户无关
        • 主键没有意义没关系,只要保证不重复、非空就可以了

主键自增

DROP TABLE s1
CREATE TABLE s1(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	sname VARCHAR(10)
	
)
INSERT INTO s1 VALUES(NULL,'a')
INSERT INTO s1(sname) VALUE ('b')

主键自增设置初始值

DROP TABLE s1
CREATE TABLE s1(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	sname VARCHAR(10)
	
)
INSERT INTO s1 VALUES(NULL,'a')
INSERT INTO s1(sname) VALUE ('b')

CREATE TABLE s2(
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname VARCHAR(10)
)AUTO_INCREMENT=100;

INSERT INTO s2 VALUES(NULL,"a");
INSERT INTO  s2 VALUES(NULL,"b")

删除操作对主键的影响

delete 对自增没有影响
truncate 恢复自增初始化值
DELETE	FROM s2
SELECT * FROM s2
INSERT INTO s2 VALUES(NULL,"a");
INSERT INTO  s2 VALUES(NULL,"b")

TruncATE  TABLE s2

非空约束

  • 某一列不能为空

  • 格式

    • 字段名 字段类型  not null
      
  • 学生的名字字段添加非空约束

    • 非空和主键区别
-- 非空约束
CREATE TABLE s2(
  sid INT PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR(20) NOT NULL
)
DESC s2

INSERT INTO s2(sname) VALUE (NULL)
INSERT INTO s2 VALUES(NULL)

唯一约束:字段中的值不能重复(对null不做唯一判断)

  • 格式
    • 字段名 字段类 unique;
DROP TABLE s2
CREATE TABLE s2(
 sname VARCHAR(20) UNIQUE
)
DESC s2
INSERT INTO s2 VALUES('a');
INSERT INTO s2 VALUES('b');
INSERT INTO s2 VALUES(NULL);

设置认值(列)

DROP TABLE s2
CREATE TABLE s2(
  sid INT PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR(20),
  sex CHAR(1) DEFAULT '女'
)
DESC s2
-- 添加数据,使用认值
INSERT INTO s2(sname) VALUE ('a') 
INSERT INTO s2(sname,sex) VALUE(DEFAULT,'男')

八、事务

事务概述

  1. 什么是事务
    • 是由一条或者多条sql语句组成
      • 要么全部成功,要么全部失败(执行回滚)
  2. 回滚(从哪来的回哪去)
    • 在事务运行的过程中发生了某个故障,事务便不再继续执行下去,系统对事物中数据所有已完成的
      操作全部撤销,滚回到开始时的状态
CREATE TABLE zh(
   id INT PRIMARY KEY AUTO_INCREMENT,
   sname VARCHAR(20),
   money DOUBLE
	
)
INSERT INTO zh VALUES(NULL,'小明',1000);
INSERT INTO zh VALUES(NULL,'小王',1000);

-- 转钱操作

UPDATE zh SET money = money - 500 WHERE id = 1;
-- 系统崩了
UPDATE zh SET money = money + 500 WHERE id = 2;

手动提交事务的格式

  • 手动提交事务
  • 自动的提交事务
开启事务 : start transation;BEGIN 
提交事务 : commit                
回滚事务 : rollback               
START TRANSACTION;
UPDATE zh SET money = money - 500 WHERE id = 1;
崩了
UPDATE zh SET money = money + 500 WHERE id = 2;

SELECT * FROM zh
ROLLBACK
# commit

取消自动提交

SHOW VARIABLES LIKE ‘autocommit’ —查看当前的提交方式

  • on :自动提交
  • off :手动提交
SHOW VARIABLES LIKE 'autocommit'
SET @@autocommit = off

SELECT * FROM zh
INSERT INTO zh VALUES(NULL,"松江",5)

事务的四大特性

特性 含义
原子性 每个事务都是一个整体,不可再拆分。事务中所有的sql要么全部执行成功,要么都失败
一致性 事务在执行前数据库的状态与执行后数据库的状态保持一致;
隔离性 事务和事务之间不应该相互影响,执行时保持隔离状态
持久性 一旦事务执行成功,对数据库修改是永久的。就算你关机,数据也会保存下来

MysqL的隔离级别(了解)

数据并发访问

  • 一个数据库可能有多个客户端在访问,这些客户端都可以并发方式访问数据库数据库的相同数据可能被多个事务同时访问,如果我们不对其采用隔离,就会发生各种问题,破坏数据的完整性。

数据并发访问产生的问题

并发访问引发的问题 含义
脏读 一个事务读取到了另一个事务的尚未提交的数据
不可重复读 一个事务中两次读取的数据内容不一致
幻读 一个事务中,某一次的select操作结果所表现得数据状态,无法支撑后续的因为误操作,查询到的数据不准确,导致幻读

四种隔离级别

级别 名字 隔离级别 脏读 不可重复读 幻读
1 读未提交 read uncommitted 不能 不能 不能
2 读已提交 read committed 不能 不能
3 可重复读 repeatable read 不能
4 串行化 serializable
  • 级别效果,执行效率越低

查看隔离级别

SELECT @@tx_isolation/select @@transaction_isolation;

设置隔离级别

SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别

select查询某条记录,不存在,准备插入此纪录;但执行insert时,发现此纪录已经存在了,无法插入

原文地址:https://www.jb51.cc/wenti/3288215.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐