目录
mysql服务的启动和停止
1.停止
* net stop mysql
2.启动
* net start mysql
启动失败可按快捷键 win+R,输入 services.msc,找到MySQL服务器的名称启动
登陆mysql
mysql (-h)-u 用户名 -p 用户密码
注意,如果是连接到另外的机器上,则需要加入一个参数-h机器IP
键入命令mysql -uroot -p, 回车后提示你输入密码,然后回车即可进入到mysql中了
增加新用户
grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"
例:增加一个用户user密码为password,让其可以在本机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:
grant select,insert,update,delete on . to user@localhost Identified by “password”;
如果希望该用户能够在任何机器上登陆mysql,则将localhost改为"%"。
DDL :操作数据库和表
操作数据库
1.C(Create):创建
*创建数据库:
* create database 数据库名称;
*创建数据库,判断不存在,再创建:
* create database if not exists 数据库名称;
*创建数据库,并指定字符集
* create database 数据库名称 character set 字符集名;
*练习: 创建db4数据库,判断是否存在,并制定字符集为gbk
* create database if not exists db4 character set gbk;
2.R(Retrieve): 查询
*查询所有数据库的名称:
* show databases;
*查询某个数据库的字符集:查询某个数据库的创建语句
* show create database 数据库名称;
3.U(Update):修改
*修改数据库的字符集
* alter database 数据库名称 character set 字符集名称;
4.D(Delete):删除
*删除数据库
* drop database 数据库名称;
*判断数据库存在,存在再删除
* drop database if exists 数据库名称;
*查询当前正在使用的数据库名称
* select database();
*使用数据库
* use 数据库
操作表
1.C(Create):创建
语法 :
create table 表名(
列名1 数据类型1 comment '注释',
列名2 数据类型2 comment '注释',
...
列名n 数据类型n comment '注释'
)comment '注释';
* 注意: 最后一列,不需要加逗号 (,)
* 数据库数据类型 :
1. int : 整数类型
* age int,
2. double:小数类型
* score double(5,2)
3. date:日期,只包含年月日,yyyy-MM-dd
4. datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
5. timestamp:时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm: ss
*如果将来不给这个字段赋值,或赋值为nu11,则默认使用当前的系统时间,来自动赋值
6. varchar :字符串
* name varchar(20):姓名最大20个字符
* zhangsan 8个字符 张三 2个字符
* 创建表
create table Student(
age int,
name varchar(32),
score double(4,1),
birthday date,
insert_time timestamp
);
* 复制表
* create table 表名 like 被复制的表的名;2.R(Retrieve):查询
* 查询某个数据库中所有的表名称
* show tables;
* 查询表结构
* desc 表名;
3.u(Update):修改
1.修改表名
alter table 表名 rename to 新的表名;
2.修改表的字符集
alter table 表名 character set 字符集名称;
3.添加一列
alter table 表名 add 列名 数据类型;
4.修改列名称 类型
alter table 表名 change 列名 新列名 新数据类型;
alter table 表名 modify 列名 新数据类型;
modify和change都可以
5.删除列
alter table 表名 drop 列名;
4.D(Delete):删除
* drop table 表名;
* drop table if exists 表名;
DML:增删改表中数据
1.添加数据
* 语法:
* insert into 表名(列名1,列名2,...列名n)values(值1,值2,...值n);
* 注意:
列名和值要一一对应,表名后不写括号,则针对全体赋值。
2.删除数据
* 语法:
* delete from 表名 where 条件;
* 注意:
1.如果不加条件,则删除表中所有记录
2.如果要删除所有记录
1.delete from 表名;-- 不推荐使用。有多少条记录就会执行多少次删除操作
2.TRUNCATE TABLE 表名;-- 推荐使用,效率更高 先删除表,然后再创建一张样的表。
3.修改数据
* 语法:
update 表名 set 列名1 = 值1,列名2 = 值2...where 条件];
* 注意 :
1.如果不加任何条件,则会将表中所有记录全部修改。
DQL:查询表中的记录
1.语法
select
字段列表
from
表名列表
where
条件列表 (条件查询)
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2.基础查询
1.多个字段的查询
select 字段名1,字段名2... from 表名;
* 注意 :
如果查询所有字段,则可以使用 * 来替代
2.字段列表去除重复 :(跟在select后面)
* distinct
3.计算列
* 一般可以使用四则运算计算一些列的值。 (一般只会进行数值型的计算)
* ifnul1(表达式1,表达式2): null参与的运算,计算结果都为nul1
* 表达式1: 哪个字段需要判断是否为nu11
* 表达式2:如果该字段为nu11后的替换值
4.起别名
as :as也可以省略 跟在字段后面
5.条件查询
1.where子句后跟条件
2.运算符
* > < <= >= = <> ( <>是不等于 也可以写成!=)
* BETWEEN...AND...
* IN( 集合)(or关系)
* LIKE(模糊查询)
* _ :单个任意字符
* % :多个任意字符
例如:查找姓名中含有'马'的数据 :LIKE '%马%'
* IS NULL (null是一个特殊的值,不能用 = 来判断)
* and 或 &&
* or 或!
* not 或 !
6.排序查询
* 语法 : order by 子句
* order by 排序字段1 排序方式1 ,排序字段2 排序方式2...
* 排序方式:
*ASC :升序,默认的。
*DESC:降序。
* 注意 :
* 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
7.聚合函数: 将一列数据作为一个整体,进行纵向的计算(select 聚合函数 from 表名)
1.count :计算个数
1.一般选择非空的列:主键
2. count(*)
2.max : 计算最大值
3.min: 计算最小值
4.sum : 计算和
5.avg: 计算平均值
* 注意: 聚合函数的计算,排除nul1值。解决方案:
1.选择不包含非空的列进行计算
2.IFNULL函数
8.分组查询:
1.语法 : group by 分组字段;
2.注意 :
1.分组之后查询的字段 : 分组字段、聚合函数
2.where 和 having 的区别 ?
1.where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2.where 后不可以跟聚合函数,having可以进行聚合函数的判断
9.分页查询:
* 语法:
* limit 开始的索引,每页查询的条数; 开始的索引=(当前的页码-1)* 每页显示的条数
* 注意:
* limit是MySQL的方言
10.多表查询
* 内连接查询
* 隐示内连接:select 字段列表 from 表名 where 条件
* 显示内连接:select 字段列表 from 表名1 [inner] join 表名2 on 条件
* 外连接查询
* 左外连接:select 字段列表 from 表1 left [outer] join 表2 on 条件
* 查询的是左表所有的数据和两个表的交集
* 右外连接:select 字段列表 from 表1 right [outer] join 表2 on 条件
* 查询的是右表所有的数据和两个表的交集
* 子查询:嵌套的查询语句
约束
* 分类:
1.主键约束:primary key
2.非空约束:not null
3.唯一约束:unique
4.外键约束:foreig key
*非空约束: not null,某一列的值不能为null
1.创建表时添加约束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);
2.创建表完后,添加非空约束
ALTER TABLE StU MODIFY NAME VARCHAR(20) NOT NULL;
3.删除name的非空约束
ALTER TABLE SU MODIFY NAME VARCHAR(20);
* 唯一约束 : unique,某一列的值不能重复
1.注意:唯一约束可以有NULL值,但是只能有一条记录为null
2.在创建表时,条件唯一约束
CREATE TABLE stu(id INT ,phone number VARCHAR(20) UNIOUE -- 手机号
3.删除唯一约束
ALTER TABLE stu DROP INDEX phone number;
4.在表创建完后,添加唯一约束
ALTER TABLE stu MODIFY phone number VARCHAR(20) UNIOUE;
* 主键约束:非空且唯一,一张表只能有一个字段是主键约束,是表中记录的唯一标识
1.创建表时添加约束
CREATE TABLE stu(
id INT primary key, --主键
NAME VARCHAR(20)
);
2.创建表完后,添加主键约束
ALTER TABLE StU MODIFY id INT primary key;
3.删除非主键约束
ALTER TABLE SU MODIFY drop primary key;
4.自动增长 一般与主键联用(比如说id这种数值类型)
1.创建表时添加约束
CREATE TABLE stu(
id INT primary key auto_increment, --自动增长
NAME VARCHAR(20)
);
2.删除自动增长
alter table stu modify id int;
3.添加自动增长
alter table stu modify id int auto_increment;
5.创建复合主键
primary key(字段1,字段2)
*外键约束: foreign key,让表于表产生关系,从而保证数据的正确性上
1.在创建表时,可以添加外键
* 语法 :
create table 表名(
...
外键列
constraint 外键名称 foreign key (外键列名称)references 主表名称(主表列名称)
);
2.删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
3.创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
4.1.添加级联操作
语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称
FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE
4.2.分类 :
级联更新:ON UPDATE CASCADE
级联删除: ON DELETE CASCADE
数据库设计
1.多表之间的关系
1.分类:
1.一对一(了解) :
* 如:人和身份证
* 分析 : 一个人只有一个身份证,一个身份证只能对应一个人
2.一对多(多对一):
* 如:部门和员工
* 分析 : 一个部门有多个员工,一个员工只能对应一个部门
3.多对多:
* 如:学生和课程
* 分析: 一个学生可以选择很多门课程,一个课程也可以被很多学生选择
2.实现关系:
1.一对多(多对一) :
* 如:部门和员工
* 实现方式:在多的一方建立外键,指向一的一方的主键
2 .多对多 :
* 如: 学生和课程
* 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第 三张表的外键,分别指向两张表的主键
2.数据库设计的范式
目前关系数据库有六种范式:第一范式 (1NF) 、第二范式 (2NF) 、第三范式(3NF)巴斯_科德范式(BCNF) 、第四范式(4NF) 和第五范式 (5NF又称完美范式)。
* 分类:
* 第一范式 (1NF) :每一列都是不可分割的原子数据项
* 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码 的部分函数依赖)
* 第三范式(3NF) :在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
* 几个概念 :
1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
2. 完全函数依赖 : A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
4. 传递函数依赖 :A-->B,B - 如通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一1
5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
6. 主属性: 码属性组中的所有属性
7. 非主属性: 除过码属性组的属性
数据库的备份与还原
* cmd命令行执行
* 备份
mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
* 还原
1. 登录数据库
2. 创建数据库
3. 使用数据库
4. 打开文件 source 文件路径
事务
1. 概念:
* 如果一个包含多个步骤的业务操作被事务管理,那么这些操作要么同时成功要么同时失败
2. 操作:
1. 开始事务:start transaction
2. 回滚:rollback
3. 提交事务:commit
3. mysql数据库中事务是默认提交的,Oracle数据库则是默认手动提交
1. 手动提交:先开启事务在提交
2. 自动提交:一条增删改(DML)语句就会自动提交一次
3. 查看事务的默认提交方式:select @@autocommit; -- 1:自动提交 0:手动提交
4. 修改事务的默认方式;set @@autocommit=0;
4. 事务的四大特征
1. 原子性
2. 持久性
3. 隔离性
4. 一致性
5.事务的隔离级别
* 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题.
* 存在问题 :
1. 脏读:一个事务,读取到另一个事务中没有提交的数据
2. 不可重复读(虚读): 在同一个事务中,两次读取到的数据不一样。
3. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
* 隔离级别:
1.read uncommitted: 读未提交
产生的问题:脏读、不可重复读、幻读
2.read committed :读已提交 (oracle默认)
产生的问题:不可重复读、幻读
3.repeatable read:可重复读 (MySoL默认)
产生的问题:幻读
4.serializable:串行化
可以解决所有的问题
* 注意: 隔离级别从小到大安全性越来越高,但是效率越来越低
* 数据库查询隔离级别·
* select @@tx isolation;
* 数据库设置隔离级别:
* set global transactin isplation level 级别字符串;