IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL学习笔记 -> 正文阅读

[大数据]MySQL学习笔记

数据库概念

  <1>数据库是一种数据的存储方式
  <2>数据库存储的数据是有格式的
  <3>数据库方便进行读取操作
  <4>数据库的数据是一种长期的存储方式

数据库分类

一、关系型数据库

1、数据库的存储单位是表
2、表和表之间存在某种关系
3、方便进行关联查询
4、关系型数据库属于持久型数据库
5、MYSQL就是关系型数据库

二、非关系型数据库

1、没有表的概念
2、存储类似于Map key-value
3、非关系型属于顺时存储
4、Redis属于非关系型数据库

总结:
开发中两种数据库互补
关系型数据库的单位(E_R)

库: 最大的存储单位,存储表!
表:存储异类数据的单位,一个库中的表名唯一!对标java中的类概念
行:(元组)一行数据库,对标Java中的对象概念
类(域):最小的存储单位,对应一个属性,对标Java实例属性

数据库管理系统

1、概念:
管理数据库的系统和软件! DBMS(DataBase Management System)

MySQL版本:
1.8.xx 2020以后更新 有点新
2.5.7xx 2018时间刚好5.7.25
3.5.5xx 2011更新 有点老

MySQL

1. 卸载
2. 1. 停止服务
2. 1. 电脑 - 右键 - 管理 - 服务 - mysql服务停止
2. cmd (管理员身份运行) - net stop 服务名 、 net start 服务名
3. 卸载软件
4. 移除服务
5. 1. cmd - sc delete 服务名
6. 残留文件删除
7. 1. c:/program data / mysql
8. 删除注册表
9. 1. 建议使用电脑管家
3. 安装
4. 1. 直接安装软件
2. server only

  1. 卸载
    1. 停止服务
      1. 电脑 - 右键 - 管理 - 服务 - mysql服务停止
      2. cmd (管理员身份运行) - net stop 服务名 、 net start 服务名
    2. 卸载软件
    3. 移除服务
      1. cmd - sc delete 服务名
    4. 残留文件删除
      1. c:/program data / mysql
    5. 删除注册表
      1. 建议使用电脑管家
  2. 安装
    1. 直接安装软件
    2. server only
[mysql]
no-beep
# 服务设置编码格式
default-character-set=utf8
# default-character-set=

[mysqld]
default-storage-engine=INNODB
# 服务设置驱动编码格式
character-set-server=utf8
collation-server=utf8_general_ci
  1. 修改配置文件
  2. 启动服务
  3. 测试连接数据库

mysql -u账号 -p密码 -P3307 -h127.0.0.1

  1. 环境变量
    1. mysql / bin - path

SQL语句概念

1、概念

SQL(Structure Query Language)结构化查询语言

      	用来操作关系型数据库的语法
      	SQL标准的语法,所有的关系型数据库都支持

注意:每种关系型数据哭都有自己的方言!其他的数据库不支持!例如mysql :limit

  1. 分类
DDL(DataBase Definition Language):数据库定义语言 创建和修改和删除容易
DML(DataBase Manipulation Language):数据库操作语言 插入 删除和修改
DQL(DataBase Query Language):数据库查询语言
TPL(Transaction Process Language:数据库实务操作语言 食物相关
DCL(DataBase Control Language):用户控制语言 创建用户 权限赋予 和权限收回

3.标准
1. sql关键字不区分大小写 select == SELECT,但是值区分大小写!
2. 命名规范和Java相同
3. 不要使用关键字命名容器名 t_标识
4. 库名不能重复,表名同一个库内不能重复!

  1. 关系
  2. 基本语句
  3. 连接数据库管理系统
mysql -u用户 -p密码 -P端口号3306 -hip地址
注意:-p不输入 显示密文密码输入

DDL(Database Denifition Language):数据库定义语言

  1. DDL的作用和关键字
    1. DDL容器的创建、修改、删除
    2. create alter drop
  2. DDL库的操作
    1. 创建库
create database 库名;  #创建库,配置的默认编码格式
create database 库名 character set 编码格式; #创建库指定编码格式!

修改库: alter database 库名 character set 新编码格式

查看库:

  1. 查看所有库:show databases;

  2. 查看当前库:select databa();

  3. 查看创建库语句:show create database 库名;

切换库:

  1. 注意:数据库数据操作必须限制名一个数据库!
  2. use 数据库名
  3. 删除库: drop databa 数据库名;

DDL表的操作:

  1. 创建表:
    create table 表名(
    列名 数据类型 [约束],
    列名 数据类型 [约束],
    )[charset=编码格式];

  2. 删除表:
    drop table 表名;

3.修改表
修改表名:alter table 原名 rename 新表名;

4.查看表信息:
desc 表名; //查看表字段
show tables; #查看当前库的表

数据类型:

  1. 整数类型
    1. tinyint 1字节
    2. smallint 2字节
    3. mediumint 3字节
    4. int/integer 4字节
    5. bigint 8字节
    6. double(m,d) m数字总仓库 m最大16 double(5,1) 9999.9
    7. decimal(m,d) m数字的总长度 m最大65!
    8. 严谨超过范围,精准选择,节约空间!
  2. 字符串类型
    1. char 0-255 一旦定义长度,全部沾满! char(5) a --》 xxxxa
    2. varchar 0-65535 指定长度,可以伸缩占有!varchar(5) a-》 a
    3. text 0-65535 不支持索引查询!
  3. 时间类型
    1. date YYYY-MM-DD
    2. time HH:MM:ss
    3. year YYYY
    4. datetime YYYY-MM-DD HH:MM:ss 8字节 需要自己维护 1000-9999
    5. timestamp YYYY-MM-DD HH:MM:ss 4字节 自动维护【只维护一列】 1970-2038
  4. 案例:
    1. 学员信息表info
      1. 学号,要求非负数 并且零填充 id int unsigned zerofill
      2. 姓名,6个字符串 字符串 name varchar(6)
      3. 年龄,没有负数 age tinyint unsigned
      4. 性别, 固定2个字符串 sex char(2)
      5. 身高, 4位保留1个小数点 height double(4,1)
      6. 生日, 年月日 birthday date
      7. 修改时间, 记录添加和修改的数据列 updatetime timestamp

3.DDL列的操作

   添加一列:
   alter table 表名 add 列名 类型;
   
   修改列名:
   alter table 表名 change 原列名 新列名 类型;
   
   修改类型:
   alter table 表名 modify 列名 新类型;
   
   删除一列:
   alter table 表名 drop 列名;

DML(DataBase Manipulation Language)

1. 核心关键字

数据库数据数据修改语言:
inset into/update/delete

插入:
insert into 表名 value/vlues(值,值) #按照数据库的全部列和顺序插入数据!
insert into 表名 (列,列,列) value/values(值,值,值) #指定列插入,值的顺序和列的顺序对应!
注意: values/value的区别: values支持插入多行,value只能插入一行! jdbc种有批量插入的api,value不支持!

1. 注意

  • 推荐列名
  • 推荐values
  • .插入数据是一行一行!

修改:

update 表名 set 列名=值,列=运算、列 where  条件;

删除数据和表结构:

truncate table 表名;#删除数据和表结构 一般套娃项目

DQL(DataBase Query Language)

1. 介绍和关键字

数据库查询语句!也是数据库中最难的语句!

select

语法

select 列名,列名 from 表名 where 条件1[列名 运算符号  值/列名]   条件2 条件3...  #指定列名查询

select * from 表名 where 条件 ;# 查询全部列

select 表名.列名 、 表名.* from 表名 条件; #多表查询,可以使用获取表的列名

基本查询:

where 列名(比较符号:> < >= <= != = <> / like / regexp / in () not in ()
         between xx and 值 , is null is not null]
    and or xor not    
    列名 [比较符号:> < >= <= != = <> / like / regexp / in () not in ()
         between xx and 值 , is null is not null]  )

模糊查询:

like就是非准确值查询,也就是模糊查询!
语法:
        列名 like  "[值,%,_]"
        %:任意个字符
        _:任意一个字符
        %开头会破坏索引

分支查询:

位置:
       查询列上,用于分级查询!
语法:
       case
              when  对比条件  then  "值"
               when  对比条件  then  "值"
               else  "值"
        end as  "虚拟列名"

时间查询:

时间对比:
          时间类型可以使用> < = !=对比
          例如:hibedate   >  <   ’2020-10-01‘
时间函数:
      1.获取当前时间:
         now();sysdate();
         
      2.提取时间
        year(时间)
        month(时间);
        day()
        week(时间)
        
      3.时间+-运算
          datediff(时间,时间):两个时间节点的天数
          adddate(时间,intererval  +-  数量  单位):时间运算

聚合函数:

       mysql的中,包含三种元素: 关键字,函数(),容器自定义命名!函数分类:  单行函数: 处理每一行的数据,最终查询结果可以是多行!  
      多行函数: 整体的数据统计,最终查询结果是一行! 
      注意: 多行函数时整体统计,在查询结果上就不应该统计单行的特性,例如:查询最大工资和员工姓名!员工姓名出现就不合理!

聚合语法:

 sum() 统计总数量,如果为null,会计算成0!在运算!
 avg() 统计平均值,如果为null,会计算成0!在运算!
 max() 最大值
 min() 最小值
 count()  统计总数量! 如果count(列名) 列为null不计数! count(*) 代表匹配每一行的所有列! 效率低!
          推荐count(1) 根据主键列统计,效率高!

字段控制:

字段控制!
使用字段控制,可以控制字段重复和null的默认值,或者字段起别名!
##查询有哪些工种:
		SELECT DISTINCT job FROM emp;
		
##ifnull(字段,值)
查询员工的姓名和工资  和奖金和工资和
#数值+null   =null
SELECT enamel,萨拉,community,sal+IFNULL(comm,0) AS cts  FROM emp;

##字段起别名
SELECT enamel,sal,comm AS ergouzi,sal+IFNULL(comm,0) AS cts  FROM emp;
SELECT ename,sal,comm ergouzi,sal+IFNULL(comm,0) AS cts  FROM emp;

排序查询:

介绍:
       排序不会筛选结果!指挥控制结果的显示顺序!
语法
      order by 列名 asc/desc,列名 asc,desc。。。。。
注意:
      1.注意多个列排序不是并列关系!有先后关系!前面相同参会比后面!
      2.注意 asc属于默认值,可以省略!
      3.order by  不依赖where,如果有条件,order  by 一定会出现where的后面!【右边】

分组查询:

分组介绍
       将尸体按照某一个或者多个类别进行分组,分组以后进行组的数据统计! 
       分组以后不再有单个实体的属性,分组一般都是统计的聚合函数或者分组字段!
分组语法
        group by 字段,字段,字段
注意事项:
       1.分组一般配合聚合函数
       2.分组查询查询聚合函数和分组字段!
       selec  [列【分组字段】,【聚合函数】]from 表名 where group by 分组
    
having和where
        where分组前的过滤条件,还没生成结果表!并且不能使用
        列表的计算结果都不呢个使用!
        having和group by  分组后的过滤条件,可以用列的计算结果!
        绝大部分情况下having后面跟的都是聚合函数! 

切割查询(分页查询)

介绍
      进行结果切割显示!
语法
       limit  offset ,number;
       limit  number  = limit  0,number;
注意:如果剩余数量少于number,指挥拆线呢剩余数据!

分页查询公式
           limit的作用,可以用于分页查询!
           分页查询必备的条件:page(当前页),pageSize(也容量)
           limit (page-1)*pageSize,pageSize;

查询总结(顺序):
select from 表 where group by order bylimt

数据库约束

约束概念和理解:

  1. 约束是创建表语句的一部分,列名 类型[约束],约束可省略!
  2. 约束的目的,约束和显示列的数据,保证数据的正确性!
  3. 如果违反了约束的内容,mysql会用sqlexception反馈,数据无法修改插入
  4. 约束不是必须的,但是是很有必要的
  5. 约束会降低数据库的查询效率(弊端)

约束分类

  1. 行约束[实体约束]

    约束两行数据不重复
    判断重复:行内所有列都一样

  2. 域[列]约束

    显示一列数据的正确性
    例如:不能为null,必要有默认值,check约束【男、女】,类型

    <1>主键约束
    为了却把一行数据不重复的列,这一类就叫主键
    主键不能重复,并且不能为null
    主键都叫xx_id

         主键的分类:
                  自定义主键:人为添加的一列,就是保证不重复的主键!职责单一!
                  自然主键:自带的属性,当前是唯一,可以作为属性,也可以作为主键!
         主键约束:
                  限制和保护住建列不重复和不为null,违反了抛异常!
          
          #单一主键
          create table表名(
                主键列名  int primary key
          )
          
          #联合主键   联合两个逐渐的结果进行判断值!
          create  table 表名(
                主键1  类型,
                主键2  类型,
                primary  key   (主键1,主键2)
          )
    
  3. 唯一约束
    语法:unique可以为Null,有值不能重复!

  4. 自增长约束:(配合整数类型主键)auto_increment

  5. 域约束[列约束]

  6. 非空
    1.默认情况下,所有的列可以为null
    2.not null
    3.primary key !=not null+unique

  7. 默认值 :default 值

  8. check约束
    mysql不支持!
    check(男,女)
    enum(‘男’,‘女’)

create  table  student(
   sid  int primary key  auot_increment "学生主键列",
   sname  varchar(20) not null comment"学生姓名",
   phone  varchar(13) unique comment"学生分数",
   score int default 0 comment"学生分数",
   sex  enum('男','女')comment  "学生性别"

后期修改表添加主外键约束:

alter table score addconstriaint s_ss_fk foreign key  (student_id)
     references student(sid)

数据库关系【表中的数据关系】

  1. 表关系理解:
    <1>两个表的数据的关系,并非容器的关系!
    <2>表关系值得是行和行的关系!
    <3>表关系值得的实体和实体的关系!
    <4>表关系值得是对象和对象的关系!
    <5>一对一,一对多、多对一,多对多
    <6>表关系分析一定要从双向考虑!

  2. 表关系分析

  3. <1>子表创建外键
    <2>子表添加主外键约束
    <3>外键可以设置逐渐
    <4>外键设置成unique+not null

  4. 一对多

  5. <1>子表创建外键
    <2>子表添加主外键约束
    <3>外键添加not null

  6. 多对多

  7. 1、创建一个中间表
    2、中间表包含连个外键
    3、中间表的外键添加主外键约束+not null

  8. 表关系总结

  9. 1、表关系出来多对多都是值两个表的关系!
    2、多对多的两个表是平等的,谁先创建都可以!但是一对一和一对多 必须先创建主表!

# 一对一
CREATE TABLE qq_main(
  qq VARCHAR(20) PRIMARY KEY COMMENT "qq号",
  qname VARCHAR(20) NOT NULL COMMENT "qq名",
  qianming VARCHAR(200) COMMENT "qq签名"
)
CREATE TABLE qq_detail(
  did INT PRIMARY KEY AUTO_INCREMENT COMMENT "详情主键",
  address VARCHAR(200) COMMENT "地址",
  email VARCHAR(40) COMMENT "邮箱",
  qq VARCHAR(20) NOT NULL UNIQUE ,
  CONSTRAINT qq_detail FOREIGN KEY(qq) REFERENCES qq_main(qq)
)

#学生和分数
CREATE TABLE student(
  sid INT PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR(20) NOT NULL
)


# 多对多
CREATE TABLE teacher(
  tid INT PRIMARY KEY AUTO_INCREMENT,
  tname VARCHAR(20) NOT NULL
)
CREATE TABLE student_teacher(
  stid INT PRIMARY KEY AUTO_INCREMENT,
  sid INT NOT NULL,
  tid INT NOT NULL,
  CONSTRAINT s_t_student FOREIGN KEY (sid) REFERENCES student(sid),
  CONSTRAINT s_t_teacher FOREIGN KEY (tid) REFERENCES teacher(tid)
)

# 一对多
CREATE TABLE score(
 cid INT PRIMARY KEY AUTO_INCREMENT,
 number DOUBLE(4,1),
 sid INT NOT NULL ,
 CONSTRAINT s_score FOREIGN KEY(sid) REFERENCES student(sid)
)

数据库多表查询

  1. 多表查询理解
    1. 多表查询将多个表的数据合并到一个表中返回!
    2. 多表查询数据合并方式就有两种 水平合并 垂直合并
    3. 水平合并【连接查询、自然连接、子查询、自连接】 要求表必须有关系【主外键】,最终的结果合并到一个实体上!
    4. 垂直合并 将多个表的数据一股脑的放入一个表!垂直拼接,行和行之间没有关系!但是有一些限制!【列的类型一致】
  2. 为什么要有多表查询呢?【为什么拆表!】
    1. 拆表防止数据冗余!
    2. 拆表以后单个表的数据不能满足显示需求!需要关联其他表进行结果查询,才可以满足!
    3. 就有多表查询!
  3. 合并结果集
    1. 作用

将多个结果集两两垂直拼接到一起!最后形成一个结果表!

通常为了防止返回多个结果!

语法:

union:去掉重复数据
union all;直接合并,不去重复

select
       union/union all
select 
       union/union all
 select

练习:

# 数据准备
CREATE TABLE a(
   aid INT,
   aname VARCHAR(10)
);

CREATE TABLE b(
   bid INT,
   bname VARCHAR(10)
);

INSERT INTO a VALUES(1,'aaaa'),(2,'bbbb'),(3,'cccc');
INSERT INTO b VALUES(4,'aaaa'),(2,'bbbb'),(3,'cccc');

# 注意对应列的类型需要一致,查询的列数需要一致!
SELECT * FROM a
UNION ALL
SELECT * FROM b;

连接查询:

    1. 作用

水平方向将多个表的数据两两拼接到一起!

注意水平查询结果是拼接到一行,一个实体一个对象,要求两个表的数据必须有关系【主外键】

  1. 语法
    1. 99查询大法【方言】
select * from1,表2,表3,表4

# 数据准备
CREATE TABLE a(
   aid INT,
   aname VARCHAR(10)
);

CREATE TABLE b(
   bid INT,
   bname VARCHAR(10)
);


INSERT INTO a VALUES(1,'aaaa'),(2,'bbbb'),(3,'cccc');
INSERT INTO b VALUES(4,'aaaa'),(2,'bbbb'),(3,'cccc');

# 注意对应列的类型需要一致,查询的列数需要一致!
SELECT * FROM a
UNION ALL
SELECT * FROM b;

# 99查询大法
-- 学生表
CREATE TABLE student(
	stuid VARCHAR(10)PRIMARY KEY,
	stuname VARCHAR(50)
)

DROP TABLE score;

-- 分数表
CREATE TABLE score(
	stuid VARCHAR(10),
	score INT,
	courseid INT,
	CONSTRAINT fk_stu_sco  FOREIGN KEY(stuid) REFERENCES student(stuid)
)

DROP TABLE student;

SELECT * FROM student;
INSERT INTO student VALUES('1001','张三峰');
INSERT INTO student VALUES('1002','张无忌');
INSERT INTO student VALUES('1003','王尼玛');
INSERT INTO student VALUES('1004','王老五');

SELECT * FROM score;
INSERT INTO score VALUES('1001',98,1);
INSERT INTO score VALUES('1002',95,1);
INSERT INTO score VALUES('1002',67,2);
INSERT INTO score VALUES('1003',83,2);
INSERT INTO score VALUES('1003',57,3);

# 课程表
CREATE TABLE course(
  courseid INT PRIMARY KEY AUTO_INCREMENT,
  cname VARCHAR(20) NOT NULL
)

# 中间表
CREATE TABLE course_teacher(
  ctid INT PRIMARY KEY AUTO_INCREMENT,
  tid  INT NOT NULL,
  courseid INT NOT NULL
)


INSERT INTO course VALUES(1,"java");
INSERT INTO course VALUES(2,"h5");
INSERT INTO course VALUES(3,"php");
INSERT INTO course VALUES(4,"python");

# 查询学生姓名
SELECT stuname FROM student;

# 查询学生姓名 和 分数
# 单表 不满足
# 学生 分数表  -》 水平拼接
# 99查询大法
SELECT  student.stuid,student.stuname, score.stuid,score.score 
	FROM student,score WHERE student.stuid = score.stuid

#查询学号 姓名 分数 和 课程名
# 单表 不满足
# 学生 分数 课程 -》 水平拼接
# 99大法
SELECT  s.stuid,s.stuname,c.score,u.cname  
	FROM student s,score c,course u
				WHERE s.stuid = c.stuid
				        AND
					c.courseid = u.courseid
					AND
					c.score > 60;

#查询学生编号,姓名,分数,课程和授课老师!

SELECT s.stuid,s.stuname,c.score,u.cname,t.tname FROM student s,score c ,course u ,
		course_teacher ut , teacher t
		WHERE s.stuid = c.stuid AND
		      c.courseid = u.courseid AND
		      u.courseid = ut.courseid AND 
		      ut.tid = t.tid;
# 99大法
where 主外键  + 条件	  

内连接:

  1. 介绍:
    标准化多表查询语法!
    作用和99查询大法一样
    只不过将主外键放在了一个固定的位置

        	select   *  from 表1 [inner]  join 表2  on  主=外
        	                      [inner] join  表3 on   主=外
        	                      where  order  by
    

练习:

#1.查询学生姓名 和 分数

SELECT s.stuid ,s.stuname,c.score FROM student s INNER JOIN score c 
		 ON s.stuid = c.stuid ;

#2.查询学号 姓名 分数 和 课程名

SELECT s.*,c.score,u.cname FROM student s JOIN score c ON s.stuid = c.stuid
			  INNER JOIN course u ON c.courseid = u.courseid

#3.查询学生编号,姓名,分数,课程和授课老师!

SELECT s.*,c.score,u.cname,t.tname FROM student s JOIN score c ON s.stuid = c.stuid
			  INNER JOIN course u ON c.courseid = u.courseid
				JOIN course_teacher ct ON u.courseid = ct.courseid
				JOIN teacher t ON ct.tid = t.tid;

右外连接:

select   *   from   表1 right【outer】 join 表2  on 主=外;

1. 问题

当开发中,表的数据并不是平等!

开发中百分之95以上都是用外连接!

外连接的作用指定一个方向为逻辑主表!就算他的数据在其他表没有被引用结果也会查询出来!

一旦使用外连接,后续的全部查询都是外连接,并且方向一致!

1. 总结
2. 1. 多表查询有技巧的!
2. 确定内连接还是外连接
3. 一旦确定了外连接方向一致,都是外连接!
4. 两两拼接,两两连接
5. 开发中绝大部分情况都是用外连接!

3. 自然连接

	SELECT * FROM emp NATURAL JOIN dept  ; 自然内连接
    SELECT * FROM emp NATURAL LEFT JOIN dept; 自然左外连接
     SELECT * FROM emp NATURAL RIGHT JOIN dept; 自然右外连接
    
    注意根据列名判定主外键相等! 不稳妥!

子查询【重点】

介绍
查询里面嵌套查询!
语法

select  *  from  表   where 列  =(select  xx)
select  *  from   (select)as 别名  where 列 =(select  xx)

出现位置

  1. 在from后面充当查询结果临时表、from表的时候需要取别名
  2. where后面充当查询条件
  3. 特殊记忆

子查询的结果集

  1. 单行单列 where直接俄使用对比符号 ><=等
  2. 单行多列 where in(列1,列2)in(子查询)in唱的那歌多列等和and关系!
  3. 多行单列 where any /all这两种方式可以转化为max、min
  4. 多行多列 from充当虚拟表,注意,虚拟表必须起别名
# 1.工资高于JONES的员工
SELECT sal FROM emp WHERE ename = "JONES"
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = "JONES")

# 2.SCOTT同一个部门的员工。
SELECT deptno FROM emp WHERE ename = "SCOTT"
SELECT * FROM emp WHERE ename != 'SCOTT' AND 
	deptno = (SELECT deptno FROM emp WHERE ename = "SCOTT")

# 工资高于30号部门所有人的员工信息
SELECT sal FROM emp WHERE deptno = 30;
SELECT MAX(sal) FROM emp WHERE deptno = 30;
ALL / ANY

SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30)
SELECT * FROM emp WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30)

查询工作和工资与MARTIN完全相同的员工信息

SELECT job FROM emp WHERE ename = 'MARTIN'
SELECT sal FROM emp WHERE ename = 'MARTIN'

SELECT * FROM  emp WHERE job = (SELECT job FROM emp WHERE ename = 'MARTIN') AND sal = (SELECT sal FROM emp WHERE ename = 'MARTIN')

SELECT * FROM emp WHERE  (job,sal) IN (SELECT job,sal FROM emp WHERE ename = 'MARTIN')2个以上下属的员工信息
SELECT mgr,COUNT(1) ct FROM emp GROUP BY mgr HAVING ct > 2;

SELECT * FROM emp e JOIN (SELECT mgr,COUNT(1) ct FROM emp GROUP BY mgr HAVING ct > 2) e2
    ON e.empno = e2.mgr;

自连接
1.不是一种查询语法
2.同一个表多次服用查询
3.查询的结果无法在同一行数据获取到!然后这个数据还在自己表的另一行!
使用:

select *  from emp e1 left join emp e2 
                   on  e1.mgr=e2.empno
                   left join emp e3 on e2.mgr=e3.empno
                   where  e1.empno ="7369";

事务控制TPL

事务介绍

1.数据库事务集是sql语句的缓存机制、
2.当所有语句处理完毕,统一确定生效还是回滚
3.事务可以在错误的场景下,我们还有回滚的及hi!
4.事物的动作存在高度的一致性,成功,都成功,失败都失败

事务类型:

开启事务
insert  into  datas (id,name)value (“呵呵”,"拉拉") 
提交事务【成功】
事务回滚【失败】
mysql自动提交事务
如何把多个动作的放在一个事务中,并且控制十五的提交或者回滚
  1. 自动提交事务
    1. 默认每条语句都在一个事务中!
    2. 执行语句之前开启事务
    3. 执行语句之后根据语句是否报错自动选择提交和回滚
#查询mysql的系统变量
SHOW VARIABLES LIKE '%auto%'

1. 手动提交事务
2. 1. 手动开启

	start transaction; #开启事务
   sql
   sql
  sql

手动提交

		commit

手动回滚

rollback

1. 转账案例事务操作
2. 1. 事务操作
2. 1. 关闭自动提交事务 手动提交 【Java jdbc使用】

		set autocommit = off;
       sql
       sql
       commit; /rollback;
       注意: off状态只保持本次窗口、当前连接!

主动开启一个事务,手动提交或者回滚

		start transaction;
        sql
        sql
   commit; / rollback;/

事务使用场景

  1. 一个业务涉及多条sql语句操作**
  2. 一个业务 - mvc - service - 方法
  3. **service方法中涉及多条DML语

事务特性总结:

  • Atomicity【原子性】:一个事务中的动作是不可切割执行的
  • Consistency【一致性】:
    1.内部的动作一致成功都成功!失败都失败!(微观角度)
    2.双方数据总额事务前后一致!(宏观角度)
  • Isolation【隔离性】:并发事务之间的影响程度可以控制!相当于多线程的锁!
  • Durability【持久性】:一旦十五提交或者回滚,数据就会在数据库中持久化的改变

事物的隔离性理解:

  1. 指的是并发事务之间的排次情况
  2. 隔离性有不同的级别!从低到高有四个级别!
  3. 越高的隔离级别,并发事务互相排次越严重

隔离级别:

在这里插入图片描述

操作语法
查询隔离级别

	select @@tx_isolation;

. 设置隔离级别

set transaction isolation level 隔离级别

1. 低隔离错误

  1. 脏读: 一个事务读取另一个事务未提交的数据! READ UNCOMMITTED
  2. 不可重读的:一个事务读取另一个事务提交的修改数据!READ UNCOMMITTED READ COMMITTED
  3. 虚读、幻读:一个事务读取了另一个事务提交的插入数据! READ UNCOMMITTED READ COMMITTED RPEATABLE READ【小概率】
  4. 隔离总结
    1. 隔离级别越高数据越安全
    2. 隔离级别越高性能越低
    3. 推荐使用第二个隔离级别!

账号控制DCL

创建账号

#创建一个 zhangsan 用户
CREATE USER `zhangsan` IDENTIFIED BY '123';

权限赋予

#将 companyDB下的所有表的权限都赋给 zhangsan
GRANT ALL全部权限 create,update,delete ON companyDB.* TO `zhangsan`;

. 权限收回

#将 zhangsan 的 companyDB 的权限撤销
REVOKE ALL ON companyDB.* FROM `zhangsan`;

账号删除

drop user 账号

数据备份

. 数据备份

mysqldump  -u账号 -p密码  数据库>d:\文件位置.sql

数据恢复

mysql -uroot -proot 数据库<d:\文件.sql
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章           查看所有文章
加:2021-11-26 08:55:06  更:2021-11-26 08:57:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:42:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码