一看就懂的MySQL教程
作者:互联网
一看就懂的MySQL教程
一、安装
直接网上下载,看着提示安装就行,要是看不懂英文,手机版的有道词典是个好东西,可以拍照翻译!!!
二、卸载
1、去mysql的安装目录找到my.ini文件
复制datadir = “路径名”
2、卸载mysql
3、删除C:/programdata目录下的MySQL文件夹(如果找不到就是被隐藏了,点击所在窗口左上方的查看—>选项—>查看—>找到隐藏文件和文件夹设置为显示隐藏文件)
三、配置
1、MySQL服务启动
法一:手动
右键点击我的电脑—>管理—>服务和应用程序—>服务—>找到MySQL,右键点击启动。
法二:
打开cmd命令,输入services.msc打开服务的窗口
法三:使用管理员打开cmd
- net start mysql :启动mysql的服务
- net stop mysql :关闭mysql的服务
2、MySQL登录
法 1: mysql -u root -p 密码
法 2:mysql -hip -u root -p 连接目标的密码
法 3:mysql – host = ip – user = root – password = 连接目标的密码
3、MySQL 退出
法1:exit
法2:quit
四、SQL
1、什么是SQL
Structured Query Language :结构化查询语言
其实就是定义了操作所有关系型数据库的规则,每一种数据库操作的方式存在不一样的地方,称为“方言”。
2、SQL通用语法
1、SQL语句可以单行或多行书写,以分好结尾
2、可使用空格和缩进来增强语句的可读性
3、MySQL数据的SQL语句不区分大小写,关键字建议使用大写
4、3种注释
**** 单行注释:-- 注释内容
或# 注释内容
(mysql特有)
**** 多行注释:/*注释 */
举例:
3、SQL分类
1)DDL
(Data Definition Language)数据定义语言
- 用来定义数据库对象:数据库、表、列等。
- 关键字:create, drop,alter 等
2)DML
(Data Manipulation Language) 数据库操作语言
- 用来对数据库表的数据进行增、删、改
- 关键字:insert 、 dalect 、 update等
3)DQL
(Data Query Language)数据查询语言
- 用来查询数据库中表的记录(数据)。
- 关键字:select 、where等。
4)DCL
(Data Control Language)数据控制语言
- 用来定义数据库的访问权限和安全级别,及创建用户。
- 关键字:Grant、 revoke等。
五、DDL:操作数据库、表
1、操作数据库:CRUD
-
c(Create):创建
创建数据库:create databases 数据库名称;
**创建数据库,判断不存在,再创建:**
create database if not exists 数据库名称;
**创建数据库,并指定字符集:** create database 数据库名称 character set 字符集名; ==eg==:***创建db4数据库,判断是否存在,并制定字符集为gbk*** create database if not exists db1 character set gbk;
-
R(Retrieve):查询
查询所有数据库的名称:show databases;
查询某个数据库的字符集(查询某个数据库的创建语句):
show create database 数据库名称;
eg:
-
U(Update):修改
修改数据库的字符集:alter database 数据库名称 character set 字符集名称;
eg:
-
D(Delete):删除
删除数据库:drop database 数据库名称;
eg:
判断数据库存在,存在再删除(不会报错):drop database if exists 数据库;
eg:
-
使用数据库
查询当前正在使用的数据库名称:select database();
eg:
使用数据库,如果没有正在使用的数据库正在使用的会如上显示
有正在使用的数据库,会如上显示使用数据库:
use 数据库名称;
2、操作表
表举例:
-
C(Create):创建
1、语法:create table 表名( 列名1 数据类型1, 列名2 数据类型2, 。。。。 列名n 数据类型n );
注意:最后一列,不需要加逗号(,)
2、数据库类型(常用):
1、int:整数类型
age int
2、double : 小数类型
score double(5,2)[5是所有数字的总位数,2是小数的位数]
3、date:日期,包含年月日,yyyy-MM-dd HH:mm:ss
4、datetime:日期,包含年月日时分秒 yyyy- MM-dd HH:mm:ss
5、timestamp:时间错类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
如果将来不给这个字段赋值,或赋值null,则默认使用当前的系统时间,来自动赋值
6、varchar:字符串name varchar(20): -- 姓名最大20个字符 -- zhangsan 8个字符 /张三 2个字符
创建表:
create table student( id int, name varchar(32), age int, score double(4,1), birthday date, insert_time timestamp );
复制表:
create table 表名 like 被复制的表名;
eg:
-
R(Retrieve):查询
查询某个数据库中所有表名称:alter tables ;
查询表结构:
desc 表名;
eg:
-
U(Update):修改
1、修改表名:alter table 表名 rename to 新的表名;
eg:
2、修改表的字符集:
alter table 表名 character set 字符集名称;
eg:
3、添加一列:
alter table 表名 add 列名 数据类型;
eg:
4、修改列表名称 、类型:
alter table 表名 change 列名 新列名 新数据类型; alter table 表名 modify 列名 新数据类型;
eg:
5、删除列:
alter table 表名 drop 列表;
eg:
-
D(Delete):删除
法1.drop table 表名; 法2.drop table if exists 表名;
eg:
六、DQL:增删改表中的数据
1、添加数据
-
语法:
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
注意:
- 列名和值要一一对应。
- 如果表名后,不定义列名,则默认给所有列添值
insert into 表名 values(值1,值2,。。。值n);
- 除了数字类型,其他类型需要使用引号(单双都可以)引起来
eg:
2、删除数据
语法:
delete from 表名[ where 条件]
注意:
- 如果不加条件,则删除表中所有记录。
- 如果要删除所有记录
delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
truncate table 表名; -- 推荐使用,效率更高,先删除表,然后再创建一张一样的表。
eg:
3、修改数据
语法:
update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
eg:
注意:
如果不加任何条件,则会将表中所有记录全部修改。
eg:
七、DQL:查询语句
select * from 表名;
1、语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组后的条件
order by
排序
limit
分页限定
2、基础查询
-
多个字段查询:
select 字段1,字段2,...from 表名;
注意:
如果查询所有字段,则可以使用*来代替字段列表。 -
去除重复:
distinct
-
计算列:
1)一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
2)ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
***表达式1:哪个字段需要判断是否为null
***如果改字段为null后的替换值。 -
起别名:
as:as也可以省略
3、条件查询
- where字句后跟条件
- 运算符
-
<、>、<= 、>=、=、<>;
eg:
-
between…and;
-
in(集合);
-
like:模糊查询
占位符:
_:单个任意字符
%:多个任意字符 -
is null;
-
and 或 &&;
-
or 或 ||;
-
not 或 !
举例:
建表:create table student( id int, -- 编号 name varchar(20), -- 姓名 age int, -- 年龄 sex varchar(5), -- 性别 address varchar(100), -- 地址 math int, -- 数学 english int -- 英语 );
添加数据:
insert into student(id,name,age,sex,address,math,english) values( 1,"马云",55,"男","杭州",66,78),(2,"n马化腾",45,"男","深圳",98,87), (3,"马景涛",55,"男","香港",56,77),(4,"柳岩",20,"女","湖南",99,99), (5,"柳青",20,"男","湖南",86,null),(6,"刘德华",57,"男","香港",99,99), (7,"马德",22,"女","香港",99,99),(8,"德玛西亚",18,"男","广东",56,65);
查询举例:
-
4、排序查询
-
语法: order by 子句
order by 排序字段1 排序方式1,排序字段2 排序方式2,......
- 排序方式:
ASC:升序,默认的
DESC:降序
注意:
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
5、聚合函数
概念:将一列数据作为一个整体,进行纵向的计算。
-
count:计算个数
1、一般选择非空的列:主键
2、count(*) -
max:计算最大值
-
min:计算最小值
-
sum:计算和
-
avg:计算平均值
eg: select max(math) from student; select min(math) from student; select sum(math) from student;
注意:
聚合函数的计算,排除null值。
解决方案:
1. 选择不包含非空的列进行计算
2. ifnull函数
6、分组查询
语法:
group by 分组字段;
可以取别名,方便一点:
注意:
- 分组之后查询的字段:分组字段、聚合函数
- where 和having的区别?
1. where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足限定, 则不会被查询出来
2. where后不可以跟聚合函数,having可以进行聚合函数的判断。
7、分页查询
-
语法:
limit 开始的索引,每页查询的条数;
-
公式:
开始的索引 = (当前页码 - 1)* 每页显示的条数
eg:---- 每页显示3条记录 select * from student limit 0,3; -- 第一页 select * from student limit 3,3; -- 第二页 select * from student limit 6,3; -- 第三页 ```
-
limit 是一个MySQL的"方言"
八、表的约束
1、概念
对表的数据进行限定,保证数据的正确性、有效性和完整性。
2、分类
1.主键约束:primary key
-
注意:
- 含义:非空且唯一
- 一张表只能有一个字段为主键
- 主键就是表中记录的唯一标识
-
在创建表时,添加主键约束
create table stu( id int primary key, -- 给id添加主键约束 name varchar(20) );
-
删除主键
-- 错误 alter table stu modify id intl; alter table stu drop primary key;
-
创建完表后,添加主键
alter table stu modify id int primary key;
-
自动增长:
-
概念:如果某一列是数值类型的,使用auto_increment 可以来完成值的自动增长
-
在创建表时,添加主键约束,并且完成自动增长
eg:
create table stu( id int primary key auto_increment, -- 给id添加主键约束 name varchar(20) );
注意:
自动增长,给选定值填入null是,会自动根据前一个数据加一 -
删除自动增长
alter table stu modify id int;
-
添加自动增长
alter table stu modify id int auto_increment;
-
2.非空约束:not null
-
创建表时添加约束
create table stu( id int; name varchar(20) not null -- name为非空 );
-
创建完表后,添加非空约束
alter table stu modify varchar(20) not null;
-
删除name的非空约束
alter tble stu modify name varchar(20) ;
3.唯一约束: unique,值不能重复
-
创建表时,添加唯一约束
create table stu( id int, number varchar(20) unique --添加了唯一约束 );
注意:
mysql中,唯一约束限定的列的值可以有多个null。 -
删除唯一约束
alter table stu drop number;
-
在创建表后,添加唯一约束
alter table stu modify number varchar(20)unique;
4.外键约束:foreign key
功能:让表与表产生关系,从而保证数据的正确性。
-
在创建表时,可以添加外键
语法:create table 表名( ... 外键列 constraint 外键名称 foreign key (外键列名称)references 主表名称(主表列名称) );
-
删除外键
alter table 表名 drop foreign key 外键名称;
-
创建表之后,添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表名称(主列表名称);
-
级联操作
-
添加级联操作
语法:alter table 表名 add constraint 外键名称 foreign key (外键字段名称)references 主表名称(主列表名称)on update cascade / on delete cascade;
-
分类:
- 级联更新:on update cascade
- 级联删除:on delete cascade
-
九、多表操作
1、分类
1.一对一(了解)
- 如:人和身份证
- 分析:一个人只有一个身份,一个身份证只能对应一个人
- 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
eg:
2、一对多(多对一)
- 如:部门和员工
- 分析:一个部门有多个员工,一个员工只能对应一个部门
- 实现方式:在多的一方建立外键,指向一的方向的主键。
eg:
3、多对多
- 如:学生和课堂
- 分析:一个学生可以选择很多课程,一个课程也可以被很多学生选择
- 实现方式:多对多关系实现需要借助第三张中间表
eg:
案例:
具体操作:
1.
-- 创建旅游线路分类表tab_category
-- cid 旅游线路分类主键,自动增长
-- cname旅游线路分类名称非空,唯一,字符串100
create table tab_category(
cid int primary key auto_increment,
cname varchar(100) not null unique
);
-- 创建旅游路线表tab_route
/*
rid旅游线路主键,自动增长
rename旅游线路名称非空,唯一,字符串100
price价格
radate 上架时间,日期类型
cid外键,所属分类
*/
create table tab_route(
rid int primary key auto_increment,
rname varchar(100) not null unique,
price double,
cid int,
foreign key(cid) references tab_category(cid)
);
-- 创建用户表tab_user
/*
uid用户主键,自增长
username用户名长度100,唯一,非空
password密码长度30,非空
name真实姓名长度100
birthday生日
sex性别,定长字符串1
telephone手机号,字符串11
email邮箱,字符串长度100
*/
create table tab_user(
uid int primary key auto_increment,
username varchar(100) unique not null,
password varchar(30) not null,
name varchar(100),
birthday date,
sex char(1) default"男",
telephone varchar(11),
email varchar(100)
);
-- 创建收藏表tab_favorite
/*
rid旅游路线id,外键
date收藏时间
uid用户id,外键
rid和uid不能重复,设置复合主键,同一个用户不能收藏同一个线路两次
*/
create table tab_favorite(
rid int,
date datetime,
uid int,
-- 创建复合主键
primary key(rid,uid),
forenign key (rid) references tab_route(rid),
forenign key (uid) references tab_route(uid)
);
各表创建完后拖到架构设计器中,可以看到对应关系:
十、三大范式
1、数据库设计的范式
概念
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
其实简单一点就是建立各种外键或者拆分表,让所有数据唯一
分类:
-
第一范式(1NF):每一列都是不可分割的原子数据项
-
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
几个概念:- 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B的属性值,则称B依赖A
例如:学号–>姓名(姓名依赖于学号)。 (学号,课程名称)–>分数 - 完全函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖A属性中所有的属性值。
例如:(学号,课程名称)–>分数 - 部分函数依赖:A–>B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称)–> 姓名 - 传递函数依赖:A–>B,B–>C. 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A
例如:学号–>系名,系名–>系主任 - 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码。
例如:该表的码为:(学号,课程名称)
1、主属性:码属性组中的所有属性
2、非主属性:除过码属性组的属性
- 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B的属性值,则称B依赖A
-
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
第二范式能解决图中(即第一范式存在的)第一条问题
第三范式能解决第二和第三条问题
十一、数据库的备份和还原
- 命令行:
语法:
备份(在dos命令里输入):mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
还原:
1. 登录数据库
2. 创建数据库
3. 使用数据库
4. 执行文件:source 文件路径
十二、多表查询
1.查询语法
select
列名列表
from
表名列表
where......
准备SQL:
2.笛卡尔积
- 有两个集合A、B,取这两个集合的所有组成情况。
- 要完成多表查询,需要消除无用的数据
3.多表查询的分类
-
内连接查询:
1. 隐式内连接:使用where条件消除无用数据
例子:-- 查询所有员工信息和对应的部门信息 select * from emp,dept where emp."dept_id" = dept."id"; -- 查询员工表的名称,性别。部门表的名称 select emp.name,emp.gender,dept.name from emp,dept where emp."dept_id" = dept."id"; select t1.name, -- 员工表的姓名 t1.gender, -- 员工表的性别 t2.name -- 部门表的名称 from emp t1, dept t2 where t1."dept_id" = t2."id";
-
显示内连接:
语法:select 字段列表 from 表名1 [inner] join 表名2 on 条件
例如:
select * from emp inner join dept on emp."dept_id" = dept."id"; select * from emp join dept on emp."dept_id" = dept."id";
-
内连接查询(注意事项):
1、 从那些表中查询数据
2、条件是什么
3、查询那些字段
-
4.外连接查询
-
左外连接:
语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;
查询的是左表所有数据以及其交集部分
例子:-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 select t1.*t2."name" from emp t1 left join dept t2 on t1."dept_id" = t2."id";
-
右外连接:
语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
查询的是右表所有数据以及其交集部分
例子:select t1.*t2."name" from dept t1 right join emp t1 on t1."dept_id" = t2."id";
十三、子查询
1.概念:
查询中嵌套查询,称嵌套查询为子查询。
```sql
-- 查询工资最高的员工信息
-- 1.查询最高的工资是多少 9000
select max(salary) from emp;
-- 2.查询员工信息,并且工资等于9000的;
select * from emp where emp."salary" = 9000;
-- 一条SQL就完成这个操作:子查询
select * from emp where emp."salary" = (select max(salary) from emp);
```
2. 子查询不同情况
-
子查询的结果是单行单列的:
子查询可以作为条件,使用运算符去判断。 运算符:> >= < <= =
例子:```sql -- 查询员工工资小于平均工资的人 select * from emp where emp.salary < (select avg(salary) from emp); ```
-
子查询的结果是多行单列的:
子查询可以作为条件,使用运算符in去判断。-- 查询“财务部”和“市场部”所有的员工信息 select id from dept where name = "财务部" or name = "市场部"; select * from emp where dept_id = 3 or dept_id = 2; ``` 用子查询: ```sql select * from emp where dept_id in (select id from dept where name = "财务部" or name = "市场部"); ```
-
子查询的结果是多行多列的:
子查询可以作为一张虚拟表参与查询-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息 --子查询 select * from dept t1,(select * from emp where emp."join_date" > "2011-11-11") t2 where t1.id = t2.dept_id; -- 普通内连接 select * FROM emp t1,dept t2 where t1."dept_id" = t2."id" and t1."join_date" > 2011-11-11;
十四、事务
事务举例:
1.概念
如果一个包含步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
2.操作
- 开启事务:start transaction;
- 回滚:rollback;
- 提交:commit;
3.例子
添加数据:
4.MySQl数据库中事务默认自动提交
- 事务提交的两种方式:
- 自动提交
*mysql就是自动提交的
*一条DML(增删改)语句会自动提交一次事务。 - 手动提交:
*Oracle数据默认是手动提交事务
*需要先开启事务,再提交
- 自动提交
- 修改事务的默认提交方式:
-
查看事务的默认提交方式:
select @@autocommit; -- 1 代表自动提交 0代表手动提交
-
修改默认提交方式:
set @@autocommit = 0;
-
5.事务的四大特征
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
- 持久性:当事务提交或回滚后,数据库会持久化保存数据
- 隔离性:多个事务之间,相互独立
- 一致性:事务操作前后,数据总量不变
6.事务的隔离级别(了解)
-
概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
-
存在问题:
1. 脏读:一个事务,读取到另一个事务中没有提交的数据
2. 不可重复读(虚读):在同一个事务中,两次读取到的事务不一样
3. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。 -
隔离级别:
- read uncommitted:读未提交
产生问题:脏读、不可重复读、幻读 - read committed:读已提交(Oracle)
产生问题:不可重复读、幻读 - repeatable read:可重复读(MySQL默认)
产生问题:幻读 - serializable:串行化
可以解决所有问题
注意: 隔离级别从小到大安全级别越来越高,但是效率越来越低
数据库查询隔离级别:
select @@tx_isolation;
数据库设置隔离级别:
set globlal transaction isolation level 你别字符串;
设置隔离级别eg:
查看隔离级别:
- read uncommitted:读未提交
隔离案例:
第一个窗口表示张三,执行转账操作后并没有提交事务
第二个窗口代表李四,在张三没有提交事务的情况下查询到已经转账,然后写了欠条,具备法律效应了
但是,张三一回滚
李四第二次查账的时候发现钱没过来
但是这时候李四已经写下了具有法律效应的欠条,所以在没收到张三钱的情况下反倒欠张三500块
这就是脏读
上面的是第一隔离级别
——————————————————————————————
我们重新设置第二个隔离级别
这回在张三没提交之前,李四查询不到钱到账
只有当张三提交之后,李四才查询到修改的数据
——————————————————————————————
设置为第三隔离级别,同时开启事务
李四查询不到转账记录
当张三提交事务后李四还是查询不到记录
只有当李四也提交之后才能查询到记录
这样就解决了不可重复读的问题
——————————————————————————————
设置为第四个隔离级别
在张三还没提交时,李四不可以查询记录,光标一直在闪
只要张三一提交,李四立马就会显示查询结果
十五、用户管理和权限管理
1.管理用户
-
添加用户
语法:create user “用户名” @“主机名” identified by “密码”;
-
删除用户:
语法:drop user “用户名” @“主机名”;
-
修改用户密码:
update user password = password("新密码") where user = "用户名"; update user password = password("abc") where user = "lisi";
set password for "用户名"@"主机名" = password("新密码"); set password for "root"@"localhost" = password("123");
mysql中忘记了root密码怎么办?
1. cmd --> net stop mysql 停止mysql服务
需要管理员打开该cmd
2. 使用无验证方式启动mysql服务:mysql – skip - grant - tables
3. 打开新的·cmd窗口,直接输入mysql命令,敲回车。就可以登陆成功
4. use mysql;
5. update user set password = password(“你的新密码”) where user = “root”;
6. 关闭两个窗口
7. 打开任务管理器,手动结束mysql.exe的进程
8. 启动mysql服务
9. 使用新密码登录 -
查询用户:
-- 1. 切换到mysql数据库 user mysql; -- 2.查询user表 select * from user;
通配符:% 表示可以在任意主机使用用户登录数据库
2.权限管理
-
查询权限
show grants for "用户名"@"主机名"; show grants for "lisi"@"%";
-
授予权限
grant 权限列表 on 数据库名.表名 to "主机名"; -- 给张三用户授予所有权限,在任意数据库任意表上 grant all on *.* to "zhangsan"@"localhost";
-
撤销权限
revoke 权限列表 on 数据库名.表名 from "用户名"@"主机名"; revoke update on db3."account" from "lisi"@"%"
关于mysql就分享到这里,请继续关注小编哦~~
标签:教程,一看,数据库,表名,查询,MySQL,table,id,select 来源: https://blog.csdn.net/weixin_45641191/article/details/105771088