mysql学习

MYSQL

数据库

网络数据库、层级数据库、关系数据库

数据库的另外一种区分方式:基于存储介质
存储介质:磁盘和内存
关系型数据库:存储在磁盘中
非关系型数据库:存储在内存中

关系数据库

建立在关系模型基础上的数据库表
关系模型:关系数据结构、关系操作集合、关系完整性约束

关系数据结构

指的数据以什么方式来存储,是一种二维表的形式存储
本质:二维表

关系操作集合

如何关联和管理对应的存储数据,SQL指令

关系完整性约束

数据内部有对应的关联关系,以及数据与数据之间也有对应的关联关系
表内约束:对应的具体列只能放对应的数据
表间约束:自然界各实体都是有着对应的关联关系

典型关系型数据库

oracle,DB2,Microsoft SQL Server,Microsoft Access,MySql,SQLite

Microsoft Access,SQLite:小型关系型数据库
SQLsever,mysql:中型关系型数据库
oracle,DB2:大型关系型数据库

SQL

结构化查询语言,专门为关系型数据库设计的

分类

1.数据查询语言(DQL)
用以从表中获得数据,确定数据怎样在应用程序给出。保留字select是DQL用的最多的词,其他
保留字还有where,order by,group by,having.
专门用于查询数据

2.数据操作语言(DML)
其语句包括insert,update,delete分别用于添加,修改和删除表中的行,也成为动作查询语言
专门用于写数据

3.事务处理语言(TPL)
其语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括begin,transaction,commit
和rollback
专门用于事务安全处理,但不是所有的关系型数据库都提供事务安全处理

4.数据控制语言(DCL)
语句通过grant或revoke获得许可,确定单个用户和用户组对数据库对象的访问,某些rabms可用
grant或revoke控制对表单个列的访问
专门用于权限管理

5.数据定义语言(DDL)
语句包括create和drop,在数据中创建新表或删除表(create table或drop table),为表加入索引等
DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分
专门用于结构管理

mysql基本介绍

mysql启动或停止

mysql是一种c/s结构,客户端和服务端
服务端对应的软件:mysqld.exe

1.命令行模式
通过cmd来开启
net start 服务(mysql)
net stop mysql

2.系统服务的方式
services.msc

登录和退出mysql

通过客户端(mysql.exe)与服务器进行连接认证,通常客户端与服务端不在一个电脑上
1.登录
mysql -h:[IP地址/域名]
2.输入mysql服务器监听的端口 -P:3306
3.输入用户名 -u:username
5.输入密码 -p:password
mysql -h 主机地址 -P 端口 -u 用户名 -p 密码

若在本机启动 mysql -u root -p 即可

2.退出
exit; //
\q; //
quit; //

mysql服务端的架构

mysql服务端架构有以下几层构成
1.数据库管理系统(最外层) dbms 专门管理服务器端的所有内容
2.数据库(第二层) db 专门用来存储数据的仓库,不止一个
3.二维数据表(第三层) table 专门用于存储具体实体的数据
4.字段(第四层) field 具体存储某种类型的数据(实际存储单元)

数据库中常用的关键字:
1.row 行
2.column 列(field)

mysql数据库操作

数据库是数据存储的最外层(最大单元)

创建数据库

基本语法:
create database 数据库名 [库选项];
库选项:数据库的相关属性
字符集:cahrset 字符集 //代表着当前数据库下所有表存储的数据默认指定的字符集(如果当前不指定,那么采用dbms默认)
校对集:collate 校对集

create database 数据库名 charset gbk;

显示数据库

每当用户通过sql指令创建一个数据库,那么系统就会产生一个对应的存储文件夹

显示全部数据库

基本语法: show databases;
infomation_schema 保存数据库所有的结构

显示部分

基本语法: show databases like ‘匹配模式’;
_:匹配当前位置单个字符
%:匹配指定位置多个字符

例子: 获取以my开头的全部数据库 ‘my%’;
获取以m开头,后面第一个字母不确定,最后为databases的全部数据库 ‘my_databases’;
获取以databases结尾的数据库 ‘%’;

显示数据库创建语句

基本语法: show create database 数据库名字;
看到的指令为系统加工过的指令

选择数据库

因为数据存储到数据表,表存在数据库下,如果要操作数据,必须进入
基本语法: use 数据库名字;

修改数据库

修改数据字符集(库选项),字符集和校对集
基本语法: alter database 数据库名字 charset=字符集;

删除数据库

基本语法: drop database 数据库名字;
要做好安全操作,确保库里的数据可删

数据表操作

创建数据表

1.普通创建表

基本语法: create table 表名(字段名 字段类型 [字段属性],字段名 字段类型 [字段属性], …) [表选项];
需要先选择数据库再进行数据表操作
两种方式将表放到指定库下
1.再在数据表名前加上数据库名 数据库.数据表
2.在创建数据表之前先进入数据库 use 数据库;

表选项,与数据库选项类似
engine:存储引擎,Mysql提供的具体存储数据的方式,默认为innodb
charset:字符集,只对当前自己表有效(级别比数据库高)
collate:校对集,只对当前自己有效

2.复制已有表结构

从已经存在的表复制一份(只复制结构,如果表中有数据不复制)
基本语法: create table 新表名 like 数据库.表名; //只要使用 数据库.表明 ,就可以在任何数据库下方访问其他数据的表名

2.显示数据表

每当一张数据表创建,那么就会在对应的数据库创建一些文件

1.显示所有表

基本语法: show tables;

2.匹配显示表

基本语法: show tables like ‘匹配模式’;

3.显示表结构

显示表中所包含的字段信息(名字,类型,属性等)
describe 表名;
desc 表名;
show columns from 表名;

4.显示表创建语句

基本语法: show create table 表名;

mysql中有多种语句结束符
; \g \G
; 与 \g 所表示的效果是一样的,都是字段在上派,数据在下面
\G 则是字段在左侧,数据在右侧

3.设置表属性

表属性就是表选项:egine,charset和collate
基本语法:alter table 表名 表选项 [=] 值;
<注>如果数据库已经确定,有很多数据,不要轻易修改表选项

4.修改表结构

1.修改表名:rename table 表名 to 新表名;

2.修改表选项:alter table 表名 表选项 [=] 值;

3.新增字段:alter table 表名 add [column] 新字段名 列类型 [列属性] [位置 first/after 字段名];
字段位置选项:选择加入的字段在表中的位置

4.修改字段名:alter table 表名 change 旧字段名 新字段名 字段类型 [列属性] [新位置];
5.修改字段类型(属性):alter table 表名 modify 字段名 新类型 [新属性] [新位置];
6.删除字段:alter table 表名 drop 字段名;

5.删除表结构

基本语法:drop table 表名[,表名2…]; 可以同时删除多个数据表

数据基础操作

1.插入操作

1.基本语法:

insert into 表名 (字段列表) values (对应字段列表);
<注>
1.后面values中对应的值列表只需要与前面的字段列表对应即可,不需要与表的结构一致
2.字段列表并不一定非要有表中所有字段

2.基本语法:向表中所有字段插入数据

insert into 表名 values (对应表结构)

2.查询操作

1.查询表中全部数据
select * from 表名; //*表示匹配所有字段

2.查询表中部分字段
select 字段列表 from 表名 //字段列表使用’,'隔开

3.简单条件查询
select 字段列表/* from 表名 where 字段名 = 值;

3.删除操作

delete from 表名 [where 条件];

4.更新操作

update 表名 set 字段名=新值 [where 条件];

字符集

字符集编码概念

字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等
字符编码是计算机针对各种符号,在计算机中的一种二进制存储代码

设置客户端所有字符集

快捷方式 set names 字符集;

1.mysql客户端在进行数据操作之前将自己所使用的字符集告诉mysqld
2.cmd下mysql默认的只有一个字符集gbk
3.通过set names 字符集;来告诉mysqld要使用的字符集
4.再进行插入数据

Mysql与mysqld之间处理的关系一共分为三层
客户端传入数据给服务端:client character_set_client
服务端返回数据给客户端:server character_set_results
客户端与服务端之间的连接:collection character_set_collection

set names 字符集的本质:就是一次性打通三层关系的字符集
在系统中有三个变量来记录着这三个关系对应的字符集:show variable like ‘character_set_%’;

修改服务器端变量的值
set 变量名=值;

列类型(字段类型)

整数类型

mysql默认为整数增加负数

1.Tinyint

迷你整形:系统采用一个字节来保存的整数;一个字节=8位,最大能表示的数值是0~255

2.smallint

小整形:系统采用两个字节来保存的整形,能表示0~65535之间

3.mediumint

中整形:采用三个字节来保存数据

4.int

整形:采用四个字节来保存数据

5.bigint

大整形:采用八个字节来保存数据

无符号标识设定

无符号数——正数
基本语法:在类型之后加上unsigned

显示长度

指数据(整形)在数据显示的时候,到底可以显示多长位
显示长度只是代表了数据是否可以达到指定的长度,但是不会自动满足到指定长度,如果想要数据显示的时候,保持最高位
(显示长度),那么还需要给字段增加一个zerofill属性

zerofill一定会绑定unsigned,zerofill从左侧开始填充0,负数不能使用zerofill
显示长度可以自己设定,超出设置的长度(但不超出范围)不会被影响,没有达到的会补齐

小数类型

在mysql中将小数又分为两类:浮点型和定点型
浮点型之所以可以存储较大的数值,原因就是存储数据的位来存储指数

1.浮点型

浮点型又称为精度类型,是一种有可能丢失精度的数据类型,数据有可能不那么准确(由其是在超出范围的时候)

1.float

float又称之为单精度类型,系统提供4个字节来存储数据,但是能表示的数据范围比整数大的多,大概是10^38,只能保证大概
7个左右的精度
基本语法
float; //表示不指定小数位的浮点数
float(M,D); //表示一共存储M个有效数字,其中小数部分占D位

2.double

double又称之为双精度类型,系统提供8个字节来存储数据,但是能表示的数据范围比整数大的多,大概是10^308,只能保证大概
15个左右的精度

用户不能插入数据直接超过指定的整数部分长度,但是如果系统自动进位导致的,系统可以承担

2.定点数

能够保证数据精确的小数类型

decimal 定点数:系统自动根据存储的数据来分配存储空间,没大概9个数就会分配四个字节来存储,同时小数和整数部分时
分开的

基本语法:
decimal(M,D); M是总长度,最大值不超过65,D代表小数部分长度,最长不过30
定点数如果整数部分超出长度会报错,小数会自动四舍五入

时间日期类型

1.date

日期类型:系统使用3个字节来存储数据,对应格式:yyyy-mm-dd,能表示的范围1000-01-01到9999-12-12,初始值为0000-00-00

2.time

时间类型:能够表示某个指定的时间,但是同样是提供3个字节存储,对应的格式HH:ii:SS,但是MySQL中的time类型能够表示时间范围要大得多,
能表示从-838:59:59到838:59:59,在MySQL中具体用来描述时间段
本质是用来表示时间区间,表示范围比较大
在进行时间类型录入的时候(time)还可以使用一个简单的日期代替时间,在时间格式之前加一个空格,然后指定一个数字
(可以为负数),系统会自动将该数字转换成天数*24小时,再加上后面的时间

3.datetime

日期时间类型:就是将前面的date和time合并起来,使用8个字节存储数据 yyyy-mm-dd HH:ii:ss

4.timestamp

时间戳类型:MySQL中的时间戳只是表示从格林威治时间开始,但其格式与datetimexiangto
timestamp当对应的数据被修改时,会自动更新(这个被修改的数据不是自己)老版本有效

5.year

年类型:占用一个字节,能表示1900-2155年,但是year有两种数据插入方式:0-99和四位数具体年
year进行两位数插入时有个区间划分两个临界点69和70
69及以下:匹配20+数字 70及以上:匹配19+数字

字符串

1.char

定长字符型:指定长度后系统会分配 指定的空间用于存储数据
基本语法:
char(L); L代表字符数(中文与英文字母一样) 0到255

2.varchar

变产字符:指定长度后,系统会根据实际存储的数据来计算长度,分配内存,前提是没有超出指定长度
基本语法:
varchar(L); L代表字符数,理论值为0到65535
因为varchar要记录数据长度,所以每个varchar生成后,系统会在数据后面增加1-2个的额外开销

char与varchar的区别
1.char一定会使用指定的空间,varchar是根据数据来计算空间
2.char的数据查询效率比varchar高,varchar是需要通过后面的记录数来计算

如果确定数据占指定长度,那么使用char类型
如果不确定数据到底有多少,使用varchar类型
如果数据长度超过255个字符,不论是否固定长度,都会使用text,不再使用char和varchar

3.text

mysql提供了两种文本类型
text:存储普通的字符文本
blob:存储二进制文本(图片,文件)

text:系统中提供了四种text
tinytext:系统使用一个字节来保存数据所对应的位置,实际存储数据:2^8+1
text:2个字节,实际存储:2^16+2
mediumtext:3个字节,实际存储:2^24+3
longtext:4个字节,实际存储:2^32+4

1.系统会自动选择合适的文本类型
2.在选择字符存储的时候,如果数据超过255个字符,使用text

4.enum

枚举类型:在数据插入之前先设定几个项,这几个项就是可能最终出现的数据结果
基本语法:
enum(数据值1,数据值2,……)
系统提供了1到2个字节来存储,通过计算enum里的具体值来计算实际存储空间 255
enum有规范数据的功能,必须是规定的数据类型
enum存储原理:实际字段上所存储的值并不是字符串,而是字符串对应的下标从1开始
在MySQL中系统是自动进行类型转换的,如果数据碰到算术运算符,系统会将数据变为数值,而普通字符串转换成0

枚举的意义
1.规范数据本身
2.节省存储空间

5.set

集合:将多个数据选项可以同时保存的数据类型,本质是将指定的项按照对应的二进制位来进行控制,1表示选中,0表示未选中

基本语法:set (‘值1’,‘值2’,‘值3’,……);
系统为set提供了多个字节进行保存,但是系统会自动计算来选择具体的存储单元

set和enum一样,最终存储到数据字段中的依然是数字而不是真实的字符串

1个字节,set只有8个选项
2个字节,set只有16个选项
3个字节,set只有32个选项
8个字节,set只有64个选项

数据选项所在的数据与数据插入的顺序无关,最终都会变成选项对应的数据(最开始设计的顺序)

数据在存储时,如果被选中,那么对应的值为1,否则为0将相应的类型转换后,储存的形式是将得到的一个二进制数反过来存储

同样可以通过插入数值来代替插入实际的数据,但数字插入的前提是二进制数对应的位置上有相应的数据

set的意义
1.规范数据
2.节省数据空间

enum:单选框
set:复选框

MySQL记录长度

在MySQL中,有一项规定:mysql的记录长度(record==行 row)总长度不能超过65535个字节
varchar能够存储的理论值为65535个字符,字符在不同的字符集下可能占用多个字节

varchar除了存储的数据本身要占用空间:还需要额外的空间来保存记录长度
utf8最多存储21844字节
gbk最多存储32766字节

列属性

列属性又称之为字段属性,在MySQL中一共有6个属性:null,默认值,列描述,主键。唯一键和自动增长

NULL属性

代表字段为空,如果对应的值为TES表示该字段可以为NULL
注意:在设计表时,尽量不要让数据为空
MySQL的记录长度为65535个字节,如果一个表中有字段允许为NULL,那么系统就后悔设计一个字节来存储NULL,最终有效存储长度为65534个字节

默认值

default:当字段被设计的时候,如果允许默认条件下,用户不进行数据的插入,那么就可以使用事先准备好的数据来填充,通常填充的是NULL
另外一层使用:显示的告知字段使用默认值,在进行数据插入的时候,对字段值直接使用default

列描述

command,专门用于给开发人员进行维护的一个注释
基本语法:command ‘字段描述’;
查看comment 必须通过表格创建语句; show create table 表名

主键

在一张表中,有且只有一个字段,里面的值具有唯一性
主键不能为空
主键可以防止重复的内容出现

创建主键
随表创建

系统提供了两种
1.直接在需要当作主键的字段之后,增加primary key属性来确定主键
2.在所有字段之后 增加primary key选项;primary key(字段信息)

表后增加

基本语法:alter table 表名 add primary key (字段)

查看主键

1.查看表结构
2.查看表的创建语句

删除主键

alter table 表名 drop primary key;
删除后元素仍然不能为空

复合主键

就是给primary key()提供多个参数

主键约束

主键一旦增加,那么对对应的字段有数据要求
1.当前字段对应的数据不能为空
2.当前字段对应的数据不能有任何重复

主键分类

主键分类采用的是主键所对应的字段的业务意义分类
1.业务主键:主键所在的字段,具有业务意义(学生ID,课程ID……)
2.逻辑主键:自然增长的整型(应用广泛)

自动增长

当给定某个字段属性之后 ,该列的数据在没有提供确定的数据的时候,系统会根据之前已经存在的数据进行自动增加后,填充数据
通常用于逻辑主键

原理

1.在系统中有维护一组数据,用来保存当前使用了自动增长属性的字段,记住当前对应的数据值,再给定一个指定的步长
2.当用户进行数据插入的时候,如果没有给定值,系统在原始值上再加上步长变成新的数据
3.自动增长的触发,给定属性的字段没有提供值
4.自动增长只适用于数值

使用

基本语法:在字段之后增加一个属性auto_increment

触发自动增长,不能给定具体值

修改自增长

1.查看自增长:自增长一旦触发使用之后,会自动的再表选项中增加一个选项(一张表最多只能拥有一个自增长)
2.表选项可以修改表结构来改变
alter table 表名 auto_increment=值

删除自增长

删除:在字段属性之后不再保留auto_increment,当用户在修改自增长字段时,如果没有看到auto_increment属性,系统会自动清除该自增长

初始设置

在系统中,有一组变量来维护自增长的初始值和步长
查看初始变量:show variables like ‘auto_increment%’;

细节

1.一张表只有一个自增长
2.如果数据插入中没有触发自增长(给了数据),那么自增长不会表现
3.自增长修改时,只可以较大,但是值不能比当前已有的小

唯一键

unique key 用来保证对应的字段中的数据唯一
主键也可以来保证字段数据唯一性,但一张表只有一个主键,而唯一键可以有多个

特点
1.唯一键在一张表中可以有多个
2.唯一键允许字段数据为null,null可以有多个

创建唯一键

1.直接在表字段之后增加唯一键标识符:unique [key]
2.使用 unique key(字段列表)
3.在创建完表之后增加唯一键
alter table 表名 add unique key (字段列表);

表关系

表与表之间(实体)有什么样的关系,每种关系应该如何设计表结构

一对一

一张表的一条记录与另外一张表中最多有一条明确的关系,此设计方案保证两张表中使用同样的主键

表的使用过程中,常用的信息放一张表,而不常用的信息放一张表

一对多

通常也叫做多对一,通常一对多的设计方案,在"多"关系的列表中去维护一个字段,而这个字段是"一"关系的主键

多对多

一张表的一条记录在另外一张表中可以匹配到多条记录,反过来也一样
通过两张表自己增加字段不能解决,那么就可以增加第三章表来解决
增加一个中间表,让中间表与对应的其他表形成两个多对一的关系,多对一的解决方案是在"多"表中增加"一"表对应的主键字段

高级数据操作

新增数据

多数据插入

只要写一次insert指令,但是可以直接插入多条记录

基本语法:insert into 表名 [(字段列表)] values(值列表),(值列表)……

主键冲突

主键冲突:在有的表中,使用的是业务主键(字段有业务含义),但是往往在进行数据插入的时候,又不确定数据表中是否已经存在对应的主键
主键冲突的解决方案:
1.主键冲突更新
类似插入数据语法,如果插入的过程中主键冲突,那么采用更新方法
insert into 表名 [(字段列表)] values(值列表),(值列表)…… on duplicate key update 字段=新值;

2.主键冲突替换
当主键冲突之后,干掉原来的数据,重新插入进去
replace into 表名 [(字段列表)] values(值列表),(值列表)……;

蠕虫复制

一分为二,成倍增加,从已有的数据中获取数据,并且将获取到的数据插入到数据表中

基本语法:
insert into 表名 [(字段列表)] select */字段列表 from 表;

1.蠕虫复制的确通常是重复数据,没有太大的意义,可以在短期内快速增加表的数据量,从而测试表的压力,还是可以通过大量数据来测试表的效率(索引)
2.蠕虫复制虽好,但是注意主键冲突

更新数据

1.在更新数据的时候,特别要注意,通常一定是跟随条件更新的
update 表名 set 字段名=新值 where 判断条件;

2.如果没有条件是全表更新数据,但是可以使用limit来限制更新的数量
update 表名 set 字段名=新值 [where 判断条件] limit 限制数量;

删除数据

1.删除数据时,尽量不要全部删除,要使用条件判断
2.删除数据时,使用limit限制删除数量

delete删除数据时无法重置auto_increment
mysql有一个能够重置表选项中的自增长的语法
truncate 表名; == drop --> create

查询数据

完整的查询指令
select selec选项 字段列表 from 数据源 where 条件 group by 分组 having 条件 order by 排序 limit 限制;

1.selec选项:系统该如何对待查询得到的结果
	all:默认的,表示保存所有的结果
	distinct:去重,去除重复的记录,只保留一条(所有字段都相同)

2.字段列表
	有的时候需要从多张表获取数据,再获取数据的时候,可能存在不同表中有同名的字段,需要将同名的字段命名为不同名的,别名alias
	基本语法:
		字段名 [as] 别名;
from 数据源

from是为前面的查询提供 数据,数据源只要是一个符合二维表结构的数据即可

单表数据

from 表名

多表数据

from 表1,表2,……
结果:两张表的记录数相乘,字段数拼接
本质:从第一张表取出一条记录,去拼凑第二张表的所有记录,得到的结果为一个笛卡尔记录,应该尽量避免出现笛卡尔记录

动态数据

from后面跟的数据不是一个实体表,而是一个从表中查询得到的二维结果表(子查询)
基本语法
from (select 字段列表 from 表) as 别名

一定要有别名

Where子句

用来从数据表获取数据的时候,然后进行条件筛选

group by子句

group by表示分组的含义,根据指定的字段,将数据进行分组,分组的目的是为了统计
基本语法:group by 字段名

group by是为了分组后数据统计的,如果只是想看数据显示,那么group by没什么含义,group by将数据按照指定的字段分组后,只会保留每组的每一条记录
利用一些统计函数
count():统计每组中的数量,如果统计的目标是字段,那么不统计为空NULL的字段
如果参数为*代表统计记录
avg():求平均值
sum():求和
max():最大值
min():最小值
group_concat():未来将分组中指定的字段进行拼接

多分组

将数据按照某个字段进行分组之后,对已经分组的数据再次分组
基本语法:
group by 字段1,字段2; //先按照字段1进行排序,之后将结果按照字段2进行排序

分组排序

mysql中,分组默认有排序功能,按照分组字段进行排序,默认是升序
基本语法:group by 字段[asc|desc],字段[asc|desc];

回溯统计

当分组进行多分组之后,往上统计的过程中,需要进行层层上报,将这种层层上报统计的过程称之为回溯统计,每一次分组向上统计的过程都会产生一次新的统计数据,而且当前数据的对应字段为NULL
基本语法:group by 字段[asc|desc] with rollup;

Having子句

Having的本质和where一样,是用来进行数据条件筛选
1.Having是在group by子句之后,可以针对分组数据进行统计筛选,但是where不行
where不能使用聚合函数
having在group by 分组之后,可以使用聚合函数或者字段别名(where是从表中取出数据,别名是在数据进入到内存之后才会有的)

<注>having是在group by之后,group by是在where之后,where的时候表示将数据从磁盘拿到内存,where之后的所有操作都是内存操作

order by子句

order by排序,根据校对规则对数据进行排序
基本语法:order by 字段 [asc|desc] //asc 升序(默认)

order by也可以像group by一样进行多字段排序,先按照第一个字段进行排序,然后再按照第二个字段进行排序
基本语法:order by 字段1 [asc|desc],字段2 [asc|desc];

limit子句

limit限制子句,主要用来限制记录数量获取

记录数限制

纯粹的限制获取的数量,从第一条到指定的数量
基本语法:limit 数量;

limit通常在查询的时候如果限定为一条记录的时候,使用的比较多,有时候获取多条记录

分页

利用limit来限制获取指定区间的数据
基本语法:limit offset,length; //offset偏移量(从哪开始),length就是具体获取多少条记录
MySQL中记录的数量从0开始
注意:limit后面的length表示获取对应的数量,但是如果数量不够,系统不会强求

运算符

算术运算符

+、-、*、/、%
基本算数运算,通常不是在条件中使用,而是用于结果运算(select字段中)

比较运算符
 >、>=、<、<=、=、<>
 >通常是用来在条件中进行限定结果
 >=:在MySQL中没有==,就是使用=来进行相等判断
 ><=>:相等比较
 >特殊应用:就是在字段结果中进行算术运算
 >1.在MySQL中,数据会自动的转换成相同类型,再比较
 >2.在MySQL中,没有Bool值,只有0和1

在条件判断的时候,还有对应的比较运算符,计算区间
betwee 条件1 and 条件2;
1.闭区间
2.between中条件1必须小于条件2

逻辑运算符

and or not
and:逻辑与
or:逻辑或
not:逻辑非

in运算符

in:替代=,当结果不是一个值而是一个结果集
基本语法:in (结果1,结果2,结果3,);
只要当前条件在结果集中出现过,返回查询的结果

is运算符

is是专门来判断字段是否为NULL的运算符
基本语法:is null / is not null

like运算符

like:用来进行模糊匹配
基本语法:like ‘匹配模式’;
匹配模式中,有两种占位符
_:匹配对应的单个字符
%:匹配多个字符

联合查询

联合查询是可以合并多个相似的选择查询的结果集,等同于将一个表追加到另一个表,从而实现两个表的查询组合到一起,使用 谓词为union或union all
联合查询,将多个查询的结果合并到一起(纵向合并),字段数不变,多个查询的记录数合并

应用场景

1.将同一张表中不同的结果(需要对应多条查询语句来实现),合并到一起展示数据
2.最常见,在数据量大的情况下,会对表进行分表操作,需要对每张表进行部分数据统计,使用联合查询来将数据存放到一起显示

基本语法

select 语句 union [union选项] select 语句;

union 选项:与select选项基本一样
distinct:去重,去除重复的记录,只保留一条(默认)
all:保留所有的内容

注意:union理论上只要保证字段数一样,不需要每次拿到的数据对应的字段类型一致,永远只保留第一个select语句对应的字段名字

order by的使用

在联合查询中如果要是用order by,那么
1.对应的select语句需要用括号括起来
2.必须使用limit,且limit后面 必须跟对应的限制数量(通常可以使用一个较大的值,大于对应的查询值的数量)

连接查询

将多张表连在一起进行查询(会导致记录数行和字段数列发生改变)

意义

在关系型数据库设计过程中,实体(表)与实体之间是存在很多联系的,在关系型数据库表的设计过程中,遵循着关系来设计,一对一,
一对多和多对多,通常在实际操作的过程中,需要利用这层关系来保证数据的完整性

分类

连接查询一共有以下几点:
交叉连接
内连接
外连接:左外连接(左连接)和右外连接(右连接)
自然连接

交叉连接

交叉连接:将两张表的数据与另外一张表彼此交叉

原理

1.从第一张表依次取出每一条记录
2.取出一条记录之后,与另外一张表的全部记录挨个匹配
3.没有任何匹配条件,所有的结果都会进行保留
4.记录数=第一张表记录数*第二张表记录数;
字段数=第一张表字段数+第二张表字段数(笛卡尔积)

语法

基本语法:表1 cross join 表2;

应用

交叉连接产生的结果是笛卡尔积,没有实际应用

内连接

inner join,从一张表中取出所有的记录去另外一张表中匹配,利用匹配条件进行匹配,成功了则保留,失败了放弃

原理

1.从第一张表中取出一条记录,然后去另外一张表中进行匹配
2.利用匹配条件进行匹配
3.匹配到,保留,继续向下匹配
4.匹配失败,向下继续,如果全表匹配失败,结束

语法

基本语法:表1 [inner] join 表2 on 匹配条件;

1.因为表的设计通常容易产生同名字段,尤其是ID,所以为了避免重名出现错误,通常使用表名.字段名,来确保唯一性
2.通常,如果条件中使用到对应的表名,而表名通常比较长,所以可以通过表别名来简化
3.匹配到,才会保存
4.内连接不强制使用on,所以可以使用where来增加条件,但建议使用on

外连接

外连接:outer join,按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外有一张表,从而得到目标数据
外连接分为:
左外连接(left join):左表是主表
右外连接(right join):右表是主表

原理

1.确定连接主表
2.拿主表的每一条记录,去匹配另外一张表(从表)的每一条记录
3.如果满足匹配条件,保留,不满足不保留
4.如果主表记录在从表中一条都没有匹配成功,那么也要保留该记录,从表对应的字段值都为NULL

语法

基本语法:
左连接:主表 left join 从表 on 连接条件;
右连接:从表 right join 主表 on 连接条件;

特点

1.外连接中主表数据记录一定会保存,连接之后不会出现记录数少于主表
2.左连接和右连接其实可以互相转换

Using关键字

是在连接查询中用来代替对应的on关键字的,进行条件匹配

原理

1.在连接查询时,使用on的地方用using代替
2.使用using的前提是对应的两张表连接的字段是同名(类似自然连接自动匹配)
3.如果使用using关键字,那么对应的同名字段,最终在结果中只会保留一个

语法

基本语法:表1 [inner,left,right] join 表2 using(同名字段列表);//连接字段

子查询

子查询:sub query
子查询是一种常用计算机语言select-sql语言中嵌套查询下的程序模块,当一个查询是另一个查询的条件时,称其为子查询
就是指在一条select语句中,嵌入了另外一条select语句,那么被嵌入的select语句称为子查询语句

主查询

主要的查询对象,取一条select语句,确定的用户所有获取的数据目标(数据源),已经要具体得到的字段信息

两者关系

1.子查询是嵌入到主查询中的
2.子查询是辅助主查询的,要么为条件,要么为数据源
3.子查询其实可以独立存在

子查询分类

按功能分

1.标量子查询:子查询返回的结果是一个数据
2.列子查询:返回的结果是一列
3.行子查询:返回的结果是一行
4.表子查询:返回的结果是多行多列
5.exists子查询:返回的结果1或者0

按位置分

1.where子查询:子查询出现的位置在where条件中
2.from子查询:子查询出现的位置在from中

标量子查询

语法

select * from 数据源 where 条件判断 =/<> (select 字段名 from 数据源 where 条件判断); //子查询的结果只有一个值

列子查询

语法

主查询 where 条件 in (列子查询);

行子查询

行元素

字段元素是指一个字段对应的值,行元素对应的就是多个字段,多个字段合起来作为一个元素参与运算,把这种情况称之为行元素

基本语法

主查询 where 条件[(构造一个行元素)] = (行子查询);

总结

常见的子查询:标量,列,行,都属于where子查询

表子查询

子查询返回的结果是多行多列,表子查询与行子查询非常相似,只是行子查询需要构造行元素,而表子查询没有
行子查询适用于where条件判断
表子查询适用于from数据源

语法

select 字段表 from (表子查询) as 别名 [where] [group by] [having] [order by ] [limit];

exists子查询

返回的结果1或者0,1代表成立

语法

基本语法:where exists(查询语句);
exists就是根据查询得到的结果进行判断:如果存在,那么返回1,否则返回0
where 1永远为真

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值