首页 > 数据库 >MySQL基础篇

MySQL基础篇

时间:2022-11-07 19:49:04浏览次数:52  
标签:事务 数据库 MySQL 基础 查询 字段 表名 SELECT

一.MySQL概述

(一).什么是数据库?

数据库就是存储数据的仓库,简称DB(database);SQL是操作数据库的编程语言,是一套标准,通过编写SQL语句来操作数据库;

(二).关系型数据库是将数据保存在不同的数据表中,而且表与表之间还可以有关联;

二.SQL操作(DDL,DML,DQL,DCL)

(一)SQL通用语法

1.SQL语句可以单行或多行书写,以分号结尾;

2.MySQL数据库的SQL不区分大小写;

3.注释:

   单行注释 -- 注释内容  或# 注释内容;

   多行注释  /*注释内容*/

(二)DDL(Data Definition Language):数据定义语言,用来定义数据库对象(数据库,表,字段)

数据库操作:

1.查询所有的数据库: SHOW DATABASES;

2.查询当前数据库:SELECT DATABASE();

3.创建数据库:CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];

4.删除数据库:DROP DATABASE [IF EXISTS] 数据库名:

5.使用指定的数据库:USE 数据库名;

表操作-查询

6.查询当前数据库所有表: SHOW TABLES;

7.查询表结构: DESC 表名;

8.查询指定表的建表语句: SHOW CREATE TABLE 表名;

 9.创建表:   CREATE TABLE 表名(

                   字段1  字段类型 [COMMENT 字段1注释],

                   字段2   字段类型 [COMMENT 字段2注释],

                    .... 

                   字段n   字段类型 [COMMENT 字段n注释]

)[COMMENT 表注释];

10.数据类型介绍

MySQL中的数据类型主要分为三类:数值类型,字符串类型,日期类型;

数值类型:

字符串类型:

日期类型:

修改表

11.添加字段:ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];

12.修改字段数据类型:ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);

13.修改字段名和数据类型:ALTER TABLE  表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];

14.删除字段:ALTER TABLE 表名 DROP 字段名;

15.修改表名:ALTER TABLE 表名 RENAME TO 新表名;

16.删除表:DROP TABLE [IF EXISTS] 表名;   

17.删除指定表,并重新创建该表: TRUNCATE TABLE 表名;

(三)DML(Data Manipulation Language):数据库操作语言,用来对数据库表中的数据进行增删改

新增:

1.给指定字段添加数据: INSERT INTO 表名(字段1,字段2...) VALUES(值1,值2);

2.给全部字段添加数据: INSERT INTO 表名 VALUES(值1,值2..);

3.批量添加数据: INSERT INTO 表名(字段2,字段2..) VALUES(值1,值2..),(值1,值2..),(值1,值2..);

4.修改

UPDATA 表名 SET 字段名1=值1,字段名2=值2,... WHERE 条件;

5.删除

DELETE FROM 表名 WHERE 条件;例如  DELETE FROM tb_user WHERE id=1;

(四DQL(Data Query Language):数据库查询语言,用来查询数据库中表的记录

SQL语句的执行顺序

1.FROM    2.WHERE  3.GROUP BY  4.HAVING  5.SELECT  6.ORDER BY   7.LIMIT

编写语法:  SELECT

                      字段列表

            FROM

                      表名列表

            WHERE

                      条件列表

            GROUP BY

                      分组字段列表

            HAVING

                      分组后条件列表

            ORDER BY

                      排序字段列表

             LIMIT 

                      分页参数;

1.基本查询

SELECT * FROM 表名;返回所有字段

SELECT 字段1,字段2 FROM 表名;返回指定字段

起别名  SELECT 字段1 [AS 别名].. FROM 表名;  返回指定字段并且给指定字段起别名;

去重  SELECT DISTINCT 字段名 FROM 表名;对指定字段去重;

2.条件查询

SELECT 字段列表 FROM 表名 WHERE 条件列表;

条件可包含一些运算符:

3.聚合查询: 讲一列数据作为一个整体进行纵向计算;

COUNT汇总,MAX最大值,MIN最小值,AVG平均值,SUM求和;

SELECT 聚合函数(字段列表) FROM 表名;

例: SELECT AVG(age) FROM  tb_user; 统计此张表的平均年龄; 

4.分组查询

SELECT  字段列表  FROM  表名  WHERE 条件  GROUP BY  分组字段名  [HAVING 分组后的过滤条件];

WHERE和HAVING之间的区别:

  执行时机:WHERE是分组之前进行过滤的,不满足WHERE条件的不参与分组,而HAVING是分组后对结果进行过滤;

  判断条件不同: WHERE不能对聚合函数进行判断,HAVING可以;

SELECT  gender,count(*)  FROM tb_user   GROUP BY  gender; 查出男女员工的数量;                   

5.排序查询 ORDER BY

SELECT 字段列表  FROM 表名 ORDER BY 排序字段1 排序方式,排序字段2 排序方式;   排序有ASC升序和降序DESC;

6.分页查询 

SELECT 字段列表 FROM 表名 LIMIT  起始索引,查询展示数;

SELECT * FROM tb_user LIMIT 0,10;  查询10条数据;  从第0条开始,查10条件;

第一个为页码数,第二个为展示条数;  页码数=(页码-1)*页展示条数;

比如第二页,展示10条件:  SELECT * FROM tb_user LIMIT 10,10;  页码(2-1)*10;

(五)DCL(Data Control Language):数据库控制语言,用来创建数据库用户,控制数据库的访问权限

1.查询用户

USE mysql;

SELECT * ROM user;

2.创建用户

CREATE USER '用户名'@'主机名'  IDENTIFIED BY ‘密码’;

CREATE user 'zxt'@'%' IDENTIFIED by 'aqa147258';     %代表任何主机;

3.修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';

4.删除用户

DROP USER '用户名'@'主机名';

 

权限控制

5.查询权限

SHOW GRANTS FOR '用户名'@'主机名';

USAGE 代表只有连接的权限;

6.授予权限

GRANT 权限列表 ON 数据库名.表名 TO  '用户名'@'主机名';

GRANT all on test.*  TO 'zxt'@'%';    授予对test库操作的所有权限;

GRANT all on *.*  TO 'zxt'@'%';      授予所有库所有表的操作权限;

7.撤销权限

REVOKE 权限列表 ON 数据库名.表名 FROM  '用户名'@'主机名';

REVOKE all on text.* FROM 'zxt'@'%'; 撤销对test库的所有表的操作权限;

三.函数

函数是指一段可以直接被另一段程序调用的程序或代码;

1.字符串函数

对h字符串进行填充,总共长度5,往左边填充'-';   右填充亦是一样;

简单案例:对员工号进行统一5位数,不足的左边补0;

update  tb_user  set  number=lpad(number,5,'0');

2.数值函数

3.日期函数

查询当前时间往后30天的日期

第一个参数是日期时间,第二个是数字,第三个是单位,可以是day,month等待,interval是固定的;

4.流程函数

流程控制函数可以在SQL语句中实现条件筛选,从而提高语句的效率;

例句:查询手机,如果是华为和小明则是过年生产,否则就是国外;

四.约束

(一)概述:作用于表字段上的规则,限制存储在表中的数据;

目的:保证数据库中的数据的正确,有效性和完整性;

(二)约束分类

主键自增: AUTO_INCREMENT

创建表时建立约束: 约束可以多个 用空格隔开

CREATE TABLE user(

  id int primary key auto_increment  comment '主键',

  name varchar(10) not null unique comment  '名字'

) COMMENT '用户表';

也可创建完表后加约束:

主键约束: ALTER TABLE 表名 ADD  [CONSTRANT 约束别名] PRIMARY KEY(字段);

 

外键约束:未建立外键关联,无法保证数据的一致性与完整性;

创表时添加外键:CREATE TABLE 表名(

字段名 字段类型...

[CONSTRAINT] [外键名称]  FOREIGN  KEY(外键字段名)  REFERENCES 主表(主表列名);

);

添加外键:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN  KEY (外键字段名) REFERENCES 主表(主表列名);

删除外键:ALTER TABLE 表名  DROP FOREIGN KEY 外键名称;

外键约束的删除与更新行为:

语法:ALTER TABLE 表名 ADD  CONSTRAINT 外键名称  FOREIGN KEY(外键字段)  REFERENCES  主表名(主表字段名)  ON UPDATE CASCADE  ON  DETELE CASCADE;

五.多表查询

多表查询:就是从多张表中查询数据;

(一).多表关系

分为三种:  ①.一对一; 比如用户与用户详情的关系; 一对一关系中,只需在任一一方假如外键关联即可,并设置外键为唯一的;

                   ②一对多(多对一); 比如部门和员工的两个表,一个员工只能对应一个部门,而一个部门可以有多个员工;通常在多的一方建立外键,也                                                   就是员工一方;

                   ③.多对多;比如 学生和课程的关系,一个学生可以选修多门课程,一门课程也可供多个学生选择;  多对多怎么设置外键呢,多对多需要                                       建立一张中间表,来阐述两表之间的关系,包含了学生的主键和课程的主键;

(二).多表关系概述.

 1.笛卡尔积:  笛卡尔乘积是指在数学中,两个集合的所有组合情况,得出的结果条数是 两个集合数量的乘积; 比如A集合有a,b  B集合有12;那么得出的结果会有四种,分别是 a1 a2 b1 b2;在数据库中表示两个表的数量乘积,所有数据的组合情况; 

例如:  SELECT  * FROM  表1,表2; 得到的就是表1和表2的组合数据,俗称笛卡尔积;

消除笛卡尔积,只需找出两个表的关联信息,进行一一对应;

比如:  SELECT  * FROM  表1,表2  WHERE 表1字段=表2字段;

2.多表查询分类:

     连接查询:

        内连接:相当于查询A,B交集部分数据;

        外连接: 

              左外连接: 查询左表所有数据,以及两张表交集部分数据;

              右外连接:查询右表所有数据,以及两张表交集部分数据;

         自连接:当前表与自身的连接查询,自连接必须使用表别名;

   子查询       

(三).内连接 

   1.隐式内连接: SELECT 字段列表 FROM 表1,表2  WHERE 条件;

   2.显示外连接: SELECT  字段列表 FROM 表1  INNER JOIN 表2  ON 连接条件;

(四).外连接

   1.左外连接: SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON条件;

   2.右外连接:SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON条件;

(五).自连接,可以指内连接,也可是外连接;

   SELECT 字段列表 FROM 表A 别名A  JOIN 表A  别名B   ON  条件;

(六).联合查询 union,union all

  union是将结果集合并后去重,union all是直接合并结果集;

   把多次查询的结果合并起来,形成一个新的查询结果集;

   SELECT 字段列表 FROM 表A ..

   UNION

   SELECT 字段列表 FROM 表B..;

   多张表返回的字段类别要一致,数量及字段类型都要一致;  

(七)子查询

      子查询简称嵌套查询; 也可用来做增删改操作;

     SELECT  * FROM 表名 WHERE  column1=(SELECT column1 FROM 表名);

  子查询位置分页:WHERE之后,FROM之后,SELECT之后;

    根据子查询结果不同,分为以下几种:

   1.标量子查询(子查询结果为单个值);

   2.列子查询(子查询结果为一列);

    常用的操作符: IN,NOT IN, ANY ,SOME, ALL;

   3.行子查询(子查询结果为一行);

   4.表子查询(子查询结果为多行多列);

六.事务

(一).事务简介

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作

要么同时成功,要么同时失败

MYSQL的事务默认是自动提交的,当执行增删改操作时,MYSQL会立即的隐式的提交事务;

(二).事务操作

现在我们有account表

让张三与李四进行转账操作;

正常操作是 成功的,但是如果出现了异常会怎样呢?将两个的Money恢复到2000,然后模拟异常;

发现张三减去了1000,而李四没有收到;

这源于我们MYSQL对于没一条SQL语句都是一个单独的事务;只有我们把两个SQL语句放到一个事务里面;

查看事务的提交方式: SELECT @@autocommit;   1代表是自动提交,0是手动提交;

修改事务提交方式: SET @@AUTOCOMMIT=0;

提交事务: COMMIT;

回滚事务: ROLLBACK;

现在我们把两个Money恢复至2000,接着操作;

这时候操作成功了吗?并没有,我们设置了事务的受手动提交

这个时候才成功了;如果出错了,那么我们要做的就不是提交,而是回滚,让数据回到操作之前一样;

我们也可以不修改事务的提交方式,只要做开启事务的操作就可以了;

开启事务: START TRANSACTION 或BEGIN;   

(三).事务的四大特性ACID

原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败;

一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态;

隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行;

持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的;对于持久化,它是将数据存到我们的磁盘中去的;

(四).并发事务问题

不可重复读:A事务读取一条数据后,B事务并发的修改了这条数据,A事务又读取这条数据的时候,发现两次读取结果不一致;

幻读:A事务对某条id=1的数据,发现没有数据,所有准备插入一条id为1的数据,而此时事务B并发的插入了一条id为1的数据,所以A事务插入时插入不了,但是再去查发现还是查不到;

(五).事务隔离级别

数据隔离级别的低到高由上图  自上往下;

查看事务隔离级别命令:

5.7.2版本之前:SELECT @@tx_isolation;

5.7.2版本之后:SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别:

SET [SESSION  或者 GLOBAL]  TRANSACTION  ISOLATION  LEVEL    READ COMMITTED 或 READ UNCOMMITTED 或

 REPEATABLE READ 或 SERIALIZABLE;

SESSION: 针对当前客户端窗口有效;

GLOBAL:针对所有客户端窗口有效;

现在模拟各个隔离级别遇到的情况;

首先是未提交读,这里模拟两个事务 同时对数据库做操作,并设置未提交读隔离级别:

展示脏读

然后是通过读已提交解决了脏读问题,但是出现了不可重复读

通过可重复读隔离级别处理不可重复读问题:

可重复读隔离级别,存在幻读的问题:

幻读问题只需改变隔离级别为最高即可解决;

但是序列串行化时,并发事务操作数据库,只允许由一个事务操作,其他事务都在阻塞等待,不论是增删改,或是查都会阻塞;

这个时候如果出现了两个事务同时插入一条数据会怎样?这里试了以下;

这里的阻塞等待在MYSQL中是加锁的概念;

标签:事务,数据库,MySQL,基础,查询,字段,表名,SELECT
From: https://www.cnblogs.com/cjxiaozhuang/p/16857682.html

相关文章

  • mysql 错误:The driver has not received any packets from the server.
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:CommunicationslinkfailureThelastpacketsentsuccessfullytotheserverwas0millisecondsago.The......
  • W: GPG error: http://repo.mysql.com/apt/ubuntu bionic InRelease: (签名失败)
    签名失败了安装MySQL8.0的时候遇到的问题,当时执行了apt-getupdate的指令,然后出现了下面一大堆Hit:1https://download.docker.com/linux/ubuntubionicInReleaseHit:3htt......
  • linux基础记录
    文章目录前言一、pandas是什么?二、使用步骤?1.引入库2.读入数据总结前言:1提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重......
  • 网络IO模型之select基础
    思考:为什么线程开销会大一、IO有两种操作,同步IO和异步IO。    同步IO指的是,必须等待IO操作完成后,控制权才返回给用户进程。    异步IO指的是,无......
  • Python基础之面向对象:5、三大特征-多态
    面对对象之多态目录面对对象之多态一、多态1、多态的概念2、多态的实际应用1、自我约束2、abc模块一、多态1、多态的概念​ 多态在实际应用时较为抽象,指事物的多种形态......
  • Python基础之面向对象:6、三大特征-封装
    面向对象之封装目录面向对象之封装一、封装1、封装的概念2、为什么要封装3、封装的两个层面二、隐藏与调用的方法1、隐藏的方法2、调用与修改的方法三、伪装1、伪装的概念......
  • Python基础之面向对象:7、反射
    面向对象之反射目录面向对象之反射一、反射1、反射的定义2、使用的场景3、常用方法1.hasattr()2.getattr()3.setattr()4.delattr()4、反射的实际应用一、反射1、反射的......
  • 卸载mysql并重装 mac
    sudorm/usr/local/mysqlsudorm-rf/usr/local/mysql*sudorm-rf/Library/StartupItems/MySQLCOMsudorm-rf/Library/PreferencePanes/My*rm-rf~/Library/Pr......
  • Python基础之面向对象:4、super方法实战
    派生方法实战​ 以上我们学习了通过super()的方法可以重写父类、额外添加父类中的数据,下面将通过实战案例来讲述super()方法来重写、添加父类中的功能代码需求:1、使用js......
  • Hadoop总结——Hadoop基础
    一、Hadoop是什么Hadoop是一个由Apache基金会所开发的分布式系统基础架构主要解决,海量数据的存储和海量数据的分析计算问题广义上来说,Hadoop通常是指一个更广泛的概念——Ha......