MySql

##DDL :操作数据库、表

一.操作数据库: CRUD
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 数据库名称;
5.使用数据库
查询当前正在使用的数据库名称
       *select database();
二.操作表

1. C(Create):创建
1.语法:
create table 表(
列名1数据类型1,
列名2数据类型2,
列名n数据类型n
);
*注意:最后一列,不需要加逗号(,)

复制表:
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 列名 新数据类型;
5.删除列
4. D(Delete):删除
drop table表名;
* drop table if exists 表名;
 

## DML :增删改表中数据

1.添加数据:
*语法:
        insert into 表名(列名1,列名2....列名n) values(值1,值2....值n); 
*注意:
        1.列名和值要一一 对应。
2.如果表名后,不定义列名,则默认给所有列添加值
         insert into 表名values(值1,值2,...值n); 
3.除了数字类型,其他类型需要使用引号(单双都可以)引起来
2.删除数据:
*语法:
       delete from表名[where 条件]
*注意:
1.如果不加条件,则删除表中所有记录。
2.如果要删除所有记录
1. delete from表名;-
--不推荐使用。有多少条记录就会执行多少次删除操作
2. TRUNCATE TABLE名; -- 先删除表,然后再创建一张一样的表。
3.修改数据:
*语法:
         update 表名 set 列名1 =值1,列名2 =值2,...  [where 条件] ;
 

## DQL :查询表中的记录

1.语法:
select
    字段列表
from
    表名列表
where
    条件列表
group by
    分组字段
having
    分组之后的条件
order by
    排序
limit
    分页限定
 

2.基础查询
1.多个字段的查询
select 字段名1,字段名2... from 表名;
*注意:
如果查询所有字段,则可以使用*来替代字段列表。
2.去除重复:
distinct
3.计算列
*一般可以使用四则运算计算一些列的值。 (- 般只会进行数值型的计算)
*ifnull(表达式1,表达式2) : null参与的运算,计算结果都为null
*表达式1 :哪个字段需要判断是否为null
*如果该字段为nul1后的替换值。
4.起别名:
*as :Ias也可以省略


3.条件查询
1. where子句后跟条件
2.运算符
>、<、<=、>=、=、<>
BETWEEN. . . AND         在什么和什么之间
IN(集合)
LIKE :模糊查询

     *占位符
     _单个任意字符
     %:多个任意字符

IS NULL                          判断一个字段值是空
and 或&&
or或||
not或!

# DQL:查询语句

1.排序查询
*语法: order by子句
     *order by排序字段1 排序方式1,排序字段2 排序方式2...
*排序方式:
     *ASC :升序,默认的。
     *DESC :降序。
*注意:
     *如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。|
 

按照math(数学成绩)排序

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

运行效果:

SELECT COUNT (IFNULL (english,0)) FROM student;
SELECT COUNT (id) FROM student;
SELECT MAX (math) FROM student;


3.分组查询

1.语法: group by分组字段;
2.注意:
     1.分组之后查询的字段:分组字段、聚合函数
     2. where和having 的区别?
     1. where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
     2. where后不可以跟聚合函数,having可以进行聚合函数的判断。
 

 


4.分页查询

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

 

##表约束

*概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
    1.1主键约束: primary key

     1.注意:
            1.含义:非空且唯一
            2. 一张表只能有一个字段为主键
            3主键就是表中记录的唯一标识

自动增长


    2.非空约束: not null


    3.唯一约束: unique


    4.外键约束: foreign key

级联操作

##数据库的设计

1.多表之间的关系
 1.分类:
       1.一对一(了解) :
            *如:人和身份证
            *分析:一个人只有一个身份证,一个身份证只能对应一个人
        2. 一对多(多对一) :
            *如:部门和员工
            *分析:一个部门有多个员工,一个员工只能对应一个部门
        3.多对多:
            *如:学生和课程
            *分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择

2.实现关系:
       1.一对多(多对一) :
              *如:部门和员工
               实现方式:在多的一方建立外键,指向一的一方的主键。
       2.多对多:
               *如:学生和课程

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

       3.一对一:(了解)

               实现:对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
               

2.三大范式

分类:
     1.第一范式(1NF) :每一列都是不可分割的原子数据项
     2.第二范式(2NF) :在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
     3.第三范式(3NF) :在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

##数据库的备份和还原

命令行:
”语法:
     备份: mysqldump  -u用户名 -p密码 > 保存的路径
*还原:
     1.登录数据库
     2.创建数据库
     3.使用数据库
     4.执行文件。source 文件路径
 

##多表查询

*笛卡尔积:
     *有两个集合A,B . 取这两个集合的所有组成情况。
     *要完成多表查询,需要消除无用的数据
*多表查询的分类:
     1.内连接查询:
          (1)隐式内连接:使用where条件消除无用数据
 

 

用别名替换表明

                (2)显示内连接查询

语法: select 字段列表from表名1 inner join表名2 on条件     (inner可以省略不写)
 

 内连接查询注意事项:1.从哪些表中查询数据  2.条件是什么  3.查询些字段

2.外链接查询:
    (1)左外连接

语法: select字段列表from 表1 left outer join 表2 on条件          ( outer可以省略)

查询的是左表所有数据以及其交集部分。

查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称

select  t1*,t2  from  emp  t1  left  dept  t2  on   t1.`dept_id`=t2.`id` ;              (查询左表全部和右表交集部分)

     (2)右外连接:

语法: select字段列表from 表1 right outer join 表2 on条件          ( outer可以省略)

查询的是右表所有数据以及其交集部分。

                                                     右表 :t2                                         左表:t1                                                   (查询右表的全部数据和左表的交集数据)


3.子查询:查询嵌套查询

(1)子查询的结果是单行单列的:
*子查询可以作为条件,使用运算符去判断。运算符>  >=   <  <=
两部完成

子查询

(2)子查询的结果是多行单列的:
子查询可以作为条件,使用运算符in来判断

--查询'财务部'和'市场部'所有的员工信息
SELECT id FROM dept WHERE NAME = ' 财务部”OR NAME =” 市场部;
SELECT * FROM emp WHERE dept_ id = 3 OR dept_ id=2;
--子查询
SELECT * FROM emp WHERE dept id IN (SELECT id FROM dept WHERE NAME = ' 财务部' OR NAME =‘市场部 ' ) ;

(3)子查询的结果是多行多列的:子查询可以作为一张虚拟表。

##事务

1.事物的基本介绍

(1)概念:
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
  (2)操作:
     开启事务: start transaction; 
     回滚: rollback;
     提交: commit;

(3)MySQL数据库中事务默认自动提交
 *事务提交的两种方式:
     *自动提交:
            “mysql就是自动提交的
             *一条DML(增删改)语句会自动提交一 次事务。
      *手动提交:
             *需要先开启事务,再提交
*修改事务的默认提交方式:
        查看事务的默认提交方式: SELECT @@autocommit;     -- 1代表自动提交     0 代表手动提交
        修改默认提交方式: set @@autocommit = 0;

2.事务的四大特征

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

3.事务的隔离级别(了解)

概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同-批数据,则会引发一 些问题,设置不同的隔离级别就可以解决这些问题。
存在问题:
       1.脏读:一个事务,读取到另一个事务中没有提交的数据
       2.不可重复读(虚读) :在同一个事务中,两次读取到的数据不一样。
       3.幻读:一个事务操作(DML )数据表中所有记录,另-个事务添加了-条数据,则第一个事务查询不到自 己的修改。
*隔离级别:
       1. read uncommitted :读未提交
               *产生的问题:脏读、不可重复读、幻读
       2. read committed :读已提交(Oracle)
               *产生的问题:不可重复读、幻读
       3. repeatable read :可重复读(MySQL 默认)
               *产生的问题:幻读
       4. serializable :串行化
               *可以解决所有的问题
*注意:隔离级别从小到大安全性越来越高,但是效率越来越低
*数据库查询隔离级别:
       * select @@tx_ isolation;
*数据库设置隔离级别:
        * set global transaction isolation level 级别字符串;
 

## DCL:管理用户,授权

1.管理用户

       (1)添加用户:

       

       (2)删除用户

       

       (3)修改用户密码

        

       mysq1中忘记了root用户的密码?
      1. cmd -- > net stop mysql 停止mysq1服务
      *需要管理员运行该cmd
      2.使用无验证方式启动mysql服务: mysqld --skip- grant- tables
      3.打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
      4. use mysql;
      5. update user set password = password( '你的新密码') where user = ‘root';
      6.关闭两个窗口
      7.打开任务管理器,手动结束mysqld.exe的进程
      8.启动mysq1服务
      9,使用新密码登录。
 

        (4)查询用户

        1.切换到mysql数据库
        USE myql;
        2.查询user表
        SELECT * FROM USER;
        *通配符: %表示可以在任意主机使用用户登录数据库
 

2.权限管理:
    (1)查询权限:
           SHOW GRANTS FOR用户名'@'主机名' ;
           SHOW GRANTS FOR 'lisi'@'%';
      (2)授予权限:
            grant权限列表on数据库名.表名to '用户名'@'主机名';
      (3)撤销权限:
           --撤销权限:
           revoke权限列表on数据库名.表名from '用户名'@'主机名';
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值