MySQL入门篇
MySQL下载并安装教程推荐:聚精会神搞学习的文章
图形化工具使用:Dbeaver下载官网
目录
- 🍉概述:什么是MySQL?
- 一、🍉MySQL语言特点:
- 二、🍉数据库管理系统(数据库软件)
- 三、🍉MySQL的版本
- 四、🍉MySQL操作语法
- (1)DDL
- (2)DML
- 1. 插入insert
- 2. 删除delete
- 3. 更新update
- 4. MySQL约束:
- 4.1 主键约束`(primary key)PK`
- 4.2 自增长约束`(auto_increment)`
- 4.3 非空约束`(not null)`
- 4.4 唯一性约束`(unique)`
- 4.5 默认约束`(default)`
- 4.6 零填充约束`(zerofill)`
- 4.7 外键约束`(foreign key) FK`
- (3)DQL
- 1.概念:
- 2.语法
- 3.案例:
- 4. 运算符
- 5.排序查询
- 6.聚合查询
- 7. 分组查询-group by
- 8.分页查询:
- 9.`insert into select`语句
- 10. 正则表达式
- 五、🍉MySQL-多表关系
- (1)一对一关系:
- (2)一对多/多对一关系
- (3)多对多关系
- (4)多表联合查询
🍉概述:什么是MySQL?
MySQL语言是一种用于管理和操作MySQL关系型数据库管理系统(RDBMS)的结构化查询语言(Structured Query Language,SQL)。MySQL语言基于SQL标准,但它也包含了一些特定于MySQL的扩展,使其能够适应更广泛的数据库管理需求。MySQL因其高效、稳定、灵活和免费的特性,被广泛应用于Web应用、企业内部系统、数据仓库、内容管理系统等多个领域。
一、🍉MySQL语言特点:
特点 | 解释 |
---|---|
大小写不敏感 | 在MySQL中,SQL关键字(如SELECT, FROM, WHERE等)对大小写不敏感,尽管习惯上常采用大写形式以提高代码可读性。 |
语句结构 | MySQL支持单行或多行书写SQL语句,每个完整的SQL语句以分号(;)结束。多行书写时,可以提高代码的可读性。 |
注释 | MySQL支持两种单行注释方式。一种是使用-- (双连字符后跟一个空格),另一种是使用# (井号),两种注释都可以用来对代码进行解释说明。 |
数据定义语言(DDL) | 用于创建、修改和删除数据库对象,如CREATE TABLE、ALTER TABLE、DROP TABLE等语句。 |
数据操作语言(DML) | 用于操作数据,包括插入(INSERT)、更新(UPDATE)、删除(DELETE)和查询(SELECT)数据。 |
数据查询语言(DQL) | SELECT语句是DQL的核心,支持复杂的查询操作,如联接(JOIN)、聚合函数(COUNT、SUM等)、排序(ORDER BY)、分组(GROUP BY)和子查询。 |
事务处理 | 通过支持事务(如START TRANSACTION、COMMIT、ROLLBACK),MySQL可以确保数据的一致性和完整性,尤其是在InnoDB存储引擎中。 |
存储过程和函数 | MySQL允许创建存储过程和函数,封装复杂的操作,提高代码复用性和性能。 |
触发器 | 可以在数据库中定义触发器,当特定事件发生时(如数据插入、更新或删除),自动执行一段代码。 |
视图 | 视图是虚拟表,基于SQL查询的结果集,可以简化数据操作,提供数据的安全性。 |
索引 | MySQL支持多种类型的索引,如B-Tree、HASH、全文索引等,用于加速数据检索。 |
安全性 | MySQL提供权限和角色管理,可以精细控制用户对数据库和数据表的操作权限。 |
字符集支持 | MySQL支持多种字符集,包括UTF-8,以便处理多语言数据。 |
MySQL特点:
- 开源免费:MySQL是开源软件,用户可以免费使用和修改源代码,这大大降低了使用成本。
- 跨平台性:支持多种操作系统,包括Windows、Linux、macOS、Unix等,具有良好的平台兼容性。
- 高性能:MySQL经过优化,特别擅长处理大量并发读写操作,适用于高负载环境。
- 安全性:提供多种安全机制,包括SSL加密、访问控制、视图和存储过程等,保护数据安全。
- 可扩展性:支持分区、集群、主从复制等技术,易于扩展以满足大规模数据处理需求。
- 丰富的接口支持:提供了多种编程语言的API,如PHP、Python、Java、C++、Perl等,方便应用程序集成。
- 存储引擎选择:支持多种存储引擎,如InnoDB(事务安全)、MyISAM(高速查询)、Memory(数据存储在内存中)等,可以根据应用场景选择最合适的存储方式。
- 强大的社区支持:MySQL拥有庞大的用户和开发者社区,遇到问题时容易找到解决方案。
二、🍉数据库管理系统(数据库软件)
(1)关系型数据库(RDBMS)
1. Oralce数据库(老大,最挣钱的数据库)
2. MySQL数据库(最流行中型数据库)
3. SQL server数据库(Windows上最好的数据库)
4. PostgreSQL(功能最强大的开源数据库)
5. SQLite(最流行的嵌入式数据库)
(2)非关系型数据库(NoSQL)
1. Redis(最好的缓存数据库)
2. MongoDB(最好的文档型数据库)
3. Elasticsearch(最好的列式数据库)
4. HBase(优秀的分布式、列式数据库)
(3)SQL和数据库管理系统的关系
1. SQL式一种用于操作数据库的语言,SQL使用于所有关系型数据库。
2. MySQL、Oracle、SQLServer式一个数据库软件,这些数据库软件支持标准SQL,也就是通过SQL可以使用这些软件,不过每一个数据库系统会在标准SQL的基础上扩展自己的SQL语法。
3. 大部分的NoSQL数据库有自己的操作语言,对SQL支持的并不好。
(4)关系型数据数据库管理系统组成:
- 数据库管理系统(DBMS)主要由数据库和表组成,一个系统可以有很多数据库,每个数据库可以有很多表。
三、🍉MySQL的版本
(1)针对不同的用户,MySQL分为两种不同的版本:
- MySQL Community Server:社区版本,免费,但是Mysql不提供官方技术支持
- MySQL Enterprise Edition:商业版,该版本是收费版本,可以试用30天,官方提供技术支持
- MySQL Cluster:集群版,开源免费,可将几个MySQL Server封装成一个Server。
- MySQL Cluster CDE:高级集群版,需付费
- MySQL Workbench (GUI TOOL):一款为MySQL设计的ER/数据库建模工具。MySQL Workbench又分为两个版本,分别是社区版(MySQL Workench OSS)、商用版(MySQL Workbench SE)。
(2)MySQL的命名机制使用由3个数字和一个后缀组成的版本号。例如像mysql-8.0.26的版本号这样解释:
- 第1个数字(8)是主版本号,描述了文件格式。所有版本5的发行都有相同的文件格式。
- 第2个数字(0)是发行级别,主版本号和发行级别组合到一起便构成了发行序列号。
- 第3个数字(26)是在发行系列的版本号,随每个新分发版递增。
(3)MySQL的卸载
-
停止服务:
方式1:打开DOS,使用net stop mysql命令
方式2:【win+R快捷键】–》输入services.msc --》进入服务窗口关闭mysql服务;
-
卸载程序(可选):
使用360卸载mysql程序或【控制面板】–》【程序和功能】–》右键卸载程序;
-
删除项目根文件夹:
进入mysql安装位置,删除mysql的解压文件夹;
-
删除C盘隐藏文件夹(可选):
显示隐藏我文件后,删除C盘下的
“C:\ProgramData\MySQL”
-
删除注册表信息:
【win+R快捷键】–》输入regedit命令打开注册表窗口,删除一下文件夹:
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications/MySQL
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications/MySQL
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications/MySQL
-
删除环境变量里的配置:
如果有更改了环境变量,那么进入【计算机】–》右键【属性】–》【高级系统设置】–》【环境变量】–》删除系统变量中的MYSQL_HOME变量和删除Path变量中的mysql路径:
-
删除MYSQL服务:
管理员权限cmd–》sc delete MySQL服务名字
(4)常用工具介绍
-
Navicat
Navicat是一套快速、可靠的数据库管理工具,Navicat是以直觉化的图形用户界面而建的,可以兼容多种数据库,支持多种操作系统。
-
SQLyog
SQLyog是一个快速而简洁的图形化管理MySQL数据库的工具,它能够在任何地点有效地管理你的数据库,由业界著名的Webyog公司出品。
-
MySQL Workbench
MySQL Workbench MySQL是官方提供的图形化管理工具,分为社区版和商业版,社区版完全免费,而商业版本则是按年收费。支持数据库的创建、设计、迁移、备份、导出和导入等功能,并且支持Windows、Linux和mac等主流操作系统。
-
DataGrip
DataGrip,是大名鼎鼎的JetBrains公司出品的,就是那个出品Intellij IDEA的公司。它是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql、创建表、创建索引以及导出数据等。
-
其他工具
phpMyAdmin、MySQLDumper、MySQL GUI Tools、MySQL ODBC Connector
四、🍉MySQL操作语法
(1)DDL
DDL(Data Definition Language),数据定义语言,该语言部分包括以下内容:
-
对数据库的常用操作
-- 查看所有数据库 show databases; -- 创建数据库:reate database [if not exists] 学生选课 [charset=utf8]; create database if not exists 学生选课 charset=utf8 -- 切换(选择要操作的)数据库 use 学生选课; -- 删除数据库:drop database [if exists] 学生选课; drop database if exists 学生选课; -- 修改数据库编码 alter database 学生选课 character set utf8
-
对表结构的常用操作
创建表格语法:
create table [if not exists] 表名(
字段1 类型(宽度) [约束条件] [comment '字段说明'],
字段2 类型(宽度) [约束条件] [comment '字段说明'],
字段3 类型(宽度) [约束条件] [comment '字段说明']
)[表的一些设置];
例如:
# 在使用数据库时,要查看数据库
show databases;
use 学生选课;
create table student(
sid int,
name varchar(20),
gender varchar(20),
age int,
xb bit,
birth date
);
-
修改表结构
数据类型是指在创建表的时候为表中字段指定数据类型,只有数据符合类型要求才能存储起来,使用数据类型的原则是:能够用就行、尽量使用取值范围小的,而不是用大的,这样可以更多的节省存储空间。
数据类型:数值类型、日期和时间类型、字符串类型
功能 | SQL |
---|---|
查看当前数据库的所有表名称 | show tables; |
查看指定某个表的创建语句 | show create table 表名; |
查看表结构 | desc 表名; |
删除表 | drop table 表名; |
show databases;
-- 使用数据库
use 学生选课;
-- 查看当前数据库的所有表名称
show tables;
-- 查看指定某个表的创建语句
show create table student;
-- 查看表结构
desc student;
-- 删除表
drop table student;
修改表:添加列
-- 语法格式:
alter table 表名 add 列名 类型(长度) [约束];
-- alter table student add dept varchar(20) not null;
修改表:列名和类型
-- 语法格式:
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
-- alter table student change dept department varchar(20);
修改表:删除列
-- 语法格式:
alter table 表名 drop 列名
-- alter table student drop department;
修改表:表名
-- 语法格式:
rename table 表名 to 新表名;
-- rename table student to std;
-- rename table std to student;
注意
:可以使用数据库.表
的方式指定某个数据库下的表名(且使用)
(2)DML
DML是指数据操作语言,英文全称是Data Manipulation Language,用来对数据库中表的数据记录进行更新。用于操作数据,包括插入(INSERT)、更新(UPDATE)、删除(DELETE)和查询(SELECT)数据。
1. 插入insert
方式1:
-- 语法格式:指定列添加数据
insert into 表(列名1,列名2,列名3…) values(值1,值2,值3…);
-- 1.添加单行
insert into student (id,name,age,gender,birth,address)
values(1,'张三',18,0,'2004-06-25','北京');
-- 2.添加多行
insert into student (id,name,age,gender,birth,address)
values(2,'李四',16,1,'2004-07-02','上海'),
(3,'李嘉',17,0,'2003-08-05','南京'),
(4,'王明',18,1,'2004-12-25','苏州');
方式2:
-- 语法格式:添加全部列
insert into 表 values(值1,值2,值3…);
-- 1.添加单行
insert into student values(5,'吕树',18,0,'2004-06-15','重庆');
-- 2.添加多行
insert into student values(6,'吕小鱼',16,1,'2007-06-08','重庆'),
(7,'江束一',18,0,'2004-11-08','重庆'),
(8,'陈祖安',18,0,'2004-09-08','重庆');
2. 删除delete
-- 1.语法格式:指定删除的数据
delete from 表名 [where 条件]
-- 指定删除的数据 id=6
delete from student where id=6;
delete from student; # 删除表所有数据
-- 2.语法格式:清空表数据
truncate table 表名 或者 truncate 表名
-- 清空表数据
truncate table student ;
truncate student ;
/*注意:delete 和 truncate 原理不同,delete只删除内容,而truncate类似于drop table,可以理解为将整个表删除*/
3. 更新update
-- 1.语法格式;全部修改
update 表名 set 字段名=值,字段名=值,字段名=值……;
-- 全部地址修改为’重庆‘
update student set address='重庆';
-- 2.语法格式;指定修改的内容
update 表名 set 字段名=值,字段名=值,字段名=值…… where 条件;
-- 指定名字为吕树的性别修改为男性
update student set gender='男' where name='吕树';
4. MySQL约束:
概念:
- 约束英文:constraint,约束实际上就是表中的数据的限制条件
- 作用:表在设计的时候加入约束的目的就是未来保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。
分类:
4.1 主键约束(primary key)PK
- 概念:
- MySQL主键约束是一个或者多个列的组合,其值能唯一地标识表中的每一行,方便再RDBM5中尽快的找到某一行。
- 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许传销空值。
- 每个表最多只允许一个主键
- 主键约束的关键字是:
primary key
- 当创建主键的约束时,系统默认会再所在的列和列组合上建立对应的唯一索引。
-
操作:添加单列主键
创建单列主键有两种方式:一种是在定义字段的同时指定主键,一种是定义完字段之后指定主键
-- 方式1:语法:
create table 表名(
···
<字段名> <数据类型> primary key
···
)
[constraint <约束名>]
可以省略
-- 方式2:语法:
create table 表名(
···
[constraint <约束名>] primary key [字段名]
);
- 联合主键:添加多列主键
- 所谓的联合主键,就是这个主键是由一张表中的多个字段组成的
- 联合主键不能为空
- 联合主键不能与其他列重复
注意
:
- 当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
- 一张表只能有一个主键,联合主键也是一个主键
-- 语法:
create table 表名(
···
primary key (字段1,字段2,…,字段n)
);
-- 例如:
create table student(
name varchar(10),
id int,
salary double,
primary key(name,id)
);
- 通过修改表结构添加主键
-- 语法:
create table 表名(
···
);
alter table <表名> add primary key (字段列表);
-- 例如:
create table student(
name varchar(10),
id int,
salary double,
);
alter table student add primary key (name);
-
删除主键约束
一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法比创建主键约束容易的很多。
-- 语法:
alter table <数据表名> drop primary key;
-- 例如:
alter table student drop primary key; # 删除单列
alter table student drop primary key; # 删除联合列
4.2 自增长约束(auto_increment)
- 概念:
- 在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。
- 通过给字段添加
auto_increment
属性来实现主键自增长
- 特点:
- 默认情况下,
auto_increment
的初始值是1,每新增一条记录,字段值自动加1.- 一个表中只能有一个字段使用
auto_increment
约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)auto_increment
约束的字段必须具备NOT NULL
属性auto_increment
约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT
)等。auto_increment
约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment
就会失效
- 操作:
-- 语法:
<字段名> <数据类型> auto_increment
指定自增字段初始值
-- 如果第一条记录设置了该字段的初始值,那么新增加的记录就会从这个初始值开始自增。例如,如果表中插入的第一条记录的id值设置为5,那么再插入记录时,id值就会从5开始往上增加
-- 1.创建表时指定
create table student(
id int primary key auto_increment,
name varchar(20)
)auto_increment=100; # 这里的初始值是从100开始,第二个是101,累加
-- 2.创建表之后指定
create table student(
id int primary key auto_increment,
name varchar(20)
);
alter table student auto_increment=100; # 相当于修改表结构
delete
和truncate
在删除后自增列的变化
-- delete数据之后自动增长从断点开始
-- truncate数据之后自动增长从默认起始值开始
4.3 非空约束(not null)
- 概念:
MySQl非空约束(
not null
)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错
- 语法:
-- 1.创建表时指定
<字段名> <数据类型> not null;
-- 例如:
create table student(
id int,
name varchar(20) not null,
address varchar(30) not null
);
-- 2.创建表之后指定
alter table 表名 modify 字段 类型 not null;
-- 例如:
create table student(
id int,
name varchar(20),
address varchar(30)
);
alter table student modify name varchar(20) not null;
alter table student modify address varchar(30) not null;
- 删除非空约束
-- 语法:
alter table 表名 modify 字段 类型
-- 例如:
alter table student modify name varchar(20);
alter table student modify address varchar(30);
4.4 唯一性约束(unique)
- 概念:
唯一约束(
Unique Key
)是指所有记录中字段的值不能重复出现。例如,为id字段加上唯一性约束后,每条记录的if值都是唯一的,不能出现重复的情况
- 语法:
-- 1.创建表时指定
<字段名> <数据类型> unique
-- 例如:
create table student(
id int,
name varchar(20),
phone_number varchar(20) unique # 指定唯一约束
);
-- 2.创建表之后指定
alter table 表名 add constraint 约束名 unique(列);
-- 例如:
create table student(
id int,
name varchar(20),
phone_number varchar(20)
);
alter table student add constraint unique(phone_number);
- 注意:
-- 在MySQL中,NULL和任何值都不相同,甚至是和自己也不相同
insert into student values(1004,'张三',NULL);
insert into student values(1005,'李四',NULL); # 这两个NULL是不相等的
4.5 默认约束(default)
- 概念:
MySQL默认约束用来指定某列的默认值。
- 语法:
-- 1.创建表时指定
<字段名> <数据类型> default <默认值>;
-- 例如:
create table student(
id int,
name varchar(20),
address varchar(30) default '北京'
);
-- 2.创建表之后指定
alter table 表名 modify 列名 类型 default <默认值>;
-- 例如:
create table student(
id int,
name varchar(20),
address varchar(30)
);
alter table student modify address varchar(30) default '北京';
4.6 零填充约束(zerofill)
- 概念:
- 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
zerofill
默认为int(10)
- 当使用
zerofill
时,默认会自动加unsigned
(无符号)属性,使用unsigned
属性后,数值范围是原值的2倍,例如,有符号-128~+127
,无符号为0~256
- 操作
-- 1.创建表时指定
<字段名> <数据类型> zerofill;
-- 例如:
create table student(
id int zerofill, # 零填充约束
name varchar(20)
);
-- 2.创建表之后指定
alter table 表名 modify 字段 类型 zerofill;
-- 例如:
create table student(
id int,
name varchar(20)
);
alter table student modify id int zerofill;
- 删除
alter table student modify id int;
4.7 外键约束(foreign key) FK
概:
- MySQL外键约束(foreign key)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父亲),外键所在的表就是从表(子表)。
- 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中的数据的一致性和完整性
特点:
- 主表必须已经存在于数据库中,或者是当前正在创建的表。
- 必须为主表定义主键
- 主键不能包含空值,但允许在外键中出现空值,也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
- 在主表的表名后面指定列名或列名的组合,这个列名或列名的组合必须是主表的主键或候选键。
- 外键中的数目必须和主表的主键中的列的数目相同
- 外键中列的数据类型必须和主表主键中对于列的数据类型相同
操作-创建外键约束
-- 方式1:在创建表时设置外键约束:在create table语句中,通过foreign key 关键字来指定外键,具体的语法格式如下:
[constraint <外键名>] foreign key 字段名 [,字段名2] references <主表名> 主键列1 [,主键列2,···]
-- 方式2:
alter table <数据表名> add constraint <外键名> foreign key(<列名>) references <主表名> (<列名>)
例如:
create database mydb3;
use mydb3;
create table if not exists dept(
detpno varchar(20) primary key,
name varchar(20)
) ;
create table if not exists dept2(
eid varchar(20) primary key,
ename varchar(20),
age int,
dept_id varchar(20)
);
-- 创建外键约束
alter table dept2 constraint dept_id_fk foreign key(dept_id) references dept(detpno);
insert into dept values('1001','研发部'),
('1002','销售部'),
('1003','财务部'),
('1004','人事部');
insert into dept2 values('1','乔峰',20,'1001'),
('2','段誉',21,'1001'),
('3','虚竹',23,'1001'),
('4','阿紫',18,'1002'),
('5','扫地僧',35,'1002'),
('6','李秋水',33,'1003'),
('7','鸠摩智',50,'1003');
-- 注意:给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
-- 报错:insert into dept2 values('8','天山童姥',60,'1005');
删
-- 删除数据:主表的数据被从表依赖时,不能删除,否则可以删除;从表的数据可以随便删除
delete from dept where detpno='1001'; -- 不可以删除
delete from dept where detpno='1004'; -- 可以删除
delete from dept2 where eid='7'; -- 可以删除
语法:
-- 当一个表中不需要外键约束时,就需要从表中将其删除,外键一旦删除,就会解除主表和从表间的关联管理
alter table <表名> drop foreign key <外键约束名>
-- 例如:
alter table dept2 drop foreign key dept_id_fk;
(3)DQL
1.概念:
- 数据库管理系统一个重要功能就是数据查询,数据查询不应该只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以说明样的格式显示
- MySQL提供了功能强大、灵活的语句来实现这些操作。
- MySQL数据库使用select语句来查询数据。
2.语法
select [all|distinct] <目标列的表达式1> [别名],
<目标列的表达式2> [别名]…
from <表名或视图名> [别名],<表名或视图名> [别名]…
[where <条件表达式>]
[group by <列名> [having <条件表达式>]]
[order by <列名> [asc|desc]]
[limit <数字或列表>]
-- 简化语法:
select *| 列名 from 表 where 条件
3.案例:
准备工作:
--查看库
show databases;
--创建库
create database if not exists student;
use student;
# 创建表格
create table product(
pid int primary key auto_increment, # 商品编号
pname varchar(20) not null, #商品名字
price double, # 商品价格
category_id varchar(20) # 商品所属分类
);
--添加表数据
insert into product (pid,pname,price,category_id) values(null,'海尔洗衣机',5000,'c001'),
(null,'美的冰箱',3000,'c001');
insert into product values(null,'格力空调',5000,'c001'),
(null,'九阳电饭煲',5000,'c001');
insert into product values(null,'啄木鸟衬衣',300,'c002'),
(null,'恒源详西裤',800,'c002'),
(null,'花花公子夹克',440,'c002'),
(null,'劲霸休闲裤',266,'c002'),
(null,'海澜之家卫衣',180,'c002'),
(null,'杰克琼斯运动裤',430,'c002');
insert into product values(null,'兰蔻面霜',300,'c003'),
(null,'雅诗兰黛精华水',200,'c003'),
(null,'香奈儿香水',350,'c003'),
(null,'SK-II神仙水',350,'c003'),
(null,'资生堂粉底液',180,'c003');
insert into product values(null,'老北京方便面',56,'c004'),
(null,'良品铺子海带丝',17,'c004'),
(null,'三只松鼠坚果',88,null);
select查询:
-- 简单查询
-- 1.查询所有的商品
SELECT * FROM product;
-- 2.查询商品名和商品价格
select pname,price from product;
-- 3.别名查询.使用的关键字是as(as可以省略)
-- 3.1 表别名
select * from product as p;
-- 3.2 列别名
select pname pn from product;
-- 4.去重
select distinct price from product;
-- 5.查询结果是表达式(运算符):将所有商品的价格+10进行显示
select pname,price+10 from product p ;
4. 运算符
4.1 简介:
- 数据库钟的表结构确立后,表钟的数据代表的意义就已经确定。通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据。
- 例如,学生表中存在一个birth字段,这个字段表示学生的出生年份,而运用MySQL的算术运算符用当前的年份减学生出生的年份,那么得到的就是这个学生的实际年龄数据。
4.1.1 算数运算符
算术运算符 | 说明 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/或DIV | 除法运算,返回商 |
%或MOD | 求余运算,返回余数 |
-- 运算符:算数运算符
-- 1.将每件商品价格加10
select pname,price+10 new_price from product p;
-- 2.将所有商品的价格上调10%
select pname,price+price*0.1 new_price from product p;
4.1.2 比较运算符
比较运算符 | 说明 |
---|---|
= | 等于 |
< 和 <= | 小于和小于等于 |
> 和 >= | 大于和大于等于 |
<=> | 安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |
<> 或 != | 不等于 |
IS NULL 或 ISNULL | 判断一个值是否为NULL |
IS NOT NULL | 判断一个值是否不为NULL |
LEAST | 当有两个或多个参数时,返回最小值 |
CREATEST | 当有两个或多个参数时,返回最大值 |
BETWEEN … AND | 判断一个值是否落在两个值之间 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
4.1.3 逻辑运算符
逻辑运算符 | 说明 |
---|---|
NOT 或者 | | 逻辑非 |
AND 或者 && | 逻辑与 |
OR 或者 || | 逻辑或 |
XOR | 逻辑异或 |
-- 运算符:比较运算符、逻辑运算符
-- 1.查询商品名称位“海尔洗衣机”的商品所有信息
select * from product p where pname ='海尔洗衣机';
-- 2.查询价格位800的商品信息
select * from product p where price =800;
-- 3.查询价格不是800的所有商品信息
select * from product p where price !=800;
select * from product p where price <> 800;
select * from product p where not (price=800);
-- 4.查询商品价格大于60元的所有商品信息
select * from product p where price >60;
-- 5. 查询商品价格200到1000之间所有商品信息
select * from product p where price >=200 and price <=1000;
select * from product p where price between 200 and 1000;
select * from product p where price >=200 && price <=1000;
-- 6.查询商品价格是200或800的所有商品信息
select * from product p where price in(200,800);
select * from product p where price =200 or price =800;
select * from product p where price=200 || price =800;
4.1.4 位运算符
位运算符是二进制数上进行计算的运算符。位运算会先将操作数变成2进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
位运算符 | 说明 |
---|---|
| | 按位或 |
& | 按位与 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
~ | 按位取反,反转所有比特 |
select 3|5; -- 与:同1则1,不同则0,同0还是0
select 3&5; -- 或:有1则1,无1则0
select 3^5; -- 异或:相同则0,不同则1
select 3<<1;
select 3>>1;
select ~3; -- 取反:18446744073709551612
4.1.5like
匹配
-- 1.查询含有“裤”字的所有商品信息
select * from product p where pname like '%裤%'; -- %用来匹配任意字符
-- 2.查询以’海‘开头的所有商品信息
select * from product p where pname like'海%';
-- 3.查询第二个字为“蔻”的所有商品信息
select * from product p where pname like '_蔻%'; -- 下划线匹配单个字符
-- 4.查询category_id为null的商品信息
select * from product p where category_id is null ;
-- 5.查询category_id不为null的商品信息
select * from product p where category_id is not null ;
4.1.6 函数:least()
和greatset()
-- 1.使用least求最小值
select least(10,20,30); -- 10
select least(10,null,30); -- null,如果求最小值时,有个值为null,则不会进行比较,直接返回null
-- 2.使用greatest求最大值
select greatest(10,20,30);-- 30
select greatest(10,null ,30); -- null,如果求最大值时,有个值为null,则不会进行比较,直接返回null
5.排序查询
如果我们需要对读取的数据进行排序,我们就可以使用MySQL的order by
子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果
语法:
select 字段名1,字段名2,…… from 表名 order by 字段名1 [asc|desc],字段名2[asc|desc],……
-- 1. ascd代表升序,desc代表降序,如果不默认升序
-- 2. order by用于句种可以支持单个字段,多个字段,表达式,函数,别名
-- 3. order by子句,放在查询语句的最后面,LM+IMIT子句除外
-- 1.使用价格排序(降序)
select * from product p order by price desc ;
-- 2.在价格排序(降序)的基础上,分类排序(降序)
select * from product p order by price desc,category_id asc;
-- 3.显示商品的价格(去重复),并排序(降序)
select distinct price from product p order by price desc;
6.聚合查询
简介:之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
聚合函数 | 作用 |
---|---|
count() | 统计指定列不为NULL的记录行数 |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算 |
min() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算 |
avg() | 计算机指定的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
聚合查询-NULL值的处理:
- count函数对null值的处理:如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。
- sum和avg函数对null值的处理:这两个函数忽略null值的存在,就好像该条记录不存在一样
- max和min函数对null值的处理:max和min两个函数同样忽略null值的存在
show databases;
use student;
-- 创建表
create table test_null(
c1 varchar(20),
c2 int
);
-- 添加表数据
insert into test_null values('aaa',3),
('bbb',3),
('ccc',null),
('ddd',6);
-- 聚合查询-null处理
select count(*),count(c1),count(c2) from test_null ;
select sum(c2),max(c2),min(c2),avg(c2) from test_null ;
7. 分组查询-group by
简介:分组查询是指使用group by
字句对查询信息进行分组。
格式:
select 字段1,字段2… from 表名 group by 分组字段 having 分组条件;
操作:
-- 1.统计各个分类商品的个数
select category_id ,count(*) from product group by category_id;
-- 如果进行分组的话,则select子句之后,只能出现分组的字段和统计函数,其他的字段不能出现
分组之后的条件筛选-having
- 分组之后对统计结果进行筛选的话必须使用
having
,不能使用where
where
子句用来筛选from
子句中指定的操作所产生的行group by
子句用来分组where
子句的输出having
子句用来从分组的结果中筛选行
格式:
select 字段1,字段2… from 表名 group by 分组字段 having 分组条件;
操作:
-- 统计各个分类商品的个数,且只显示个数大于4的信息
select category_id ,count(*) from product group by category_id having count(*) >1;
8.分页查询:
简介:分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式,例如数据共有30条,每页显示5条,第一页显示6-10条。
格式:
-- 方式1:显示前n条
select 字段1,字段2… from 表名 limit n;
-- 方式2:分页显示
select 字段1,字段2… from 表名 limit n,m;
# m:整数,表示从第几条索引开始,计算方式(当前页-1)*每页显示条数
# n:整数,表示查询多少条数据
操作
-- 查询product表的前5条记录
select * from product p limit 5;
-- 从第4条开始显示,显示5条
select * from product p limit 3,5;
9.insert into select
语句
简介:将一张表的数据导入到另一张表中,可以使用insert into select
语句
格式:
-- 1
insert into table2(filed1,filed2,…) select value1,value2,… from table1
-- 2
insert into table2 select * from table1
10. 正则表达式
介绍:
- 正则表达式描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
- MySQL通过REGEXP关键字支持正则表达式进行字符串匹配
格式
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
. | 匹配除”\n“之外的任何单个字符。 |
[……] | 字符集合,匹配所包含的任意一个字符。 |
[^…] | 负值字符集合。匹配未包含的任意字节。 |
p1|p2|p3 | 匹配p1或p2或p3。 |
语法:
select 将要匹配的字段 regexp 正则表达式
操作
-- 1. ^在字符串开始处进行匹配
SELECT 'abc' regexp '^a'; -- 1
-- 2.$在字符串末尾开始匹配
select 'abc' regexp 'a$'; -- 0
select 'abc' regexp 'c$'; -- 1
-- 3. .匹配任意字符
select 'abc' regexp '.b'; -- 1
select 'abc' regexp '.c'; -- 1
select 'abc' regexp 'a.'; -- 1
-- 4.[···]匹配括号内的任意单个字符
select 'abc' regexp '[xyz]'; -- 0
select 'abc' regexp '[abcx]';-- 1
五、🍉MySQL-多表关系
介绍:
- 实际开发中,一个项目通常需要很多张表才能完成,例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(oredrs)等多张表。且这些表的数据之间存在一定的关系。
- MySQL多表之间的关系可以概括为:一对一、一对多/多对一关系,多对多
(1)一对一关系:
- 一个学生只有一张身份证;一张身份证只能对应一个学生。
- 在任一表中添加唯一外键,指向另一方主键,确保一对一关系。
- 一般一对一关系很少见,遇到一对一关系的表最好是合并表
(2)一对多/多对一关系
- 部门和员工:
- 分析:一个部门有多个员工,一个员工只能对应一个部门
- 实现原则:在多的一方建立外键,指向一的一方的主键
(3)多对多关系
- 学生和课程
- 分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择
- 原则:多对多关系实现需要借助第三张中间表,中间表至少包含两个字段,将多对多的关系,拆成一对多的关系,中间表至少要有两个外键,这两个外键分别指向原来的那两张表的主键
例如:
use mydb3;
-- 1.创建学生表student(左侧主表)
create table student(
sid int primary key auto_increment,
name varchar(20),
age int,
gender varchar(20)
);
-- 2.创建课程表course(右侧主表)
create table course(
cid int primary key auto_increment,
cidname varchar(20)
);
-- 3. 创建中间表student_course/score(从表)
create table score(
sid int,
cid int,
score double
);
-- 4.建立外键约束(2次)
alter table score add foreign key(sid) references student(sid);
alter table score add foreign key(cid) references course(cid);
-- 5.给学生表添加数据
insert into student values(1,'小龙女',18,'女'),(2,'阿紫',19,'女'),(3,'杨过',17,'男');
-- 6.给课程表添加数据
insert into course values(1,'语文'),(2,'数学'),(3,'英语');
-- 7.给中间表添加数据
insert into score values(1,1,78),(1,2,75),(2,1,88),(2,3,90),(3,2,80),(3,3,65);
(4)多表联合查询
介绍
多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候需要显示的数据来自多张表
准备工作:
create database mydb1;
use mydb1;
-- 创建部门表
create table if not exists dept(
deptno varchar(20) primary key, -- 部门号
name varchar(20) -- 部门名字
) ;
-- 创建员工表
create table if not exists dept2(
eid varchar(20) primary key, -- 员工编号
ename varchar(20), -- 员工名字
age int, -- 员工年龄
dept_id varchar(20) -- 员工所属部门
);
-- alter table dept2 constraint dept_id_fk foreign key(dept_id) references dept(detpno);
insert into dept values('1001','研发部'),
('1002','销售部'),
('1003','财务部'),
('1004','人事部');
insert into dept2 values('1','乔峰',20,'1001'),
('2','段誉',21,'1001'),
('3','虚竹',23,'1001'),
('4','阿紫',18,'1002'),
('5','扫地僧',35,'1002'),
('6','李秋水',33,'1003'),
('7','鸠摩智',50,'1003'),
('8','天山童姥',60,'1003'),
('9','慕容博',58,'1003'),
('10','丁春秋',71,'1005');
查询操作:
-- 1.交叉连接查询:
select * from 表1,表2;
-- 如:
select * from dept ,dept2 ;
-- 2.内连接查询(使用的关键字inner join -- inner 可以省略)
select * from 表1,表2 where 条件;
select * from 表1 inner join 表2 on 条件;
-- 如:
select * from dept,dept2 where dept.deptno =dept2.dept_id;
select * from dept inner join dept2 on dept.deptno=dept2.dept_id;
-- 3.外连接查询(使用的关键字 outer join -- outer可以省略)
-- 3.1左外连接:left outer join
select * from 表1 left outer join 表2 on 条件;
-- 3.2右外连接:right outer join
select * from 表1 right outer join 表2 on 条件;
-- 3.3满外连接:full outer join
select * from 表1 full outer join 表2 on 条件;
-- 4.子查询
select的嵌套
-- 5.表自关联
将一张表当成多张表来用
都学累了吧,来看看家乡的风景照和猫咪