MySQL基础部分
前言:
本文为MySQL基础部分,不涉及高级部分,整体难度偏低,一些重要内容已高光或着重
使用MySQL5.7,图形化工具使用的是Navicat15
参考了如下文章或视频:
- https://javaguide.cn
- 尚硅谷
- https://github.com/jaywcjlove/mysql-tutorial
- 百度
一、数据库概述
1. 相关概念
- 数据库:存储数据的“仓库”
- 数据库管理工具(DBMS):我们无法直接与数据库交互,需要使用 数据库管理工具(DBMS) 方便我们对数据库进行统一的管理和使用
- DBA:负责全面管理和控制数据库系统
- SQL:我们通过DBMS与数据库交互操作数据库就需要借助SQL语言,全称为结构化查询语言,是专门与数据库打交道的一门语言
2.MySQL数据库
-
MySQL 是开源免费并且比较成熟的数据库
-
MySQL可以允许运行于多个系统上,并且支持多种语言。(后面会使用Java和python来操作MySQL数据库)
-
主要有两种类型的数据库:关系型和非关系型数据库(以后可以再深入了解)。MySQL属于关系型数据库
-
关系型数据库可以简单理解为一个个的二维表,数据库中包含若干表,而表的每一行表示一条数据,如下图所示为一张表
使用的截图工具为Snipaste
想了解更多的话可以通过百度或bing搜索
二、MySQL5.7及Navicat15安装
由于安装过程需占用较大篇幅,再本文就不再演示安装步骤了
推荐尚硅谷康师傅的MySQL视频,十分详细,可以在评论区找到相关资料进行下载(具体版本差别不大,大部分还是相同的)
视频链接:安装视频
安装时注意一下,有个步骤是MySQL服务名,这个启动服务需要用到这个名
安装完了MySQL之后,需要进行:
1. 启动MySQL服务
这个在安装时可以进行勾选,也可以通过命令行(win+r)(右键以管理员身份运行)
net start MySQL服务名
MySQL服务名在安装时填写,不过忘记也不要紧,遇到问题自己解决不了就去百度搜索就行
如何查看MySQL服务名:查看服务名
2. 连接MySQL
在没有安装图形化工具之前可以使用命令行的方式连接
前提服务已启动,输入
mysql -uroot -p
(就是这几个,不要做修改)。之后提示输入密码回车即可关于MySQL的一些常用命令,在后面会讲到,这里了解一下就行了
我们可以输入最简单的命令体验一下: 注意sql语句必须以分号结束
这就是上面概述中的那张二维表。这时我们要退出mysql命令行该怎么退出呢?
通过exit或quit即可退出
本文使用Navicat充当图形化工具,上述视频中也有下载,跟视频下载即可
安装完Navicat之后需进行:
1. 建立连接
2. 新建数据库
这里采用图形化工具的方式,后面也可以采用sql语句的方式
字符集:utf8,排序规则:utf8_general_ci
3. 新建表
可以按照下图进行:
int就是整型数字、但是字符串类型是varchar
一张表有一个唯一主键来标识这张表,也就是表里的一条条数据的唯一标识,这样表中的数据一条条的都不一样,主键非空且唯一
三、SQL
SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言,与数据直接打交道
1. 分类
-
DDL(Data Definition Languages、数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。
- 主要的语句关键字包括
CREATE
、DROP
、ALTER
等。
- 主要的语句关键字包括
-
DML(Data Manipulation Language、数据操作语言),用于添加、删除、更新和查询数据库记录,并检查数据完整性。
- 主要的语句关键字包括
INSERT
、DELETE
、UPDATE
、SELECT
等。 - SELECT是SQL语言的基础,最为重要。(因此SELECT查询语句也被称为DQL)
- 主要的语句关键字包括
-
DCL(Data Control Language、数据控制语言),用于定义数据库、表、字段、用户的访问权限和安全级别。
sql语句虽然对大小写不敏感,但是最好还是要养成良好的习惯,一般是关键字大写,表名和字段名小写
这里先采用全小写的方式,后面会逐渐遵从规范
2. DQL(简单查询)
这里只介绍了简单的查询,复杂查询有时间再更新
只有SELECT的:
需要新建一个查询,选择对应的数据库和表名,写sql语句,之后选中要执行的sql点击“运行已选择的按钮”
SQL和其他语言一样也有自己的一些运算符:
算术运算符
需要注意的是:
- MySQL中进行除法运算时,默认
会保留4位小数(无论是否除尽)
- MySQL中0可以当作除数,但是运算结果是null(空值)
比较运算符
和其他语言类似,比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况则返回NULL。
特殊的:
- 其他一些语言比较相等可能用的是==,SQL中是否相等用的是=
- 不等于采用!=或者<>两种方式
- 判断是否相等如果是字符串比较的每一个字母的ASCII码值
- 如果等号两边的值中有一个为NULL,则比较结果为NULL
非符号运算符
注意包括:
运算符 | 功能 |
---|---|
IS NULL(或者ISNULL) | 判断一个值或字符串等是否为空 |
IS NOT NULL | 判断一个值或字符串等是否不为空 |
BETWEEN…AND… | 判断一个值是否在两个值之间(包括两边) |
IN | 判断一个值是否在某一列表中 |
NOT IN | 判断一个值是否不在某一列表中 |
LIKE | 判断一个值是否符合模糊匹配 |
- 判空运算符
注意isnull和is null的
区别
:
- ‘abc’ is null :可看作 值 is null
- isnull(‘abc’):是一个函数,可将值当作参数放到函数中
- ‘abc’ is not null :可理解为abc不是null
- 没有isnotnull(‘abc’)这个函数
- BETWEEN…AND…和IN
between and是闭区间
in后面可以紧跟小括号,也可以隔一个空格
- LIKE
LIKE运算符主要用来匹配字符串,通常用于模糊匹配,如果满足条件则返回1,否则返回0。如果给定的值或者匹配条件为NULL,则返回结果为NULL。
LIKE运算符通常使用如下通配符:
“%”:匹配0个或多个字符。
“_”:只能匹配一个字符。
格式为 字符串 like 匹配规则
匹配规则是模糊匹配,_只能是一个字符,%是没有字符或多个字符
逻辑运算符
运算符 | 功能 |
---|---|
AND(&&) | 逻辑与,两边都为1才为1 |
OR(||) | 逻辑或,两边有一个为1就为1 |
NOT(!) | 逻辑非 |
运算符优先级
和编程语言一样,SQL中运算符也存在优先级
一般单目运算符(小括号>逻辑非>负号)>双目运算符(算术>比较>逻辑与>逻辑或)
条件查询
上面是最简单的sql语句了,下面是条件查询
在上面创建的account表中添加数据:
select
可以用 * 表示所有字段。
select * from account;可以写出具体要查询的列名称
select id,name from account;
FROM 子句
- 后面跟要查的表,表示从那个表里查询
select * from account;WHERE 子句
– 从from获得的表中进行筛选。
– 整型1表示真,0表示假。
– 表达式由运算符和运算数组成。 select * from account where id=1;
提个问题,这里表名和列名都比较短,但当它们都比较长时我们也要一点点的写么,肯定不能,所以要给它们起一个简短的别名
需要注意的是:
as可以省略
给列起的别名,需要用双引号包起来,在查询结果中也会显示列的别名
给表起别名,直接在表名后面写要起的名字,注意没有双引号
一个常用的命令:desc 表名称 用来查看这个表的结果,desc是description描述
内置函数
上面讲到isnull是SQL中的内置函数,MySQL中内置函数主要分为单行函数和聚合函数(多行函数)
单行函数
- 接受参数返回一个结果
- 只对一行进行变换
- 每行返回一个结果
- 可以嵌套(MySQL中聚合函数不能嵌套)
- 参数可以是一列或一个值
内置单行函数非常多,但是使用并不多,这里只介绍几个
函数 | 功能 |
---|---|
FLOOR(x) | 返回小于或等于某个值的最大整数(向下取整) |
CEIL(x) | 返回大于或等于某个值的最小整数(向上取整) |
ROUND(x) | 返回一个对x的值进行四舍五入后,最接近于X的整数(四舍五入) |
CONCAT(s1,s2,…,sn) | 连接s1,s2,…,sn为一个字符串(注意不要使用加号) |
TRIM(s) | 去掉字符串s开始与结尾的空格 |
REVERSE(s) | 返回s反转后的字符串 |
NOW() | 返回当前系统日期和时间 |
IF(value,value1,value2) | 如果value的值为TRUE,返回value1,否则返回value2 |
IFNULL(value1, value2) | 如果value1不为NULL,返回value1,否则返回value2 |
MD5(str) | 返回字符串str的md5加密后的值,也是一种加密方式。若参数为NULL,则会返回NULL |
聚合函数
聚合函数作用于一组数据,并对一组数据返回一个值。
聚合函数类型
- AVG() :括号中是作用的那一组数据(某一列),求这一组数据的平均值
- SUM():求这一组数据的和
- MAX() :求这一组数据的最大值
- MIN() :求这一组数据的最小值
- COUNT():求这一组数据的个数
MySQL中聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。
使用count来统计有多少条数据时,一般使用count(*),而不使用count(列名)
count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
GROUP BY
group by并不是函数,但是当我们用到聚合函数时一般都会搭配上group by进行使用
可以使用GROUP BY子句将表中的数据分成若干组
GROUP BY 字段/别名
以下需配合 GROUP BY 使用:
count 返回不同的非NULL值数目 count(*)、count(字段)
sum 求和
max 求最大值
min 求最小值
avg 求平均值
原表数据不适用于分组查询,在原表的基础上添加两个字段和一条数据:
现在要按照性别进行分组,得到两组,查询分组之后每一组的平均分、最高分和人数:
按照性别分组可分为男女两组,然后分别计算每一组的相应的数据
需要注意的是:
- 查询聚合函数往往给它起个别名,这样查询结果看着更友好
- 使用group by分组时,select查询的要么是分组的字段(这里是sex),要么是聚合函数,不能是其他的
HAVING
过滤分组:HAVING子句
HAVING 不能单独使用,必须要跟 GROUP BY 一起使用
。写在group by的后面,用来查询满足分组条件的组
按照性别分组之后,在分好的组中去查询满足sex=‘男’、最高分>90的组
having和where的区别:
HAVING 子句,条件子句,与 where 功能、用法相同,执行时机不同。
where 在开始时执行检测数据,对原数据进行过滤。
having 对筛选出的结果再次进行过滤。
having 字段必须是查询出来的,where 字段必须是数据表存在的。
where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。
where 不可以使用聚合函数。一般需用聚合函数才会用 having
SQL标准要求HAVING中必须使用 GROUP BY子句中的列或用于聚合函数中的列。
截至这里已经接触了几个关键字了,当一个语句比较复杂用到了多个关键字时,这些关键字的顺序是什么
SELECT -> FROM -> WHERE -> GROUP BY [聚合函数] -> HAVING
ORDER BY
从这里开始,就要规范书写了,关键字大写,表名和字段名小写
使用 ORDER BY 子句排序(DESC要写到字段后面)
- ASC(ascend): 升序(默认)
- DESC(descend):降序
ORDER BY 子句在HAVING的后面
按分数进行升序和降序排列
向表中添加一条数据:
此时1号和5号的score相等,按照score排序,需要指定二级排序,当score相同时再按照age排序
直接在一级排序后面加逗号跟字段名即可
LIMIT
MySQL中使用 LIMIT 实现分页,其他数据库不一样,SQL Server使用TOP
LIMIT子句:限制结果数量子句
将处理好的结果的看作是一个集合,按照记录出现的顺序,索引从0开始
LIMIT [位置偏移量,] 行数
第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。
从第1+1条数据开始,查询3条数据
位置偏移量:(当前页数-1)*每页条数
分页显式公式**:LIMIT(当前页数-1)*每页条数,每页条数**
注意:LIMIT 子句必须放在整个SELECT语句的最后!(在ORDER BY的后面)
查询关键字顺序如下:
SELECT -> FROM -> WHERE -> GROUP BY [聚合函数] -> HAVING ->ORDER BY -> LIMIT
至此简单的查询就完成了,接下来是增删改语句
3. DML
增(INSERT INTO)
INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), ...]
如果要插入的值列表包含所有字段并且顺序一致,则可以省略字段列表。
可同时插入多条数据记录!
和查询不同,DML语句的返回值是受影响行数
执行查询所有:
删(DELETE FROM)
DELETE FROM 表名[ 删除条件子句]
没有条件子句,则会删除全部
改(UPDATE 表 SET)
UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新条件]
可以一次更新多条数据。
如果省略 WHERE 子句,则表中的所有数据都将被更新。
修改数据是 UPDATE 表 SET,表名处在中间
ok,增删改还是比较简单的,记住主要格式就行了
4. DDL
数据库相关操作
SQL | 功能 |
---|---|
SELECT DATABASE(); | 查看当前数据库 |
SELECT now(), user(), version(); | 显示当前时间、用户名、数据库版本 |
CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项数据库选项:CHARACTER SET charset_name(指定库的字符编码,utf8编码) COLLATE collation_name(指定库的排序规则,utf8_general_ci表示不区分大小写) | 创建库 |
SHOW DATABASES | 查看已有库 |
SHOW CREATE DATABASE 数据库名 | 查看当前库信息 |
USE 数据库名; | 使用/切换数据库 |
DROP DATABASE[ IF EXISTS] 数据库名 | 删除库 |
ALTER DATABASE 库名 选项信息(同创建时的选项) | 修改库的选项信息 |
表相关操作
不用全记住,知道怎么创建一个简单的表,查看表结构就行了,其他的用到了再来查看
SQL | 功能 |
---|---|
CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项] | 创建表 |
SHOW TABLES[ LIKE ‘pattern’]或者SHOW TABLES FROM 库名 | 查看所有表 |
SHOW CREATE TABLE 表名 | 查看表的创建信息 |
DESC 表名 | 查看表的结构 |
ALTER TABLE 表名 表的选项 | 修改表本身的选项 |
RENAME TABLE 原表名 TO [库名.] 表名 (可将表移动到另一个数据库) | 对表进行重命名 |
ALTER TABLE 表名 操作名 (操作名见下) | 修改表的字段结构 |
DROP TABLE[ IF EXISTS] 表名 | 删除表 |
TRUNCATE TABLE 表名 | 清空表数据 |
CREATE TABLE 表名 LIKE 要复制的表名 | 复制表结构 |
CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名 | 复制表结构和数据 |
-- 创建表
CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项]
每个字段必须有数据类型
最后一个字段后不能有逗号
TEMPORARY 临时表,会话结束时表自动消失
表的结构定义:
字段名 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string']
-- 表选项
-- 字符集
CHARSET = charset_name
如果表没有设定,则使用数据库字符集
-- 存储引擎
ENGINE = engine_name
SHOW ENGINES -- 显示存储引擎的状态信息
CREATE TABLE dept(
-- int类型,自增
deptno INT(2) AUTO_INCREMENT,
dname VARCHAR(14),
loc VARCHAR(13),
-- 主键
PRIMARY KEY (deptno)
);
5. 数据类型
MySQL中有很多数据类型,但大多不太常用,这里只介绍几种常见的
只需掌握下图中高亮的几个类型即可
类型 | 类型举例 |
---|---|
整数类型 | TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT |
浮点类型 | FLOAT、DOUBLE |
定点数类型 | DECIMAL |
日期时间类型 | YEAR、TIME、DATE、DATETIME、TIMESTAMP |
文本字符串类型 | CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT |
-
整数类型
:一般使用INT
就行-
整型类型在定义表结构时指定所需要的显示宽度,如果不指定,则系统会指定默认的宽度值。
-
一般我们使用INT类型不需要自己去知道它的宽度
-
UNSIGNED:无符号类型(非负),所有的整数类型都有一个可选的属性UNSIGNED(无符号属性),无符号整数类型的最小取值为0。所以,如果需要在MySQL数据库中保存非负整数值时,可以将整数类型设置为无符号类型
-
-
浮点类型(
小数
):一般使用DECIMAL
-
从MySQL 8.0.17开始,FLOAT(M,D) 和DOUBLE(M,D)用法在官方文档中已经明确不推荐使用
-
浮点数类型有个缺陷,就是不精准,问题还是出在 MySQL 对浮点类型数据的存储方式上。
-
MySQL 用 4 个字节存储 FLOAT 类型数据,用 8 个字节来存储 DOUBLE 类型数据。无论哪个,都是采用二进制的方式来进行存储的。比如 9.625,用二进制来表达,就是 1001.101,或者表达成 1.001101×2^3。如果尾数不是 0 或 5(比如 9.624),你就无法用一个二进制数来精确表达。进而,就只好在取值允许的范围内进行四舍五入。
-
因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等
-
使用 DECIMAL(M,D) 的方式表示高精度小数。例如,定义DECIMAL(5,2)的类型,表示该列取值范围是-999.99~999.99。 M也表示总位数,D表示小数位数。未指定时默认为(10,0)
-
定点数在MySQL内部是以
字符串
的形式进行存储,这就决定了它一定是精准的
-
-
日期时间
类型:一般使用DATETIME
DATETIME类型需要
8
个字节的存储空间,可以表示为YYYY-MM-DD HH:MM:SS
在向DATETIME类型的字段插入数据时:
- 以
YYYY-MM-DD HH:MM:SS
格式或者YYYYMMDDHHMMSS
格式的字符串插入DATETIME类型的字段时,最小值为1000-01-01 00:00:00,最大值为9999-12-03 23:59:59。两位数的年份规则中,00到69表示2000到2069;70到99表示1970到1999 - 使用函数
NOW()
,可以向DATETIME类型的字段插入系统的当前日期和时间
- 以
-
文本字符串
类型:一般使用CHAR
或VARCHAR
CHAR和VARCHAR类型都可以存储比较短的字符串。
字符串(文本)类型 特点 长度 长度范围 占用的存储空间 CHAR(M) 固定长度 M 0 <= M <= 255 M个字节 VARCHAR(M) 可变长度 M 0 <= M <= 65535 (实际长度 + 1) 个字节 CHAR类型:
- CHAR(M) 类型一般需要预先定义字符串长度。声明的字段长度即为CHAR类型字段所占的存储空间的字节数。如果不指定(M),默认长度是1个字符
- 如果数据的实际长度比CHAR类型声明的长度小,则会在
右侧填充空格以达到指定的长度
。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格
- char,最多255个字符,与编码无关
VARCHAR类型:
- VARCHAR(M) 定义时,
必须指定
长度M,否则报错。varchar(20):指的是20字符 - 检索VARCHAR类型的字段数据时,会
保留数据尾部的空格
。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节 - varchar 是变长的,需要利用存储空间
保存 varchar 的长度
,如果数据小于255个字节,则采用一个字节来保存长度,反之需要两个字节来保存 - varchar,最多65535字符,与编码有关。utf8 最大为21844个字符,gbk 最大为32766个字符,latin1 最大为65532个字符
- varchar 的最大有效长度由最大长度范围和使用的字符集确定。最大有效长度是65532字节,因为在varchar存字符串时,第一个字节是空的,不存在任何数据,然后还需两个字节来存放字符串的长度,所以有效长度是65535-1-2=65532字节
类型 特点 空间上 时间上 适用场景 CHAR(M) 固定长度 浪费存储空间 效率高 存储不大,速度要求高 VARCHAR(M) 可变长度 节省存储空间 效率低 非CHAR的情况 关于字符编码了解一下就行了
字符集编码 MySQL、数据库、表、字段均可设置编码 数据编码与客户端编码不需一致 SHOW VARIABLES LIKE 'character_set_%' -- 查看所有字符集编码项 SHOW CHARACTER SET [LIKE 'pattern']/SHOW CHARSET [LIKE 'pattern'] 查看所有字符集
6. 列约束
数据完整性是指数据的精确性和可靠性
为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制:
实体完整性
:例如,同一个表中,不能存在两条完全相同无法区分的记录域完整性
:例如:年龄范围0-120,性别范围“男/女”引用完整性
:例如:员工所在部门,在部门表中要能找到这个部门用户自定义完整性
:例如:用户名唯一、密码不能为空等
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后通过 ALTER TABLE 语句规定约束。
约束 | 功能 |
---|---|
PRIMARY KEY | 主键(非空且唯一)约束 |
AUTO_INCREMENT | 自增约束 |
NOT NULL | 非空约束,规定某个字段不能为空 |
UNIQUE | 唯一约束,规定某个字段在整个表中是唯一的 |
FOREIGN KEY | 外键约束 |
DEFAULT | 默认值约束 |
CHECK | 检查约束 |
MySQL不支持check约束
,但可以使用check约束,而没有任何效果
PRIMARY KEY:
-
用来唯一标识表中的一行记录。能
唯一标识记录的字段
,可以作为主键 -
一个表只能有一个主键
-
主键约束相当于唯一约束+非空约束的组合,即主键约束列不允许重复,也不允许出现空值。
-
声明字段时,用
primary key
标识。也可以在字段列表之后声明,下面两种方式二选一create table tab ( id int primary key, stu varchar(10), primary key (id));
-
主键可以由多个字段共同组成。此时必须在字段列表后声明的方法。
create table tab ( id int, stu varchar(10), age int, primary key (stu, age));
-
建表之后增加删除主键约束
ALTER TABLE tab ADD PRIMARY KEY(字段列表); ALTER TABLE tab DROP PRIMARY KEY;
AUTO_INCREMENT:
-
自动增长必须是主键或unique列
,数据类型必须是整数类型 -
只能存在一个字段为自动增长。
-
默认为1开始自动增长。可以建表时通过表属性 auto_increment = x进行设置,或建表后通过alter table tbl auto_increment = x;
create table employee( id int primary key auto_increment, ename varchar(20) ); 建表后 alter table employee modify id int auto_increment; 删除 alter table employee modify id int; 去掉auto_increment相当于删除
NOT NULL
-
限定某个字段/某列的值不允许为空
-
添加非空约束
CREATE TABLE emp( id INT(10) NOT NULL, name VARCHAR(20) NOT NULL, ); 建表后 ALTER TABLE emp MODIFY sex VARCHAR(30) NOT NULL; 删除 ALTER TABLE emp MODIFY sex VARCHAR(30); 去掉not null,该字段允许为空
UNIQUE
-
用来限制某个字段/某列的值不能重复
-
唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一
-
唯一性约束允许列值为NULL
,因为NULL!=NULLCREATE TABLE emp( id INT UNIQUE, name VARCHAR(20) UNIQUE, ); 表级约束 CREATE TABLE USER( id INT NOT NULL, NAME VARCHAR(25), PASSWORD VARCHAR(16), -- 使用表级约束语法 CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD) CONSTRAINT uk_name_pwd表示给约束起名字 ); 表示用户名和密码组合不能重复 建表后 ALTER TABLE USER ADD [CONSTRAINT uk_name_pwd] UNIQUE(NAME,PASSWORD); 方式与添加主键约束类似 或者 ALTER TABLE USER MODIFY NAME VARCHAR(20) UNIQUE; 方式与添加非空和自增约束类似 删除 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。 ALTER TABLE USER DROP INDEX uk_name_pwd; 与删除主键约束类似 注意此处是INDEX,因为删除唯一约束只能通过删除唯一索引的方式删除,唯一索引名就和唯一约束名一样
FOREIGN KEY
一般不会使用外键约束,这里不作介绍
DEFAULT
-
给某列指定默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。
-
默认值约束一般不在唯一键和主键上加
CREATE TABLE emp( id INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(15), sex CHAR(2) default '男', salary DOUBLE(10,2) DEFAULT 2000 ); 建表后 alter table employee modify sex char default '男'; 方式和上面类似 删除 alter table employee modify gender char;
CHECK
-
检查某个字段的值是否符合要求,一般指的是值的范围
-
MySQL 5.7 不支持,MySQL 8.0中支持check约束
CREATE TABLE emp( id INT AUTO_INCREMENT, NAME VARCHAR(20), sex char(2) check(sex in(‘男’,’女’)) age INT CHECK(age > 20), PRIMARY KEY(id) );
四、连接MySQL
1. Java连接
见之前写的关于Java连接MySQL具体操作
2. Python连接
使用的是Python3.8,工具为pycharm
- 下载pymysql库
- 在pycharm的终端窗口安装pymysql库,用来操作MySQL数据库
- 使用
清华源
进行下载速度更快 ,参考如下:
使用清华源
操作见下,以查询操作为例,其他操作类似
import pymysql # 导入相关库
# 获取一个MySQL连接对象,需要指定四个参数
connection=pymysql.connect(host="localhost", # host表示要连接MySQL所在的主机ip,自己电脑ip就是localhost
user="root", # user是一个MySQL的用户,我们默认root用户就行
password="jfc", # MySQL密码
db="account") # 要连接哪个库
cursor=connection.cursor() # 获取游标对象,连接对象只是连接上了,但是要通过游标对象操作数据库
sql="SELECT * FROM account" # 写sql语句
cursor.execute(sql) # 使用游标对象来执行sql语句,使用execute,传入参数为sql
while True: # 这里我需要查询account表中的所以数据
# 使用execute()函数得到的只是受影响的行数,对于查询操作需要使用fetchone或fetchall来获取数据
res=cursor.fetchone() # fetchone每次获取一行数据,每fetchone一次,游标就会向下移动一行,下一次fetchone就是下一行数据
if res is None: # 当没有下一条数据时直接退出循环
break
print (res) # 每查询一条数据就打印这条数据
# 使用fetchall来查询所有数据
res=cursor.fetchall()
print(res)
# 最后记得关闭游标和连接
cursor.close()
connection.close()
查询结果如下(fetchone):
查询结果如下(fetchall):
结束
本文是学习了几个教程之后总感觉学的很空所以打算记录一下,这里只是MySQL的基础部分,高级部分感觉短时间内用不上而且没有什么应用场景以后有时间再更新,欢迎指正。 ——22.7.9