MySQL基础语法
创始人
2024-02-13 08:36:53
0

MySQL基础语法

  • DDL
    • 数据库操作
      • 查询数据库
      • 创建数据库
      • 修改数据库字符集
      • 删除数据库(谨慎操作!!!)
      • 切换数据库
    • 数据表操作
      • 创建数据表
      • 查询数据表
      • 查询表结构
      • 删除数据表
      • 修改数据表
      • 字段约束
  • DML
    • 增:
    • 删:
    • 改:
  • DQL
    • 查:
    • 区间查询
    • 模糊查询 like
    • 聚合、日期、字符串 函数
    • 排序 order by
    • 分组 group by
    • 分页查询 limit
    • 连接查询
      • inner join 内连接
      • left join 左连接
      • right join 右连接
    • 子查询
  • DCL
    • 事务包括4个特性?
    • 事务和事务之间的隔离级别有哪些呢? 4个级别
    • 数据库设计三范式
    • 数据库设计范式共有?

DDL

Data Definition Language 数据定义语言

  • 用于完成对数据库对象(数据库、数据表、视图、索引等)的增删改操作

数据库操作

dbName 数据库名

查询数据库

## 显示当前mysql中的数据库列表
show databases;## 显示指定名称的数据的创建的SQL指令
show create database 数据库名;

创建数据库

## 创建数据库 
create database ;## 创建数据库,当指定名称的数据库不存在时执行创建
create database if not exists ;## 在创建数据库的同时指定数据库的字符集
## 字符集:数据存储在数据库中采用的编码格式 (utf8  gbk)
create database  character set utf8;

修改数据库字符集

## 修改数据库的字符集
alter database  character set utf8;  # utf8  gbk

删除数据库(谨慎操作!!!)

## 删除数据库
drop database ;## 如果数据库存在则删除数据库
drop database is exists ;

切换数据库

use 

数据表操作

tableName 数据表

创建数据表

   名字+类型+类型+范围+约束(int没有范围)
create table students(stu_num char(8) not null unique,stu_name varchar(20) not null,stu_gender char(2) not null,stu_age int not null,stu_tel char(11) not null unique,stu_qq varchar(11) unique
);

查询数据表

show tables;

查询表结构

desc ;

删除数据表

## 删除数据表
drop table ;## 当数据表存在时删除数据表
drop table if  exists ;

修改数据表

## 修改表名
alter table  rename to ;## 添加列(字段)
alter table  add  varchar(200);## 只修改列(字段)类型
alter table  modify  ;

字段约束

  • 非空约束:not null
  • 唯一约束:unique
  • 主键约束:primaty key
  • 外键约束:foreign key
  • 自动增长:auto_increment
create table classes(class_id int primary key auto_increment,class_name varchar(40) not null unique,class_remark varchar(200)
);
create table students(stu_num char(8) primary key,stu_name varchar(20) not null,stu_gender char(2) not null,stu_age int not null,cid int,##设置 级联修改 和 级联删除constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id) ON UPDATE CASCADE ON DELETE CASCADE
);

DML

Data Manipulation Language 数据操作/操纵语言

  • 用于完成对数据表中的数据的增删改操作

增:

insert into (columnName,columnName....) values(value1,value2....);## 向数据表中指定的列添加数据(不允许为空的列必须提供数据)
insert into stus(stu_num,stu_name,stu_gender) 
values('20210101','张三','男');

删:

delete from  [where conditions];## 删除学号为20210102的学生信息
delete from stus where stu_num='20210102';

改:

update  set columnName=value [where conditions]## 将学号为20210105的学生姓名修改为“孙七”(只修改一列)
update stus set stu_name='孙七' where stu_num='20210105';## 如果update语句没有where子句,则表示修改当前表中所有行(记录)
update stus set stu_name='Tom';

DQL

Data Query Language 数据查询语言

  • 用于完成对数据表中的数据的查询操作

查:

##查询所有
select * from user;

区间查询

between a and b [a,b]

and 并且 or 或者 not 取反

select * from user where sage between 10 and 20;

模糊查询 like

  • %表示任意多个字符 【%o% 包含字母o】
  • _表示任意一个字符 【_o% 第二个字母为o】

示例

# 查询学生姓名中第二个字母为o的学生信息
select * from stus where stu_name like '_o%';

as 取别名 distinct 消除重复行

select distinct stu_age as 年龄 from stus;

聚合、日期、字符串 函数

  • count ( ) 统计
  • max ( ) 最大值
  • min ( ) 最小值
  • sum ( ) 求和
  • avg ( ) 求平均值
  • now ( ) / sysdate ( ) 系统当前时间
  • concat (name,‘_’,gender ) 拼接
  • upper ( ) 全大写
  • lower ( ) 全小写
  • substring ( ) 截取

排序 order by

  • asc 升序(默认)
  • desc 降序
## 查询年龄 >15岁的所有学生信息,并按性别升序 年龄降序排序
select * from stus where stu_age>15 order by stu_gender asc,stu_age desc;

分组 group by

语句执行顺序:

1、where条件:限制从数据库中查询的记录

2、group by对查询记录进行分组

3、having:对(分组后)的数据进行筛选

4、最后order by

# 查询性别为'男'的学生,按年龄进行分组,然后分别统计每组的人数,再筛选当前组人数>1的组,再按年龄升序显示出来select sage,count(snum) from stus where sgender='男' group by sage
having count(snum)>1 order by sage;

分页查询 limit

select …
from …
where …
limit param1,param2

select * from from where limit 1,2;

连接查询

inner join 内连接

笛卡尔积 :总数=A*B

select ... from tableName1 inner join tableName2;
-- 使用where设置过滤条件:先生成笛卡尔积再从笛卡尔积中过滤数据(效率很低)
select * from students INNER JOIN classes where students.cid = classes.class_id;-- 使用ON设置连接查询条件:先判断连接条件是否成立,如果成立两张表的数据进行组合生成一条结果记录
select * from students INNER JOIN classes ON students.cid = classes.class_id;

left join 左连接

显示左表中的所有数据,如果在有右表中存在与左表记录满足匹配条件的数据,则进行匹配;如果右表中不存在匹配数据,则显示为Null

-- 左连接 : 显示左表中的所有记录
select * from students LEFT JOIN classes ON students.cid = classes.class_id;

right join 右连接

-- 右连接 :显示右表中的所有记录
select * from students RIGHT JOIN classes ON students.cid = classes.class_id;

子查询

单列单行用 = / != 单列多行用 in / not in

select * from students where cid = (select class_id from classes where class_name='Java2105');

DCL

Data Control Language 数据控制语言

  • 用于完成事务管理等控制性操作
    什么是事务?
    一个事务其实就是一个完整的业务逻辑。
    是一个最小的工作单元。不可再分。

什么是一个完整的业务逻辑?
假设转账,从A账户向B账户中转账1000 .
将A账户的钱减去1000 ( update语句)
将B账户的钱加上1000( update语句)
这就是一个完整的业务逻辑。

以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再
这两个update语句要求必须同时成功或者同时失败,这样才能保证钱是正确的

只有DML语句才会有事务这一说,其它语句和事务无关!!!
insert
delete
update
只有以上的三个语句和事务有关系,其它都没有关系。

因为只有以上的三个语句是数据库表中数据进行增、删、改的。
只要你的操作一旦涉及到数据的增、删、改,那么就一定要考虑安全问题。
数据安全第一位!!!

假设所有的业务,只要一条DML语句就能完成,还有必要存在事务机制吗?
正是因为做某件事的时候,需要多条DM语句共同联合起来才能完成,
所以需要事务的存在。如果任何一件复杂的事儿都能一条DM语句搞定,那么事务则没有存在的价值了。

到底什么是事务呢?
说到底,说到本质上,一个事务其实就是多条DML语句同时成功,或者同时失败!
事务:就是批量的DML语句同时成功,或者同时失败!

事务是怎么做到多条DML语句同时成功和同时失败的呢?

InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

事务开启了:
insert
insert
insert
delete
update
update
update
事务结束了!

在事务的执行过程中,每一条DML的操作都会记录到"事务性活动的日志文件"中。
在事务的执行过程中,我们可以提交事务,也可以回滚事务。

提交事务?
清空事务性活动的日志文件,将数据全部彻底持久化到数据表中。
提交事务标志着,事务的结束。并且是一种全部成功的结束。

回滚事务?
将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
回滚事务标志着,事务的结束。并且是一种全部失败的结束。

怎么提交事务,怎么回滚事务?

  • 提交事务:commit;语句
  • 回滚事务:rollback;语句

(回滚永远都是只能回滚到上一次的提交点!)
事务对应的英语单词是: transaction

测试一下,在mysql当中默认的事务行为是怎徉的?
mysql默认情况下是支持自动提交事务的。(自动提交)

什么是自动提交?
每执行一条DML语句,则提交一次!

这种自动提交实际上是不符合我们的开发习惯,因为一个业务通常是需要多条DML语句共同执行才能完成的,为了保证数据的安全,必须要求同时成功之后再提交,所以不能执行一条就提交一条。

怎么将mysql的自动提交机制关闭掉呢?
先执行这个命令:start transaction;

事务包括4个特性?

  • A:原子性

    说明事务是最小的工作单元。不可再分。

  • c:一致性

    所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,以保证数据的一致性。

  • I:隔离性

    A事务和B事务之间具有一定的隔离。
    教室A和教室B之间有一道墙,这道墙就是隔离性。
    A事务在操作一张表的时候,另一个事务B也操作这张表会那样???

  • D:持久性

    事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上

重点研究一下事务的隔离性!!!
A教室和B教室中间有一道墙,这道墙可以很厚,也可以很薄。这就是事务的隔离级别这道墙越厚,表示隔离级别就越高。

事务和事务之间的隔离级别有哪些呢? 4个级别

  • 读未提交:

read uncommitted(最低的隔离级别)《没有提交就读到了》
什么是读未提交?
事务A可以读取到事务B未提交的数据。
这种隔离级别存在的问题就是:
脏读现象!(Dirty Read)我们称读到了脏数据。
这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二档起步!

  • 读已提交

: read conmitted《提交之后才能读到》
什么是读已提交?
事务A只能读取到事务B提交之后的数据。
这种隔离级别解决了什么问题?
解决了脏读的现象。
这种隔离级别存在什么问题?
不可重复读取数据。
什么是不可重复读取数据呢?
在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4称为不可重复读取。

这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。oracle数据库默认的隔离级别是:read committed

  • 可重复读:

repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》
什么是可重复读取?
事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读
可重复读解决了什么问题?
解决了不可重复读取数据。
可重复读存在的问题是什么?
可以会出现幻影读。每一次读取到的数据都是幻象。不够真实!
早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样!读到的是假象。不够绝对的真实。

mysql中默认的事务隔离级别就是这个!! ! ! ! ! ! ! ! ! !

  • 序列化/串行化

: serializable(最高的隔离级别)
这是最高隔离级别,效率最低。解决了所有的问题。
这种隔离级别表示事务排队,不能并发!
synchronized,线程同步(事务同步)
每一次读取到的数据都是最真实的,并且效率是最低的。

数据库设计三范式

什么是数据库设计范式?
数据库表的设计依据。教你怎么进行数据库表的设计。

数据库设计范式共有?

3个
第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要生部分依赖。
第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。

声明:三范式是面试官经常问的,所以一定要熟记在心!
设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...