MySQL:基础部分

文章目录

前言

学完了MySQL基础部分,然后进行复习巩固,就写了这篇博客(好累!!),jdbc部分还没写完,就先发这么多吧!

MySQL的数据类型

MySQL 是一个 “关系数据库”,通过表的形式来组织数据;

表的特点是"特别整齐",
每一行,列数都是一样的;
每一列,数据都是同类的(数据类型相同).

数据类型:
一方面能够方便我们对数据进行处理;
一方面也能够针对数据进行校验和检查.

一、数字类型(整数+小数)

数据类型大小说明对应的Java类型对应的C类型
BIT[(M)]M指定位数,默认为1二进制数,M:1 ~ 64,存储范围,0 ~ 2M-1常用Boolean对应BIT,此时默认为1位,即只能存储0和1char[]
TINYINT1字节Bytesigned char
SMALLINT2字节Shortshort int
INT4字节integerint
BIGINT8字节Longlong long int
FLOAT(M,D)4字节单精度,M指定长度,D指定精度位数,会发生精度丢失Floatfloat
DOUBLE(M,D)8字节Doubledouble
DECIMAL(M,D)M+2双精度,M指定长度,D指定小数点位数,精确数值BigDecimalchar[]
NUMERIC(M,D)M+2同上BigDecimalchar[]

二、字符串类型

数据类型大小说明对应的Java类型对应的C类型
VARCHAR(SIZE)0 ~ 65 535字节可变长度字符串Stringchar[]
TEXT0 ~ 65 535字节长文本数据Stringchar[]
MEDIUMTEXT0 ~ 16 777 215字节中等长度文本数据Stringchar[]
BLOB0 ~ 65 535字节二进制形式的长文本数据Byte[]char[]

1、VARCHAR

VARCHAR(SIZE)所对应的数据所占用的字节数为实际长度加1;
例如:
输入"abcd",用 VARCHAR(3) 存储,则为 “abc” ,4个字节.

三、时间日期类型

数据类型大小说明对应的Java类型对应的C类型
DATETIME8字节(1000-01-01 00:00:00~9999-12-31 23:59:59),不会进行时区的检索和转换java.util.Data、java.sql.TimestampMYSQL TIME
TIMESTAMP4字节(1970-01-01 00:00:01~2038-01-19 03:14:07),自动检索当前时区进行转换java.util.Data、java.sql.TimestampMYSQL TIME

1、DATETIME

DATETIME 类型用于表示日期和时间,它的显示形式为’YYYY-MM-DD HH: MM:SS’,
其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分,SS 表示秒。

  • 可以用’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和时间,YY表示年,取值范围为’00’—‘99’。‘00’— '69’范围的值会被转换为2000—2069范围的值,‘70’—'99’范围的值会被转换为1970—1999范围的值。
  • NOW:输人当前系统的日期和时间。

2、TIMESTAMP

TIMESTAMP 类型用于表示日期和时间,它的显示形式与 DATETIME 相同但取值范围比 DATETIME 小。

  • CURRENT_TIMESTAMP:输人系统当前日期和时间。

数据库的基本操作

一、创建数据库

1、语法

create database 数据库名称;

2、举例

成功案例:
在这里插入图片描述
错误案例:
在这里插入图片描述

3、注意

  • 不要拼写错误;
  • 关键字不区分大小写;
  • 不要遗忘分号(英文);

二、显示数据库

1、语法

show databases;

2、举例

在这里插入图片描述

3、注意

  • "databases"为复数,不要拼错;

三、选中数据库

1、语法

use 数据库名称;

2、举例

在这里插入图片描述

3、注意

  • 注意分号,大部分 SQL 如果不带分号会出现问题,但有少数 SQL 可以不带分号,一般都带上分号;

四、删除数据库

1、语法

drop database 数据库名称;

2、举例

在这里插入图片描述

3、注意

  • 数据库删除操作,非常危险:程序员和代码,有一个能跑就行!
  • 不要轻易的操作!

4、原理

逻辑删除:
操作系统为了方便进行管理,把整个硬盘分成了若干个"盘块";
每个盘块都可以保存一定的数据;
每个文件,实际上可能是由一个或者多个盘快上面的数据来构成的;

当操作系统删除文件的时候,为了提高删除动作的效率,在删除的时候并不是真的把硬盘上之前保存的数据删除掉,而只是把该文件对应的盘块标记为“无效”。

一旦出现误删库的情况,就要尽快让主机断电!!!
这样可以避免操作系统把这些被标记成无效的盘块给分配出去!!!

数据表的基本操作

一、创建表

1、语法

 create table 表名(
         字段1 字段类型,
         字段2 字段类型,
         …
         字段n 字段类型
);

2、举例

在这里插入图片描述

3、注意

  • 变量名写在前,类型写在后;
  • 要想创建表,首先得选中数据库;
  • 同一个数据库中,不能有两个名字相同的表;
  • 创建表的时候,表名或者列名,不能和 SQL 的关键字冲突,但可以使用反引号 ` 引起来;

二、查看表

1、语法

show tables;

2、举例

在这里插入图片描述

3、注意

  • 注意 “tables” 为复数;

三、查看表结构

1、语法

desc 表名;

2、举例

在这里插入图片描述

3、注意

  • Field:每一列都是一个字段,Field(表示表这里有几列);
  • int(11):11表示的是打印数字的时候,显示数据的宽度最大是11位数,只是影响在客户端中的显示,不影响数据的存储和计算;
  • Null:这一列是否可以为空(不填,选填项);
  • Key:约束;
  • Default:默认值约束,默认的默认值是 NULL(不填),也能手动修改;
  • Extra:其他约束;

四、删除表

1、语法

drop table 表名;

2、举例

在这里插入图片描述

3、注意

  • 删表操作非常危险!!!危害比删库只多不少!

MySQL的增删改查

一、新增元素(Create)

1、语法

①所有字段插入数据

insert into 表名 values (1,2,...);

②指定字段插入数据
(字段名1,字段名2,…):用于指定插人的字段名;

insert into 表名 (字段名1,字段名2,...) values (1,2,...);

③同时插入多条数据
(值 1,值 2,…),(值 1,值 2,…):表示要插人的数据,以逗号 “ , ” 分割;

insert into 表名 [(字段名1,字段名2,...)]values (1,2,),(1,2,),...;

2、举例

①所有字段插入数据
在这里插入图片描述
②指定字段插入数据
在这里插入图片描述
③同时插入多条数据
在这里插入图片描述

3、注意

  • 此处的值的个数要和表的列数匹配,值的类型也要和列的类型匹配;
  • “一次插一条,插多次” 比 “一次插多条,插一次”速度慢的多;

二、查询元素(Retrieve)

1、查询所有字段

①语法
select * from 表名;
②举例

在这里插入图片描述

③注意
  • 星号 “ * ” 是 通配符,表示匹配任意的列。(所有的列)
  • MySQL是客户端服务器结构的程序,在此处看到的这个表(临时表)只是在客户端这样显示,并不是在服务器上存了这样一个表;
  • 查询的列越多,意味着需要传输的数据量越大;
  • 可能会影响到索引的使用 ;

2、指定列查找

①语法
select 列名1,列名2,... from 表名;
②举例

在这里插入图片描述

③注意
  • 临时表显示的列名,完全取决于 select 指定的列名,临时表会尽可能的保证显示结果正确;
  • 指定列的顺序不需要按定义表的顺序来;

3、表达式查找

①语法
select 表达式 from 表名;
select 表达式 as 别名 from 表名;
②举例

在这里插入图片描述

③注意
  • 在 SQL 中,如果 NULL 和其他类型进行混合运算,结果仍为 NULL

4、过滤重复数据

①语法
select distinct 列名 from 表名;
②举例

在这里插入图片描述

5、排序查询

①语法
-- 升序
select 列名 from 表名 order by 列名;
select 列名 from 表名 order by 列名 asc;
-- 降序
select 列名 from 表名 order by 列名 desc;
②举例

在这里插入图片描述

③注意
  • 指定多个列排序:先以第一列为标准进行排序;如果相同,再按照第二列进行比较;以此类推;
  • 没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序;
  • NULL 数据排序,视为比任何值都小,升序出现在最上面降序出现在最下面
  • 查询过程中,表达式查找以及排序查找,仅仅针对临时表,对于数据库上的数据没有影响
  • 排序查找中,降序排列的 desc“descending” 的缩写;而查看表结构的 desc“describe” 的缩写;

6、条件查询

比较运算符

运算符说明
>,>=,<,<=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=>等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=,<>不等于
BETWEEN a0 AND a1范围匹配,[a0,a1],如果 a0 <= value <= a1,则返回 TRUE(1)
IN (option,…)如果是 option 中的任意一个,返回 TRUE(1)
IS NULL是 NULL
IS NOT NULL不是 NULL
LIKE模糊匹配,% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

逻辑运算符

运算符说明
AND多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR任意一个条件为 TRUE(1),结果为 TRUE(1)
NOT条件为 TRUE(1),结果为 FALSE(0)
①语法

引入 where 字句,针对查询结果进行筛选:
对查询结果进行依次遍历,把对应的查询结果带入到条件中;
条件成立,则把这个记录放到最终查询结果里;反正,则不作为最终结果。

select 列名 from 表名 where 条件;
②举例
  • 样本
    在这里插入图片描述

  • 基本查询
    在这里插入图片描述

  • AND 和 OR
    在这里插入图片描述

  • 范围查询
    在这里插入图片描述

  • 模糊查询
    在这里插入图片描述

③注意
  • WHERE 条件可以使用表达式,但不能使用别名。
  • AND 的优先级高于 OR,在同时使用时,需要使用小括号()包裹优先执行的部分

7、分页查询

①语法
-- 从 s 开始,筛选 n 条结果
select 列名 from 表名 [where ...] [order by ...] limit n offset s;
②举例

在这里插入图片描述

三、修改元素(Update)

1、语法

update 表名 set 列名 =[, column = expr ...] [where ...] [order by ...] [limit ...]

2、举例

在这里插入图片描述

3、注意

  • 修改操作,是针对条件筛选之后,剩下的数据进行修改;
  • 如果没写条件,则针对所有行都进行修改;

四、删除元素(Delete)

1、语法

 -- 删除如何条件的行
delete from 表名 where 条件;
 -- 删除表中的记录,全删了
delete from 表名;

2、举例

在这里插入图片描述

3、注意

  • delete from 表名; 是清空表的内容;
  • drop table 表名; 是把表也删了;

五、重点总结

  • 新增
-- 单行插入
insert into(字段1, ..., 字段N) values (value1, ..., value N);
-- 多行插入
insert into(字段1, ..., 字段N) values
(value1, ...),
(value2, ...),
(value3, ...);
  • 查询
-- 全列查询
select * from-- 指定列查询
select 字段1,字段2... from-- 查询表达式字段
select 字段1+100,字段2+字段3 from-- 别名
select 字段1 别名1, 字段2 别名2 from-- 去重DISTINCT
select distinct 字段 from-- 排序ORDER BY
select * fromorder by 排序字段
-- 条件查询WHERE:
-- (1)比较运算符 (2)BETWEEN ... AND ... (3)IN (4)IS NULL (5)LIKE (6)AND (7)OR (8)NOT
select * fromwhere 条件
  • 修改
updateset 字段1=value1, 字段2=value2... where 条件
  • 删除
delete fromwhere 条件

MySQL的增删改查(进阶)

一、数据库的约束

数据库可以让程序员定义一些对数据的强制规则,数据库会在插入/修改数据的时候按照这些规则对数据进行校验,如果校验不通过,就直接报错。

约束的本质是让我们及时发现数据中的错误,更好的保证数据的正确性!

1、约束类型

  • NOT NULL - 指示某列不能存储 NULL 值。
  • UNIQUE - 保证某列的每行必须有唯一的值。
  • DEFAULT - 规定没有给列赋值时的默认值。
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。

2、NOT NULL:非空约束

①语法
字段名 数据类型 NOT NULL;
②举例

初始情况下,一个表允许为NULL。
在这里插入图片描述
加上 NOT NULL 约束后,就不允许插入空值。
在这里插入图片描述

3、UNIQUE:唯一约束

①语法
字段名 数据类型 UNIQUE;
②举例

初始情况下,表中数据允许重复出现。
在这里插入图片描述
加上 UNIQUE 约束后,表中字段的值不能重复出现。
在这里插入图片描述

4、DEFAULT:默认值约束

①语法
字段名 数据类型 DEFAULT 默认值;
②举例

默认的默认值是 NULL,可以通过 default 约束来修改默认值的取值。
对表进行指定列插入的时候,会涉及到默认值;
在这里插入图片描述
加上 UNIQUE 约束后,就可以修改默认值。
在这里插入图片描述

5、PRIMARY KEY:主键约束

①语法
字段名 数据类型 primary key;
-- 自增主键
字段名 数据类型 primary key auto_increment

主键表示一条记录的 身份标识,是用来区分这条记录和别的记录的:

  • 不能为空;
  • 不能重复;
  • 主键唯一;

MySQL 为了方便大家填写主键,内置了一个功能,“自增主键”,帮助我们自动生成主键的值。
自增主键

  • 从 1 开始依次进行累加;
  • 如果写的是具体数值,就是手动指定;如果写的是 null,就是让 MySQL 按照自增规则自动生成。
  • MySQL 记录当前 自增主键 列里的最大值,在最大值的基础上依次自增;

扩展
如果数据库是分布式部署的,自增主键就要带来问题;
解决思路:分布式唯一 id 生成算法
唯一 id = 时间戳(ms)+ 机房编号/主机编号 + 随机因子(字符串拼接)

②举例

在这里插入图片描述
自增主键
在这里插入图片描述

6、FOREIGN KEY:外键约束

①语法

外键用于关联其他表的主键唯一键

foreign key (字段名) references 主表(列)
②举例
  1. 创建班级表 classclassId为主键;
  2. 创建学生表 student,一个学生对应一个班级,一个班级对应多个学生。使用 studentId 为主键,classId 为外键,关联班级表 classId;此时,班级表为 父表,学生表为 子表
    在这里插入图片描述
  3. 父表 为空的情况下,直接往 子表 插入,就会报错!
    在这里插入图片描述
  4. 在外键约束下,每次插入/修改操作,都会先触发在 父表 中的查询,存在才能插入/修改成功!
    在这里插入图片描述
  5. 子表 对于 父表 的限制是不能随意修改/删除
    在这里插入图片描述

7、CHECK 约束(了解即可)

①语法
 check (条件)
②举例
create table test_user (
   id int,
   name varchar(20),
   sex varchar(1),
   check (sex ='男' or sex='女')
);

二、表的设计

根据一些实际的业务场景,来设计表,主要是确定有几个表,每个表的作用是什么,每个表有哪些字段;

  1. 明确需求场景
    提取出需求中的 “实体”,实体可以认为是 “关键性的名词”;
  2. 除了实体之外,还需要理清楚,实体和实体之间的关系
    ①一对一;②一对多;③多对多;④没关系。

1、三大范式

①一对一

一个同学只能有一个账号,一个账户只能分配给一个同学;

方法1:把学生和账号,直接放到一个表里!(下策)

student(id,name,account,password...)

方法2:把学生和账号各自放到一个表里,使用一额外 id 来关联!

-- 1
student(studentid,name,accountid)
account(accountid,password)
-- 2
student(studentid,name)
account(accountid,password,studentid)
②一对多

一个同学只能属于一个班级,一个班级可以包含多个同学;

方法1

student(id,name)
--      1   张三
--      2   李四
--      3   王五
class(classid,className,studentList)
--      1      mysql101      1,2
--      2      mysql102       3

由于 MySQL 中没有 “数组” 这样的类型,所以方法1 是无法实现的。

方法2

class(classid,className)
--      1      mysql101
--      2      mysql102
student(id,name,classid)
--      1   张三    1
--      2   李四    1
--      3   王五    2
③多对多

一个同学可以选择多门课程,一个课程可以包含多个同学;

一般是 采用一个中间表,来表示多对多的关系!

student(studentid,name)
--         1      张三
--         2      李四
--         3      王五
course(courseid,courseName)
--         1      语文
--         2      数学
--         3      英语
student_course(studentid,courseid)
--                 1         1          张三选了语文
--                 1         2          张三选了数学
--                 2         1          李四选了语文

三、新增

1、语法

插入查询结果
先执行查询操作,查询出来的结果,插入到另外一个表里。

  • 保证查询结果的临时表的列和要插入的表的列得匹配!!
insert into 表名 select 列名 from 表名;

2、举例

在这里插入图片描述

四、查询

1、聚合查询

  • 表达式查询:把列和列之间进行一些运算处理;
  • 聚合查询:把行和行进行这样的运算处理;
①聚合函数

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的 数量
SUM([DISTINCT] expr)返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的 最小值,不是数字没有意义

原表:
在这里插入图片描述

Ⅰ.count 函数

在这里插入图片描述

  • count(*) 把 NULL 值也记录到行数当中了;
  • count(指定列) 对于 NULL 不会计数;
  • count(指定列),count 后不能有空格;
Ⅱ.sum 函数

在这里插入图片描述

  • 可以指定查询条件,对于带有条件的聚合查询,会先按照条件筛选,然后再进行聚合;
    在这里插入图片描述
  • 求和操作一定要是数字
    在这里插入图片描述
Ⅲ.avg 函数

在这里插入图片描述

  • 计算平均分时,不计算 NULL 值!!!
Ⅳ.max 函数

在这里插入图片描述

Ⅴ.min 函数

在这里插入图片描述

②GROUP BY子句:分组查询
Ⅰ语法

select 中使用 group by 子句可以对指定列进行分组查询。

select1, sum(2), ... from 表名 group by1,3;
Ⅱ举例

在这里插入图片描述

  • 分组规则,是把记录的值相同的行分为一组;
③HAVING

在进行聚合查询的时候,也能指定条件筛选:

  1. 在聚合之前,进行筛选,针对筛选后的结果,再聚合;(where 子句)
  2. 在聚合之后,进行筛选;(having 子句)

group by 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 where 语句,而需要用 having;

select1, sum(2), ... from 表名 group by1,3 having 条件;

2、联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积。

单纯的笛卡尔积,里边包含了大量的无效数据,指定了合理的过滤条件,把有效的数据筛选出来,得到一个有用的数据表。

这个过程,称为 “联合查询”,筛选的条件称为 “连接条件”。

多表查询的一般步骤

  1. 先根据需求理清楚想要的数据都在哪些表中;
  2. 【核心操作】先针对多个表进行笛卡尔积;
  3. 根据连接条件,筛选出合法数据,过滤掉非法数据;
  4. 进一步增加条件,根据需求做更精细的筛选;
  5. 去掉不必要的列,保留最关注的信息;
①内连接
Ⅰ语法
select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 and 其他条件;
select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;
Ⅱ举例

测试数据:

drop table if exists classes;
drop table if exists student;
drop table if exists course;
drop table if exists score;

create table classes (id int primary key auto_increment, name varchar(20), `desc` varchar(100));

create table student (id int primary key auto_increment, sn varchar(20), name varchar(20), qq_mail varchar(20), classes_id int);

create table course (id int primary key auto_increment, name varchar(20));

create table score (score decimal(3,1), student_id int, course_id int);

insert into classes(name, `desc`) values
('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),
('中文系2019级3班','学习了中国传统文学'),
('自动化2019级5班','学习了机械自动化');

insert into student(sn, name, qq_mail, classes_id) values
('09982','黑旋风李逵','xuanfeng@qq.com',1),
('00835','菩提老祖',null,1),
('00391','白素贞',null,1),
('00031','许仙','xuxian@qq.com',1),
('00054','不想毕业',null,1),
('51234','好好说话','say@qq.com',2),
('83223','tellme',null,2),
('09527','老外学中文','foreigner@qq.com',2);

insert into course(name) values
('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');

insert into score(score, student_id, course_id) values
-- 黑旋风李逵
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
-- 菩提老祖
(60, 2, 1),(59.5, 2, 5),
-- 白素贞
(33, 3, 1),(68, 3, 3),(99, 3, 5),
-- 许仙
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
-- 不想毕业
(81, 5, 1),(37, 5, 5),
-- 好好说话
(56, 6, 2),(43, 6, 4),(79, 6, 6),
-- tellme
(80, 7, 2),(92, 7, 6);

(1)查询“许仙”同学的 成绩

select stu.name,sco.course_id,sco.score from student stu inner join score sco on stu.id=sco.student_id and stu.name='许仙';
-- 或者
select stu.name,sco.course_id,sco.score from student stu, score sco where stu.id=sco.student_id and stu.name='许 仙';

(2)查询所有同学的总成绩,及同学的个人信息

select stu.name,sum(sco.score) from student stu, score sco where stu.id=sco.student_id group by id;

(3)查询所有同学的成绩,及同学的个人信息

select stu.name, cou.name, sco.score from student stu, course cou, score sco where stu.id = sco.student_id and cou.id = sco.course_id;
②外连接

外连接分为左外连接和右外连接。

如果联合查询,

  • 左侧的表完全显示我们就说是左外连接;
  • 右侧的表完全显示我们就说是右外连接。
Ⅰ语法
-- 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段名 from 表名1 right join 表名2 on 连接条件;
Ⅱ举例

测试数据1:所连接的表一一对应

drop table if exists student;
drop table if exists score;

create table student (id int, name varchar(20));

create table score (id int, score int);

insert into student values (1, '张三'), (2,'李四'), (3,'王五');

insert into score values (1, 90), (2, 80), (3, 70);

-- 内连接
select name, score from student join score on student.id = score.id;
-- 左外连接
select name, score from student left join score on student.id = score.id;
-- 右外连接
select name, score from student right join score on student.id = score.id;
  1. 内连接:
    在这里插入图片描述
  2. 外连接:
    在这里插入图片描述
    测试数据2:所连接的表没有一一对应
drop table if exists student;
drop table if exists score;

create table student (id int, name varchar(20));

create table score (id int, score int);

insert into student values (1, '张三'), (2,'李四'), (3,'王五');

insert into score values (1, 90), (2, 80), (4, 70);

-- 内连接
select name, score from student join score on student.id = score.id;
-- 左外连接
select name, score from student left join score on student.id = score.id;
-- 右外连接
select name, score from student right join score on student.id = score.id;
  1. 内连接:
    在这里插入图片描述
  2. 外连接:
    在这里插入图片描述
③自连接

自连接是指在同一张表连接自身进行查询。

一般很少会用到自连接,属于是特殊问题下的特定解决方案;

Ⅰ语法
select 列名 from 表名 as 别名1, 表名 as 别名2 where 条件;
Ⅱ举例

测试数据采用内连接时的数据:
(1)哪个同学的课程1成绩比课程3高;

select s1.student_id from score as s1, score as s2 where s1.student_id = s2.student_id and s1.course_id = 3 and s2.course_id = 1 and s1.score > s2.score;

在这里插入图片描述

④子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询;

Ⅰ单行子查询

单行子查询:返回一行记录的子查询。

查询与“不想毕业” 同学的同班同学:

select name from student where classes_id = (select classes_id from student where name = '不想毕业');

在这里插入图片描述

Ⅱ多行子查询

多行子查询:返回多行记录的子查询。

查询“语文”或“英文”课程的成绩信息:

⒈[NOT] IN
select * from score where course_id in (select id from course where name =  '语文' or name = '英文');

在这里插入图片描述

⒉[NOT] EXISTS
select * from score where exists (select score.student_id from course where (name='语文' or name='英文') and course.id = score.course_id);

在这里插入图片描述

⑤合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用 UNION 和 UNION ALL 时,前后查询的结果集中,字段需要一致。

Ⅰunion

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

(1)查询id小于3,或者名字为“英文”的课程

select * from course where id < 3 union  select * from course where name = '英文';

在这里插入图片描述

Ⅱunion all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会自动去掉结果集中的重复行。

(1)查询id小于3,或者名字为“Java”的课程

select * from course where id < 3 union all select * from course where name = 'Java';

在这里插入图片描述

MySQL索引事务

一、索引

1、概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。

2、作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  • 索引对于提高数据库的性能有很大的帮助。

3、使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。
  • 索引会占用额外的磁盘空间。

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。

反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

4、使用

①查看索引
  • 一个表的 主键 列会自动带上索引!
  • unique 以及 外键约束 的列,也会自动带上索引!
show index from 表名;
②创建索引
create index 索引名 on 表名(字段名);
①删除索引
drop index 索引名 on 表名;

二、事务

1、为什么使用事务

准备测试表:

drop table if exists accout;
create table accout(
 id int primary key auto_increment,
 name varchar(20) comment '账户名称',
 money decimal(11,2) comment '金额'
);
insert into accout(name, money) values
('阿里巴巴', 5000),
('四十大盗', 1000);

比如说:四十大盗偷了2000元

-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';

假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是四十大盗的账户上就没有了增加的金额。

解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。

2、概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

3、使用

(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;

说明:rollback即是全部失败,commit即是全部成功。

start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;

4、基本特性

  • 原子性:最核心的特性;
  • 一致性:一致数据是对的;
  • 持久性:(存储在磁盘上)事务进行的操作都会写磁盘,只要事务执行成功,造成的修改,就是持久化的保存了,哪怕重启主机,这样的改变也仍然存在。
  • 隔离性:描述多个事务并发执行的时候,所产生的情况;

总结

MySQL基础部分东西还是挺多的,不过都很简单,敲了2w字,总算是结束了,还蛮有成就感的,加油加油!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WE-ubytt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值