MySQL学习

MySQL学习

#MySQL数据库软件

  1. 安装

安装包地址: https://dev.mysql.com/downloads/mysql/5.7.html#downloads

安装教程:https://www.cnblogs.com/beyondChan/p/11757113.html

  1. 卸载
    1. 去MySQL的安装目录下找到my.ini文件

*复制 datadir=”C:/progamData/MySQL/MySQL Server 5.5/Data/”

b.  控制面板下卸载MySQL

c.  删除C:/progamData目录下MySQL文件

  1. 配置

*MySQL服务启动

a.     手动

b.     cmd->services.msc 打开MySQL的服务

c.      使用管理员身份打开cmd

        *net start mysql :启动MySQL服务

        *net stop mysql :关闭MySQL服务

*MySQL登入

        a. mysql -uroot -p密码

        b. mysql -hip -uroot -p连接目标的密码

Mysql -h 10.142.9.132 -uroot -p

 

 

        c. mysql –-host=ip  --user=root –password=连接目标的密码

*MySQL退出

        a.exit

        b.quit

 

##DDL:操作数据库、表

  1. 操作数据库:CRUD

a)       C(Create):创建

*创建数据库:

       *create database 数据库名称;

*创建数据库,判断不存在,再创建:
       *create database if not exists 数据库名称:

*创建数据库,并指定字符集:
       *create database 数据库名称 character set 字符集名称;

*练习:创建db4数据库,判断是否存在,并指定字符集为gbk:

       *create database if not exists db4 character set gbk;

b)       R(Retrieve):查询

*查询所有数据库的名称:

       *show databases;

*查询某个数据库的字符集:查询某个数据库的创建语句

       *show create database 数据库名称;

c)        U(Updata):修改

*修改数据库名称:

# 1.导出旧库

# mysqldump -u 用户名 -p"密码" -R 旧库名称 > xxx.sql

# 2.创建新库

# mysqladmin -u 用户名 -p"密码" create 新库名称

# 3.导入数据到新库

# mysql -u 用户名 -p"密码" 新库名称 < xxx.sql

*修改数据库的字符集:

       *alter database 数据库名称 character set 字符集名称;

d)       D(Delete):删除

*删除数据库:

       *drop database 数据库名称;

*判断数据库存在,存在再删除:

       *drop database if exists 数据库名称;

e)       使用数据库

*查询当前正在使用的数据库名称:

       *select database();

*使用数据库:

       *use 数据库名称;

2.    操作表

a)  C(Create):创建

       1.语法:

              Create table 表名(

                     列名1 数据类型1,

                     列名2 数据类型2,

                     …

                     列名n 数据类型n

              );

              *注意:最后一列,不要需要加逗号’,’

              *数据类型:

                     1.int :整型类型

                            *age int,

                     2.double:小数类型

                            *score double(5,2)  //最大值为999.99,保留两位小数,共五位数

                     3.date:日期,只包括年月日,yyyy-mm-dd

                     4.datetime:日期,包括年月日时分秒,yyyy-mm-dd HH:MM:SS

                     5.timestamp:时间戳类型,包括年月日时分秒,yyyy-mm-dd HH:MM:SS

*如果不给这个字段赋值或赋值为null,则默认使用当前的系统时间自动赋值

                            6.varchar:字符串类型(单引号、双引号均可)(中文算一个字符)

                                   *name varchar(20)  //最大允许20个字符

                     *创建表

                            Create table student(

                                   Id int,

                                   Name varchar(32),

                                   Sorce double(3,1),

                                   Age int,

                                   Birthday date,

                                   Insert_time timestamp

);

b)     R(Retrieve):查询

*查询某个数据库中的所有表名称:

        *show tables;

*查询表结构:

        *desc 表名

c)      U(Updata):修改

  1. 修改表名:

alter table 表名 rename to 新的表名;

  1. 修改表的字符集:

alter table 表名 character set 字符集名称;

  1. 添加一列:

alter table 表名 add 列名 数据类型;

  1. 修改列名称 类型:

alter table 表名 change 列名 新列名 新数据类型;

alter table 表名 modify 列名 新数据类型;

  1. 删除列:

alter table 表名 drop 列名;

d)     D(Delete):删除

*drop table 表名;

*drop table if exists 表名;

 

##DML:增删改表中的数据

  1. 添加数据:

*语法:

        *insert into 表名(列名1,列名2,…,列名n) values(值1,值2,…,值3);

*注意

        1.列名和值要一一对应

        2.如果表名后,补定义列名,则默认给所有列添加值

               *insert into 表名 values(值1,值2,…,值3);

        3.除了数字类型,其他类型需要用引号(单双均可)引起来

  1. 删除数据:

*语法:

        *delete from 表名 [where 条件]

*注意:

        1.如果不加条件,则删除表中所有记录

        2.如果要删除所有记录,

               *delete from 表名 ;-- 不推荐,一条一条的删

               *truncate table 表名;-- 推荐,效率高,删除后重新建一个一样的表

  1. 修改数据:

*语法:

        *updata 表名 set 列名1=值1,列名2=值2,…,[where 条件];

*注意:

        1.如果不加条件,则默认修改表中所有记录

##DQL:查询表中的记录

*select * from 表名;

1.语法:

       Select

              字段列表

       From

              表名列表

       Where

              条件列表

       Group by

              分组字段

       Having

              分组之后的操作

       Order by

              排序

       Limit

              分页限定

 

  1. 基础查询:

a)       多个字段的查询:
select 字段名1,字段名2,… from 表名;

*注意:

       *如果查询所有字段,则可以用*来代替字段列表

b)       去除重复:

*distinct:select distinct name from user

c)        计算列:
*一般可以使用四则运算计算一些列的值。(一般只会进行数值的计算)

*ifnull(表达式1,表达式2):如果null参与运算,结果均为null

       *表达式1:哪个字段需要判断是否为null

       *表达式2:如果该字段为null后的替换值

d)       起别名:

*as:as也可以省略

 

  1. 条件查询:

a)       Where字句后跟条件

b)       运算符
* >  <    <=  >=  =  <>

*between … and…

*in(集合)

*like:模糊查询

       * _:单个任意字符

       * %:多个任意字符

*is null

*and 或&&

*or 或||

*not 或!

 

  1. 排序查询:
    *语法:order by 子句

*order by 排序字段1 排序方式1,排序字段2 排序方式2,…

*排序方式:

       *ASC:升序,默认

       *DESC:降序

*注意:

       *如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件

  1. 聚合函数:将一列数据作为一个整体,进行纵向的计算
    1. count:计算个数(值为null时,count不增加)
    2. max:计算最大值
    3. min:计算最小值
    4. sum:计算和
    5. avg:计算平均值

 

*注意:聚合函数的计算,排除null值

         解决方案:

  1. 选择不包含null的列进行计算
  2. IFNULL函数
  3. 分组查询:

1. 语法:

        Group by 分组字段;

2. 注意:

        1.分组之后查询的字段:分组字段,聚合函数

        2.where和having的区别?

1.where在分组之前进行限定,如过不满足条件,不参与分组。having在分组之后进行限定,如果不满足条件,则不会被查询出来

               2.where后不能跟聚合函数,having可以进行聚合函数的判断

  1. 分页查询:
    1. 语法:limit 开始的索引,每页查询的条数;
    2. 公式:开始的索引=(当前的页码-1)*每页显示的条数

*select * from student limit 0,3; -- 第一页<每页三条记录,不足有多少显示多少>

3.分页操作在不同数据库系统中语法不一样

 

#约束

       概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。

       分类:

  1. 主键约束:primary key
  2. 非空约束:not null
  3. 唯一约束:unique
  4. 外键约束:foreign key

 

#主键约束:primary key

  1. 注意:

*含义:非空且唯一

       *一张表中只能由一个字段为主键

       *主键就是表中记录的唯一标识

       *联合主键 primary key(列名1,列名2,…)     

  1. 创建表时添加约束

Create stu(

        Id int primary key, -- 给id添加主键约束

        Name varchar(20)

);

  1. 创建表完成后,添加主键约束

Alter table stu modify Id int primary key;

  1. 删除Id的主键约束

Alter table stu drop primary key;

  1. 自动增长:

a)       概念:如果某一列时数值类型的,使用auto_increment可以来完成值的自动增长

b)       在创建表时,添加主键约束,并且完成主键自动增长

Create stu(

       Id int primary key auto_increment,

       Name varchar(20)

);

c)        删除自动增长

Alter table stu modify id int; -- 主键约束删除不掉

d)       添加自动增长

Alter table stu modify id int auto_increment;

 

#非空约束:not null

  1. 创建表时添加约束

Create table stu(

        Id int,

        Name varchar(20) not null  -- name为非空

);

  1. 创建表完成后,添加非空约束

Alter table stu modify name varchar(20) not null;

  1. 删除name的非空约束

Alter table stu modify name varchar(20) ;

 

#唯一约束:unique,某一列的值不能重复

  1. 创建表时添加约束

Create table stu(

              Id int,

              Phone_number varchar(20) unique  -- 手机号

);

  1. 创建表完成后,添加唯一约束

Alter table stu modify Phone_number varchar(20) unique;

  1. 删除Phone_number的唯一约束

Alter table stu drop index Phone_number varchar(20);

  1. 注意:

*唯一约束可以有null值,但是只能有一条记录为null

 

#外键约束:foreign key 让表与表产生关系,从而保证数据的正确性

  1. 创建表时添加外键约束

*语法:

        Create table 表名(

               …

               外键列

Constraint 外键名称 foreign key (外键列名称)references 主表名称(主表列名称)

--外键名称自己取

        );

  1. 创建表完成后,添加外键约束

Alter table 表名 add constraint 外键名称 foreign key (外键列名称)references 主表名称(主表列名称)

  1. 删除name的非空约束

Alter table 表名 drop foreign key 外键名称; -- 外键名称为创建时取的

  1. 级联操作
    1. 添加级联操作

语法:alter table 表名 add constraint 外键名称foreign key (外键列名称)references 主表名称(主表列名称)on update cascade on delete cascade;

  1. 分类
    1. 级联更新:on update cascade
    2. 级联删除:on delete cascade

##DCL:管理用户、授权

  1. 管理用户
    1. 添加用户:

*语法:create user ‘用户名’@’主机名’ identified by ‘密码’;

  1. 删除用户

*语法:drop user ‘用户名’@’主机名’;

  1. 修改用户密码

*语法:1.set password for ‘用户名’@‘主机名’=password(‘新密码’);

                       2.update user set password = password(‘新密码’) where user = ‘用户名’;

          *注意:设置密码必须经过加密之后存储,可使用password()这个函数

          *mysql中忘记root用户的密码?

              1.cmdànet stop mysql 停止mysql服务

                     *需要用管理员身份运行

              2.使用无验证方式自动启动mysql服务:mysql --skip-grant-tables

              3.打开新的cmd窗口,直接输入mysql命令,就可以登入成功

              4.use mysqlàupdate user set password = password(“新密码”) where user =’root’;

              5.关闭两个窗口

              6.打开任务管理器,手动结束mysql.exe进程

              7.启动mysql服务

  1. 查询用户

--1.切换到mysql数据库

         Use mysql;

   --2.查询user类

               Select * from user;

        *通配符:% 表示可以在任意主机上使用用户登入数据库

  1. 授权
    1. 查询权限

*show grants for ‘用户名’@‘主机名’;

  1. 授予权限

*grant 权限列表 on 数据库.表名 to ‘用户名’@‘主机名’;

*注意:可以all代表所有权限,代表所有数据库所有表

  1. 撤销权限

Revoke 权限列表 on 数据库.表名 from ‘用户名’@‘主机名’;

 

 

##数据库设计

1.分类:

1. 一对多(多对一)

*如:部门和员工

*实现方式:在多的一方建立外键,指向一的一方的主键

2. 多对多

*如:学生和课程

*实现方式:多对多关系实现需要借助第三张中间表,中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键

*注意:primary key(主键1,主键2); -- 联合主键

3. 一对一

*如:人和身份证

*实现方式:在任意一方添加唯一外键指向另一方的主键(将设置的外键名添加unique限制)

 

参考文档:https://www.cnblogs.com/sienbo/p/11397214.html

 

2.范式:

*概念:设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

*第一范式(1NF):

        每一列都是不可分割的原子数据项

*第二范式(2NF):

        在1NF的基础上,非码属性必须完全依赖于码(在1NF的基础上消除非主属性对主码的部分函数依赖

        *几个概念

              1.函数依赖:AàB,如果通过A属性(属性组)的值,可以唯一确定B的值,则称                 B依赖于A

                     *例如:学号à姓名

              2.完全函数依赖:AàB,如果A是一个属性组,则B属性值需要依赖A属性组中所有的属性值

                     *例如:(学号,课程名称)à分数

              3.部分依赖:AàB,如果A是一个属性组,则B属性值需要依赖A属性组中某一些属性值

                     *例如:(学号,课程名称)à姓名

              4.传递函数依赖:AàB,BàC,如果通过A属性(属性组)的值可以唯一确定B的值,再通过B属性(属性组)的值可以唯一确定C的值,则C传递函数依赖于A

                     *例如:学号à系名,系名à系主任

              5.码:如果再一张表中,一个属性或属性组,被其他所有属性所完全依赖,则这个属性(属性组)为该表的码

                     *例如:(学号,课程名称)

              6.主属性:码属性组中的所有属性

                非主属性:除开码中的属性的属性

*第三范式(3NF):

        在2NF的基础上,任何非主属性不依赖于其他非主属性(在2NF基础上消除传递函数依赖)

 

 

##数据库的备份和还原

  1. 命令行:

*语法:

        *备份:mysqldump -u用户名 -p密码 数据库名称 > 保存路径

        *还原:

               1.登入数据库

               2.创建新数据库

               3.使用数据库

               4.source 文件路径

  1. 图形化工具

 

##多表查询

*语法:

       Select * from 表1,表2; -- 会出现笛卡尔积结果

  1. 内连接查询

1.隐式内连接:使用where条件消除无用数据

2.显式内连接:

        *语法:select 字段列表 from 表名1 【inner】 join 表名2 on 条件;

  1. 外连接查询
    1. 左外连接:

*语法:select 字段列表 from 表名1 【left】 join 表名2 on 条件;

*查询的是左表的全部以及其与右表交集的部分

  1. 右外连接:

*语法:select 字段列表 from 表名1 【right】 join 表名2 on 条件;

*查询的是右表的全部以及其与左表交集的部分

  1. 子查询

*概念:查询中嵌套查询,称嵌套查询为子查询

即将先一步查询出来的结果作为下一次查询的条件

  1. 子查询的结果是单行单列的:

*结果作为条件,使用运算符去判断:> >= < <= =

-- 查询员工工资小于平均工资的人

Select * from emp where emp.salary < (select AVG(salary) from emp);

  1. 子查询的结果是多行单列的:

*结果作为条件,使用in去判断

-- 查询“财务部‘和’市场部‘所有员工的信息

Select * from emp where dept_id in(select id from where name =’财务部’ or ‘市场部’);

  1. 子查询的结果是多行多列(表)的:

*子查询可以作为一张虚拟表

-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息

Select * from detp t1,(select * from emp where emp.’join_date’ > ‘2011-11-11’) t2 where t1.id = t2.dept_id;

 

 

 

##事务

  1. 事务的基本介绍

1.概念:

*如果一个包含多个步骤的业务操作,被事物管理,那么这些操作要么同时成功,要么同时失败

       2.操作:

              1.开启事务:start transaction;

              2.回滚:rollback;(发现问题,回滚到事务之前)

              3.提交:commit;(操作成功,提交事务,数据永久保存)

       *注意:

              *mysql默认自动提交事务,一条DML(增删改)语句就会提交一次事务

              *Oracle默认手动提交事务,需要先开启事务,再提交

              *修改事务的默认提交方式:

*查看事务的默认提交方式:select @@autocommit; --1 代表自动提交 0 代表手动提交

*修改默认提交方式:set @@antocommit = 0;

  1. 2.      事务的四大特征
    1. 1.      原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
    2. 2.      持久性:当事务提交或回滚后,数据库会持久化的保存数据
    3. 3.      隔离性:多个事务之间,相互独立
    4. 4.      一致性:事务操作后,数据总量不变
  2. 事务的隔离级别(了解)

*概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别可以解决这些问题

*存在问题:

        1.脏读:一个事务,读取到另一个事务中没有提交的数据

        2.不可重复读(虚读):在同一个事务中,两次读取到的数据不一致

       3.幻读:一个事务操作DML数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询到有一条数据没有被修改

*隔离级别:

       1.read uncommitted:读未提交

              *产生问题:脏读、不可重复读、幻读

       2.read committed:读已提交(Oracle默认)

              *产生问题:不可重复读、幻读

       3.repeatable read:可重复读(MySQL默认)

              *产生问题:幻读

       4.serializable:串行化

              *可以解决所有问题

       *注意:隔离级别从小到大安全性越来越高,但效率越来越低

       *数据库查询隔离级别:

              *select @@tx_isoation

       *数据库设置隔离级别:

              *set global transaction isolation level 级别字符串;

参考文档:https://www.cnblogs.com/cdlyy/p/11067658.html

posted @ 2019-11-24 12:09  叶あ梓  阅读(139)  评论(0)    收藏  举报