个人理解可能存在偏差,仅为参考文档;一切以官方文档为准~。
数据库
什么是数据库
按照一定数据结构来组织和存储数据的仓库
数据库应用场景:数据量庞大繁多。
什么是数据表
一个数据库可包含多张数据表,一张表可包含多个字段。
一个数据表必须有表名 字段名 字段的数据类型,虽然理论上约束类型是可有可无的,但实际开发中都会书写字段的约束类型。(规范标准)
数据库分类
网状数据库
层次型数据库
关系型数据库(RDBMS)
关系型数据库管理系统,大多采用C/S或B/S的形式
常见的关系型数据库
SQLite
微型数据库,常用于移动设备
MySQL
开源中小型数据库,可用于各种操作系统(AB公司开发>SUN公司收购>Oracle公司收购)oracle分支 mysql
Martin分支 MariaDB
PostgreSQL
开源中小型数据库
SQL Server
微软公司开发的中型数据库,只用于Windows系统
Oracle
Oracle公司开发的中大型数据库,可用于各种操作系统
DB2
IBM公司开发的中大型数据库,常与IBM服务器搭配(银行用的较多)
非关系型数据库(NoSQL)
Redis
MongoDB
MySQL
LAMP组合(Linux + Apache + MySQL + PHP)是目前最流行的开源服务器端技术之一,尤其适合于中小型站点、需要快速部署的Web应用。
XAMPP:服务器套装(内包含了Apache、MySQL等#....)
SQL:结构化查询语言,专门用于操作关系型数据库服务器
MySQL部署结构
服务器端:启动服务(
./xampp/mysql/bin/mysqld.exe
)客户端:连接服务器(
./xampp/mysql/bin/mysql.exe
)
MySQL类型
数字类型
TINYINT
-128~127 占1字节例如:
TINYINT(5)
,其中5表示格式,如3会显示就是00003
SMALLINT
-32768~32767 占2字节
INT
-2147483648~2147483647 占4字节
BIGINT
-9223372036854775808~9223372036854775807 占8字节
FLOAT[(总有效位数,小数点后面允许的有效位数)]
单精度。占用4个字节存储空间
DOUBLE[(总有效位数,小数点后面允许的有效位数)]
双精度。占用8个字节存储空间
DECIMAL[(总有效位数,小数点后面允许的有效位数)]
定点类型。严格定点数,用于保存精确小数
如:DECIMAL(6,2) #9999.99
小数取整
ROUND(小数)
布尔类型
BOOL
或BOOLEAN
取值TRUE、FALSE,也可以1、0INSERT INTO `laptop` VALUES('MacBook Air',6899,TRUE,30);
字符串类型
CHAR(长度)
定长字符串,不够会用\0补齐。最大长度255个字符(最多只能存255个字符)超出设置长度的字符会被去掉
VARCHAR(长度)
可变长度的字符串。最大长度65535个字符(实际上并不一定能存65535个字符)
TEXT(长度)
可变长度的字符串,比VARCHAR
更长。长度可达2^32(4G)个字符
举例说明
CHAR(5)
和VARCHAR(5)
的区别:
CHAR(5) VARCHAR(5) a a\0\0\0\0 a\0 ab ab\0\0\0 ab\0 abcde abcde abcde 一二 一二\0\0\0 一二\0
一般固定长度字符使用
CHAR
,可变长度的字符用VARCHAR
,因为操作CHAR
速度要比VARCHAR
要快些。
日期时间类型
DATE
日期类型,范围1000-01-01
到9999-12-31
TIME
时间类型,范围00:00:00
到23:59:59
DATATIME
日期时间类型,支持范围1000-01-01 00:00:00
到9999-12-31 23:59:59
由于不同系统日期时间类型表示范围不完全一样,不同语言区域的默认日期格式也不一样;推荐使用BIGINT来存储日期时间。
NULL
表示空,在插入数据的时候,表示无法确定的数据,例如无法确定商品的规格,上架时间
INSERT INTO `laptop` VALUES
(1,'MacBook Air',6999,'双核I5',TRUE,'2019-12-31','详情1',20),
(2,'小米 Air',4379,'轻薄版',1,'2020-02-16',NULL,30)
);
查询是否为NULL
数据的方法参考:NULL值查询
MySQL常用管理命令
使用客户端连接服务器端
在xampp的shell命令下输入
mysql.exe -h地址 -P端口 -u用户名 -p密码
-h
host 主机,服务器的地址或域名(IP为127.0.0.1时,写错成127.0.x.x 会自动纠正并连接成功)
-P
port 端口号(一般MySQL默认端口号为3306)
-u
user 用户 root为管理员用户除root以外都是来宾用户,一般平时开发中都不会使用管理员账号
root
(user写错时,也会自动纠正并连接成功)
-p
password 密码 xampp下root的密码为空
如:IP为127.0.0.1,端口号3306,用户为管理员root,密码为空
mysql.exe -h127.0.0.1 -P3306 -uroot -p
以上的cmd管理命令可做以下简化:
IP为127.0.0.1,可省略
MySQL默认Port为3306,可省略
密码为空,可省略
mysql.exe可简化成mysql因此,cmd管理命令可简化,直接敲:
mysql -uroot
*注意:连接数据库的命令无需加;
当连接上数据库后,在数据库中交互的命令都需要加;
以示结束。
导入脚本
在没进入数据库情况下,使用mysql -uroot < 脚本完整路径
导入脚本,前提是要先设置好系统环境变量
mysql -uroot < C:/Script/01.sql
在已进入数据库情况下,使用source 脚本完整路径
导入脚本。
source C:/Script/01.sql
退出连接
QUIT;
退出服务器连接
当前数据库服务器下所有的数据库
SHOW DATABASES;
显示当前数据库服务器下所有的数据库
进入数据库
USE 数据库名;
进入指定数据库
USE `xz`;
显示当前数据表
SHOW TABLES;
显示当前数据库中所有数据表
查看当前表中数据的结构
DESC 表名;
(describe)描述表的结构
DESC `info`;
查看创建表所用命令
SHOW CREATE TABLE 表名;
查看创建表所用命令
注释
单行注释
#注释
多行注释
/* 注释 */
如:
mysql -uroot <C:/script/01.sql01.sql
#SHOW DATABASES;
/*
SHOW DATABASES;
*/
SHOW DATABASES;
USE `new01`;
SHOW TABLES;
字段或列的注释是用属性comment来添加。
创建新表的脚本时,可在字段定义脚本中添加comment属性来添加注释。
CREATE TABLE `user`(
`id` INT KEY AUTO_INCREMENT COMMENT "id",
`name` VARCHAR(30) COMMENT "姓名",
`age` VARCHAR(30) COMMENT "年龄",
`sex` TINYINT(30) COMMENT "性别0代表男,1代表女",
`job` VARCHAR(30) COMMENT "工作",
`addr` VARCHAR(255) COMMENT "地址",
`sal` INT(255) COMMENT "工资"
) DEFAULT CHARACTER SET UTF8 COMMENT "测试表";
SQL语句规范
关键字内容大写;数据库名,数据表名,字段名小写。
必须使用英文分号(;)结尾,代表语句已经结束。
数据库名、数据表名、字段名 必须使用反引号
包裹。
SQL语句分类
DDL(Data Define Language) 定义数据的结构
DML(Data Manipulate Language) 操作数据,即增删改
DQL(Data Query Language) 查询数据
DCL(Data Control Language) 控制用户的权限(grant 授权/ revoke 收权)
DDL DML DQL DCL CREATE INSERT SELECT GRANT DROP DELETE REVOKE ALTER UPDATE TRUNCATE
数据库操作
创建数据库/数据表
创建数据库
CREATE DATABASE 数据库名;
CREATE DATABASE `baidu`;
CREATE DATABASE `xuezi` CHARSET UTF8;
CREATE TABLE `emp`(id INT,name VARCHAR(32));
创建数据表
CREATE TABLE `表名1`;
CREATE TABLE `表名2`(
`字段名称` 数据类型 约束类型,
`字段名称` 数据类型 约束类型,
#...
)CHARSET UTF8;
如:
CREATE TABLE `student`(
`sid` INT,
`name` VARCHAR(8),
`garden` VARCHAR(1)
)CHARSET UTF8;
丢弃数据库/数据表
DROP DATABASE 数据库名;
DROP TABLE 数据表名;
DROP DATABASE IF EXISTS `baidu`; #丢弃,如果存在
DROP TABLE `emp`;
一般先判断是否存在数据库,存在先丢弃再创建新的数据库。
修改数据库对象的定义
ALTER
截断表中所有记录
TRUNCATE
插入数据
INSERT INTO 数据表名(字段名) VALUES(数据1);
指定字段插入指定值
INSERT INTO 数据表名 VALUES(数据1),(数据2),(数据3)#.....;
INSERT INTO `student`(`name`) VALUES ('xiaoming');
INSERT INTO `students` VALUES('1','dangdang','123456','h');
INSERT INTO `students` VALUES('1','kangkang','123456','h'),('2','bibi','123456','h'),('3','dudu','123456','h');
删除数据
DELETE FROM 表名 WHRER 条件;
DELETE FROM `students` WHRER sid>3;
修改数据
UPDATE 表名 SET 字段名=值,字段名=值,#... WHERE 条件;
UPDATE `product` SET `price` = `price`+ 3,`num` = 35, onmarket = y WHERE sid = 5;
数据查询
简单查询
在表中所有的列去查询
SELECT * FROM 表名 WHERE 条件;
查询特定的列
SELECT 字段名 FROM 表名 WHERE 条件;
给列起别名
SELECT 字段名1 AS 别名1,字段名2 AS 别名2,#..... FROM 表名;
SELECT ename AS 姓名 FROM `emp`;
AS
关键字其实可以省略
SELECT ename 姓名,eage 年龄,esex 性别 FROM `emp`;
/*加上每个员工的工资增长2000,年终奖30000,查询出所有员工的姓名和年薪,使用一个字母作为别名*/
SELECT `ename` e,(`salary` + 2000) * 12 + 30000 b FROM `emp`;
只查询显示不同记录
SELECT DISTINCT 字段名 FROM 表名;
SELECT DISTINCT sex FROM `emp`; #只显示sex列中不同的记录,相同则合并
#得到结果:
#男
#女
查询时执行计算
SELECT salary*12 FROM `emp`;
查询结果集排序
SELECT * FROM 表名 ORDER BY 字段名1,字段名2#... 排序方式;
排序方式:
ASC
:升序(默认)
DESC
:降序
#按照工资排序
SELECT * FROM `emp` ORDER BY `salary` ASC;
SELECT * FROM `emp` ORDER BY `salary` DESC;
#如果工资相同,按照姓名排序
SELECT * FROM `emp` ORDER BY `salary`,`ename` DESC;
条件逻辑查询
SELECT * FROM 表名 WHERE 条件;
SELECT * FROM `emp` WHERE ename='king';
因为两个NULL
是不等的,因此,
若需查找是否为NULL
的列应使用IS NULL
、IS NOT NULL
;而不是用比较符号=
或!=
SELECT * FROM `emp` WHERE ename IS NULL;
SELECT * FROM `emp` WHERE ename IS NOT NULL;
同时条件(逻辑与)AND
SELECT * FROM `emp` WHERE ename>=5000 AND ename<=7000;
在两者之间 BETWEEN 值 AND 值
#查询在5000到7000之间
SELECT * FROM `emp` WHERE salary BETWEEN 5000 AND 7000;
#查询不在5000到7000之间
SELECT * FROM `emp` WHERE salary NOT BETWEEN 5000 AND 7000;
或 OR
SELECT * FROM `emp` WHERE ename<5000 OR ename>7000;
在#...之间 IN
#在20-30之间
SELECT * FROM `emp` WHERE deptld IN(20,30);
#不在20-30之间
SELECT * FROM `emp` WHERE deptld NOT IN(20,30);
模糊条件查询
LIKE %要查的关键字%
%
代表0个或者多个字符
_
代表一个字符
以上两个匹配符使用必须结合LIKE
关键字使用
#查询员工姓名中包含有字母e的有哪些
SELECT * FROM `emp` WHERE ename LIKE '%e%';
#得到结果:
#Jerry、Peter、Freda、Jone
#查询员工姓名中倒数第二个为e的有哪些
SELECT * FROM `emp` WHERE ename LIKE '%e_';
分页查询
用于定量分页进行查询。
SELECT * FROM emp LIMIT 每页开始查询的值,每页的数据量
注意:开始查询的值是索引下标,是从0开始计的。
每页起始索引 =(当前页码-1) 每页的条数*
每页m个条数,第n页开始索引=(n-1)* m
注意:
①limit后开始查询的值只能写计算结果,不能写计算过程。
②limit后的两个值必须是数值,不能加引号。
#每页显示5个数据
#第一页
SELECT * FROM `emp` LIMIT 0,5;
#第二页
SELECT * FROM `emp` LIMIT 5,5; #(2-1)*5=5
#第三页
SELECT * FROM `emp` LIMIT 10,5; #(3-1)*5=10
#...
#查询值为3到12的数据
#开始下标3-1=2
#要查询的数据量12-3+1=10(因为下标,所有要+1)
SELECT * FROM `emp`
[WHERE #...]
[ORDER BY #...]
LIMIT start,count;
复杂查询
聚合查询
用于特殊计算,共有五个聚合函数:MAX()
MIN()
SUM()
COUNT()
AVG()
#查询指定列上的最大值
SELECT MAX(salary) FROM `emp`; #查询工资最大值
#查询指定列上的最小值
SELECT MIN(salary) FROM `emp`; #查询工资最小值
SELECT AVG(salary) FROM `emp`; #平均工资
*注意:利用COUNT
查询个数时,有可能包含NULL
值而造成误差,选择列时应要避免此情况发生
其实在mysql中还有很多函数,例如:
获取日期中的年份
SELECT YEAR('1993-8-7');
SELECT * FROM `emp` WHERE YEAR(birthday) = 1993;
分组查询
根据依据查询指定列
分组一般是使用有共性的数据,比如按性别分组、部门分组等...
SELCET 需要的查询的列1,需要的查询的列2#... FROM 表名 GROUP BY 作为依据的列;
#依据部门来查询sex列和ename列数据
SELECT sex,ename FROM `emp` GROUP BY deptId;
#结果:只显示sex列和ename的结果
子查询
将一个查询语句嵌套在另外一个查询语句中,把内层语句的查询结果作为外层语句的查询条件继续查询。
内层语句需要使用括号包裹
#表dept CREATE TABLE `dept`( did INT PRIMARY KEY, dname VARCHAR(8) ); INSERT INTO `dept` VALUES(10,'研发部'); INSERT INTO `dept` VALUES(20,'市场部'); INSERT INTO `dept` VALUES(30,'运营部'); #表emp CREATE TABLE `emp`( eid INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(8), sex BOOLEAN DEFAULT TRUE, birthday DATE, salary DECIMAL(7,2) NOT NULL, deptId INT, FOREIGN KEY(deptId) REFERENCES `dept`(did) #deptId绑定dept表的did ); INSERT INTO `emp` VALUES(1,'tom',1,'1997-4-21',8500,10); INSERT INTO `emp` VALUES(2,'lisa',0,'1998-6-6',7600,20); INSERT INTO `emp` VALUES(3,'mako',1,'1999-3-29',8600,10); INSERT INTO `emp` VALUES(NULL,'ride',1,'1998-5-7',9600,20); INSERT INTO `emp` VALUES(NULL,'karli',1,'1997-9-21',9600,20); INSERT INTO `emp` VALUES(NULL,NULL,0,'1998-7-12',7600,10); INSERT INTO `emp` VALUES(NULL,'malia',0,'1997-11-29',9600,20);
#查询比tom工资高的 SELECT * FROM `emp` WHERE `salary`>=(SELECT `salary` FROM `emp` WHERE `ename`='tom');
注意:有时候子查询的时候会出现包含自己的情况
#查询和tom同一年出生的,且不是tom
SELECT * FROM `emp` WHERE YEAR(`birthday`) = (SELECT YEAR(`birthday`) FROM `emp` WHERE `ename`='tom') AND `ename`!='tom';
联合查询
创建具有可以联合查询的表(要求联合查询
多表查询
例:查询出所有员工姓名及其部门名称(沿用上面子查询的数据)
SELECT ename,dname FROM `emp`,`dept`; #得到结果 #TOM 运营部 #TOM 市场部 #TOM 研发部 #lisa 运营部 #lisa 市场部 #lisa 研发部 ##... #会出现笛卡尔积错误 #为了避免笛卡尔积,应该添加条件 SELECT ename,dname FROM `emp`,`dept` WHERE deptId=did; #TOM 研发部 #lisa 市场部 ##... #但此时无法查询出没有部门的员工,也不能查询出没有员工的部门。(NULL值时) #即INSERT INTO `emp` VALUES(NULL,NULL,0,'1998-7-12',7600,10);是无法查询到的 #INSERT INTO `dept` VALUES(30,'运营部');由于这个部门没有员工,所以也查不到
如果多个表中出现列名称相同,写列名称的时候,前边带着表名称
SELECT emp.name,dept.name from emp, dept WHERE emp.deptId = dept.did;
/*或者*/
SELECT `emp`.`name`,`dept`.`name` from `emp`,`dept` WHERE `emp`.`deptId` = `dept`.`did`;
内连接
INNER JOIN
只连接相匹配的行,具有排他性,返回表的交集
表名1 INNER JOIN 表名2 ON 表名1
SELECT ename,dname FROM `emp` INNER JOIN `dept` ON deptId=did; #表名1 INNER JOIN 表名2 #表名1和表名2连接
但此时无法查询出没有部门的员工,也不能查询出没有员工的部门。也就是说包含NULL值的都不显示。
要想显示NULL值,应根据选择用以下 左外连接 或者 右外连接 或者 全连接。
左外连接
SELECT ename,dname FROM `emp` LEFT OUTER JOIN `dept` ON deptId=did; #左外连接:显示左边表中所有的记录,即使右边表没有对于的值(无论是否NULL) #这里emp表先写,即为左边的表
此时 emp 表中为NULL的值也能显示,但dept表中为NULL的值无法获取
右外连接
SELECT ename,dname FROM `emp` RIGHT OUTER JOIN `dept` ON deptId=did; #右外连接:显示右边表中所有的记录,即使左边表没有对于的值(无论是否NULL) #这里dept为右边的表
此时 dept 表中为NULL的值也能显示,但emp表中为NULL的值无法获取
左外连接和右外连接中可以省略outer
关键字
SELECT ename,dname FROM `emp` LEFT JOIN `dept` ON deptId=did;
全连接
mysql不再支持全连接
要使两边的NULL值都显示,应使用 全连接 将左右表NULL值相同部分合并(或不合并)方式并显示出来。
UNION
合并相同的记录
UNION ALL
不合并相同的记录
(SELECT ename,dname FROM `emp` LEFT OUTER JOIN `dept` ON deptId=did;)
UNION
(SELECT ename,dname FROM `emp` RIGHT OUTER JOIN `dept` ON deptId=did;)
#此时 dept表和emp表所有值都将显示(包括NULL)
#得到结果
#TOM 研发部
#lisa 市场部
##...
#NULL 研发部
#malia 市场部
数据库的编码
默认数据库编码为ASCII
码(美国信息交换标准代码),当填入中文信息时会出现乱码。
ASCII
码仅支持英文等少数字符,除此之外,都会显示乱码;若想支持中文,可以用GBK码,但GBK只是在ASCII上增加中文;所以一般都使用国际通用的UTF8码(万国码)。
解决MySQL中文乱码
①SQL脚本文件另存为
UTF8
格式②设置客户端连接服务器端编码为UTF8
SET NAMES UTF8;
③在数据库创建时,设置存储的编码为UTF8
CHARSET=UTF8;
SET NAMES UTF8; #丢弃数据库,如果存在的话 DROP DATABASE IF EXISTS `xz`; #创建新的数据库 CREATE DATABASE `xz` CHARSET=UTF8;
CMD窗口的编码:右键属性可查看
CMD:Windows下的命令窗口
临时修改CMD窗口编码为utf8:输入命令
chcp 65001
SET collation_server=utf8_general_ci;
显示当前cmd编码
SHOW VARIABLES LIKE '%character%';
约束类型
用于解决列数据重复问题。例如:在开发中,学员的id,是唯一的,就需要进行约束。
列约束的分类
主键约束(常用)
非空约束(常用)
唯一约束(常用)
检查约束
外键约束(常用)
默认值约束(常用)
自增列
主键约束
[PRIMARY] KEY
PRIMARY
关键字可写可不写
声明为主键的列,必须唯一,不能为空NULL,无主键时,数据是无序的,因此主键的好处是可以加快操作速度。
主键值能为表中的内容做唯一标识
表与表之间的关联,也需要使用主键约束
#...
uid INT KEY,
#...通常都会配合自增(AUTO_INCREMENT)使用。
CREATE TABLE `user`(
uid INT KEY AUTO_INCREMENT,
#....
);
表中所有数据行默认按照主键上的值由小到大排列存储,所以一个表中最多只能有一个列声明为“主键列”;推荐为每个表都设置一个主键列。
声明为主键约束的列在desc 表名
命令的查询时,Key
这一项会显示为PRI
。
一般自增列的数据不需要直接给出。
平时插入数据推荐一条一条的插入,多条插入会出现无视主键约束的情况。
CREATE TABLE `laptop`(
lid INT,
title VARCHAR(64) PRIMARY KEY, #title列已设置主键约束,不能为NULL
price DECIMAL(7,2)
);
#不推荐的方法
#多条数据插入
INSERT INTO `laptop` VALUES
(1,'MacBook Air',6999),
(2,NULL,6999), # <----这条数据插入时,将无视title列设置的主键约束
(3,'灵越 E700',6999);
#推荐的方法
#一条一条插入,数据会遵守title列的约束
INSERT INTO `laptop` VALUES(1,'MacBook Air',6999);
INSERT INTO `laptop` VALUES(2,NULL,6999); # <-----这条数据在提交脚本时这里会报错
INSERT INTO `laptop` VALUES(3,'灵越 E700',6999);
非空约束
NOT NULL
限定指定列上的值不能为NULL
CREATE TABLE `user`(
#...
loginPwd VARCHAR(32) NOT NULL,
#...
);
唯一约束
UNIQUE
限定指定列的值不能出现重复值,可为空(NULL),且可出现多个NULL
之所以插入多个NULL
也可以,是因为NULL
不相等,插入的NULL就成了插入空字符串
CREATE TABLE `user`(
fid INT KEY,
loginName VARCHAR(32) UNIQUE,
);
INSERT INTO `user` VALUES(1,NULL,3999);
INSERT INTO `user` VALUES(2,NULL,6999);
如果不想为空,则加一个NOT NULL
条件即可
loginName VARCHAR(32) UNIQUE NOT NULL
声明为主键约束的列在desc 表名
命令的查询时,Key
这一项会显示为UNI
。
检查约束
mysql不再支持检查约束
检查约束会严重影响数据的插入,平时一般不使用。像用户注册等操作的验证一般在js中完成
CHECK
限定指定列上的值不能为NULL
CREATE TABLE `user`(
#...
sex CHAR(3) CHECK(sex='男' OR sex='女'),
#...
);
外键约束
作用:指定本表某个列必须在符合另一个表的规定值,允许使用NULL值
例如:员工表的部门列数据必须是在部门表中有的值,否则报错
FOREIGN KEY 字段名 REFERENCES 外表字段名
CREATE TABLE `dept`(
`did` INT PRIMARY KEY, #必须声明为PRIMARY KEY,否则报错
`dname` VARCHAR(8)
);
INSERT INTO `dept` VALUES(10,'研发部');
INSERT INTO `dept` VALUES(20,'市场部');
CREATE TABLE `emp`(
`eid` INT PRIMARY KEY,
`ename` VARCHAR(8) UNIQUE,
`sex` BOOLEAN,
`deptId` INT,
FOREIGN KEY(`deptId`) REFERENCES `dept`(`did`) #要求deptId列的值必须在dept的did列中要有,且类型一致,否则报错。
);
INSERT INTO `emp` VALUES(2,'xiaoli',0,50); # <------这里的50在did中没有,因此会报错
INSERT INTO `emp` VALUES(1,'xiaoli',0,NULL); # <------允许使用NULL值
*注意:本表外键约束的列 在另一个表中所要求符合的列,必须要声明为主键约束,否则报错
默认值约束
指定当列上未明确指定值时所使用的默认值
DEFAULT
#创建时使用默认值
CREATE TABLE `userOrder`(
oid INT PRIMARY KEY,
price DECIMAL(10,2) DEFAULT 0,
status VARCHAR(32) DEFAULT '等待付款'
);
#插入数据行时使用默认值
INSERT INTO `userOrder` VALUES(9513,DEFAULT,DEFAULT);
#插入数据行时未明确指定值的列将使用默认值
INSERT INTO `userOrder`(oid) VALUES(9514);
自增列
用于自动增加的序列。
若主键列是整数类型,则同时可以声明此列上的值为“自动增长”——插入数据时未指定值或者指定为NULL值,则默认就会生成一个在当前最大值基础上+1的下一个整数值。
CREATE TABLE `user`(
uid INT PRIMARY KEY AUTO_INCREMENT, #uid为自增列
uname VARCHAR(32)
);
INSERT INTO `user` VALUES(NULL,50,'TOM');
INSERT INTO `user` VALUES(NULL,'MARY'); #NULL值,uid会自动+1,uid=51
INSERT INTO `user`(uname) VALUES(NULL,'TOM'); #uid自动+1,uid=52
*注意:删除列数据,自增列的序号将不会被回收
#....
INSERT INTO `user` VALUES(50,'TOM');
INSERT INTO `user`(uname) VALUES('TOM');
DELETE FROM `user` WHERE uid=51;
INSERT INTO `user` VALUES(NULL,'JOE'); #uid=51的数据被删除,但uid=51并不会被回收,因此这里再次插入时uid=52
*注意:自增列只在最大值上+1
#....
INSERT INTO `user` VALUES(NULL,3,'JERRY');
INSERT INTO `user` VALUES(NULL,15,'SALI');
INSERT INTO `user` VALUES(NULL,'MARY'); #此时的uid+1,uid=16,而不是4
补充
CREATE TABLE `user`(
uid INT PRIMARY KEY AUTO_INCREMENT, #uid为自增列
uname VARCHAR(25), #uname长度25
upwd VARCHAR(32) #upwd长度32
);
CREATE TABLE `product`(
pname VARCHAR(255), #uname长度255
price DECIMAL(10,2) #
);
给密码加密
CREATE TABLE `user`(
uid INT PRIMARY KEY AUTO_INCREMENT,
uname VARCHAR(25),
upwd VARCHAR(32) #密码 长度32
);
# md5(字符串) 加密该数据
INSERT INTO `user` VALUES(NULL,15,md5('hg2_42$82m&2'));
标签:INSERT,笔记,查询,学习,VALUES,emp,MySQL,NULL,SELECT
From: https://www.cnblogs.com/myotsuki/p/16773390.html