MysqL知识总结
一、什么是数据库
●用来存储和管理数据的仓库
本质就是一个文件系统,还是以文件的形式,将数据保存在电脑硬盘上。
●为什么要使用数据库?
-
开发中常用的数据库:
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 表名;
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
七、约束
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;
-
主键自增
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,'男')
八、事务
事务概述
- 什么是事务
- 是由一条或者多条sql语句组成
- 要么全部成功,要么全部失败(执行回滚)
- 是由一条或者多条sql语句组成
- 回滚(从哪来的回哪去)
- 在事务运行的过程中发生了某个故障,事务便不再继续执行下去,系统对事物中数据所有已完成的
操作全部撤销,滚回到开始时的状态
- 在事务运行的过程中发生了某个故障,事务便不再继续执行下去,系统对事物中数据所有已完成的
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时,发现此纪录已经存在了,无法插入