MySQL学习笔记

个人理解可能存在偏差,仅为参考文档;一切以官方文档为准~。

1|0数据库

1|1什么是数据库

按照一定数据结构来组织和存储数据的仓库

数据库应用场景:数据量庞大繁多。

1|2什么是数据表

一个数据库可包含多张数据表,一张表可包含多个字段。

一个数据表必须有表名 字段名 字段的数据类型,虽然理论上约束类型是可有可无的,但实际开发中都会书写字段的约束类型。(规范标准)

1|3数据库分类

1|0网状数据库

1|0层次型数据库

1|0关系型数据库(RDBMS)

关系型数据库管理系统,大多采用C/S或B/S的形式

1|0常见的关系型数据库

SQLite 微型数据库,常用于移动设备

MySQL 开源中小型数据库,可用于各种操作系统(AB公司开发>SUN公司收购>Oracle公司收购)

oracle分支 mysql

Martin分支 MariaDB

PostgreSQL 开源中小型数据库

SQL Server 微软公司开发的中型数据库,只用于Windows系统

Oracle Oracle公司开发的中大型数据库,可用于各种操作系统

DB2 IBM公司开发的中大型数据库,常与IBM服务器搭配(银行用的较多)

1|0非关系型数据库(NoSQL)

Redis

MongoDB

2|0MySQL

LAMP组合(Linux + Apache + MySQL + PHP)是目前最流行的开源服务器端技术之一,尤其适合于中小型站点、需要快速部署的Web应用。

XAMPP:服务器套装(内包含了Apache、MySQL等#....)

SQL:结构化查询语言,专门用于操作关系型数据库服务器

2|1MySQL部署结构

服务器端:启动服务(./xampp/mysql/bin/mysqld.exe

客户端:连接服务器(./xampp/mysql/bin/mysql.exe

2|2MySQL类型

1|0数字类型

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

1|0小数取整

ROUND(小数)

1|0布尔类型

BOOLBOOLEAN 取值TRUE、FALSE,也可以1、0

INSERT INTO `laptop` VALUES('MacBook Air',6899,TRUE,30);

1|0字符串类型

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要快些。

1|0日期时间类型

DATE 日期类型,范围1000-01-019999-12-31

TIME 时间类型,范围00:00:0023:59:59

DATATIME 日期时间类型,支持范围1000-01-01 00:00:009999-12-31 23:59:59

由于不同系统日期时间类型表示范围不完全一样,不同语言区域的默认日期格式也不一样;推荐使用BIGINT来存储日期时间。

1|0NULL

表示空,在插入数据的时候,表示无法确定的数据,例如无法确定商品的规格,上架时间

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值查询

2|3MySQL常用管理命令

1|0使用客户端连接服务器端

在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

*注意:连接数据库的命令无需加;

当连接上数据库后,在数据库中交互的命令都需要加;以示结束。

1|0导入脚本

在没进入数据库情况下,使用mysql -uroot < 脚本完整路径 导入脚本,前提是要先设置好系统环境变量

mysql -uroot < C:/Script/01.sql

在已进入数据库情况下,使用source 脚本完整路径 导入脚本。

source C:/Script/01.sql

1|0退出连接

QUIT; 退出服务器连接

1|0当前数据库服务器下所有的数据库

SHOW DATABASES; 显示当前数据库服务器下所有的数据库

1|0进入数据库

USE 数据库名; 进入指定数据库

USE `xz`;

1|0显示当前数据表

SHOW TABLES; 显示当前数据库中所有数据表

1|0查看当前表中数据的结构

DESC 表名; (describe)描述表的结构

DESC `info`;

1|0查看创建表所用命令

SHOW CREATE TABLE 表名; 查看创建表所用命令

1|0注释

单行注释 #注释

多行注释 /* 注释 */

如:

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 "测试表";

2|4SQL语句规范

关键字内容大写;数据库名,数据表名,字段名小写。

必须使用英文分号(;)结尾,代表语句已经结束。

数据库名、数据表名、字段名 必须使用反引号包裹。

2|5SQL语句分类

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

2|6数据库操作

1|0创建数据库/数据表

1|0创建数据库

CREATE DATABASE 数据库名;

CREATE DATABASE `baidu`; CREATE DATABASE `xuezi` CHARSET UTF8; CREATE TABLE `emp`(id INT,name VARCHAR(32));

1|0创建数据表

CREATE TABLE `表名1`; CREATE TABLE `表名2`( `字段名称` 数据类型 约束类型, `字段名称` 数据类型 约束类型, #... )CHARSET UTF8;

如:

CREATE TABLE `student`( `sid` INT, `name` VARCHAR(8), `garden` VARCHAR(1) )CHARSET UTF8;

1|0丢弃数据库/数据表

DROP DATABASE 数据库名;

DROP TABLE 数据表名;

DROP DATABASE IF EXISTS `baidu`; #丢弃,如果存在 DROP TABLE `emp`;

一般先判断是否存在数据库,存在先丢弃再创建新的数据库。

1|0修改数据库对象的定义

ALTER

1|0截断表中所有记录

TRUNCATE

1|0插入数据

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');

1|0删除数据

DELETE FROM 表名 WHRER 条件;

DELETE FROM `students` WHRER sid>3;

1|0修改数据

UPDATE 表名 SET 字段名=值,字段名=值,#... WHERE 条件;

UPDATE `product` SET `price` = `price`+ 3,`num` = 35, onmarket = y WHERE sid = 5;

1|0数据查询

1|0简单查询

1|0在表中所有的列去查询

SELECT * FROM 表名 WHERE 条件;

1|0查询特定的列

SELECT 字段名 FROM 表名 WHERE 条件;

1|0给列起别名

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`;
1|0只查询显示不同记录

SELECT DISTINCT 字段名 FROM 表名;

SELECT DISTINCT sex FROM `emp`; #只显示sex列中不同的记录,相同则合并 #得到结果: #男 #女
1|0查询时执行计算
SELECT salary*12 FROM `emp`;
1|0查询结果集排序

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;
1|0条件逻辑查询

SELECT * FROM 表名 WHERE 条件;

SELECT * FROM `emp` WHERE ename='king';

因为两个NULL是不等的,因此,

若需查找是否为NULL的列应使用IS NULLIS 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 值

#查询在50007000之间 SELECT * FROM `emp` WHERE salary BETWEEN 5000 AND 7000; #查询不在50007000之间 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);
1|0模糊条件查询

LIKE %要查的关键字%

% 代表0个或者多个字符

_ 代表一个字符

以上两个匹配符使用必须结合LIKE关键字使用

#查询员工姓名中包含有字母e的有哪些 SELECT * FROM `emp` WHERE ename LIKE '%e%'; #得到结果: #Jerry、Peter、Freda、Jone #查询员工姓名中倒数第二个为e的有哪些 SELECT * FROM `emp` WHERE ename LIKE '%e_';

1|0分页查询

用于定量分页进行查询。

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 #... #查询值为312的数据 #开始下标3-1=2 #要查询的数据量12-3+1=10(因为下标,所有要+1
SELECT * FROM `emp` [WHERE #...] [ORDER BY #...] LIMIT start,count;

1|0复杂查询

1|0聚合查询

用于特殊计算,共有五个聚合函数: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;
1|0分组查询

根据依据查询指定列

分组一般是使用有共性的数据,比如按性别分组、部门分组等...

SELCET 需要的查询的列1,需要的查询的列2#... FROM 表名 GROUP BY 作为依据的列;

#依据部门来查询sex列和ename列数据 SELECT sex,ename FROM `emp` GROUP BY deptId; #结果:只显示sex列和ename的结果
1|0子查询

一个查询语句嵌套在另外一个查询语句中,把内层语句的查询结果作为外层语句的查询条件继续查询。

内层语句需要使用括号包裹

#表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';
1|0联合查询

创建具有可以联合查询的表(要求联合查询

外键约束

1|0多表查询

例:查询出所有员工姓名及其部门名称(沿用上面子查询的数据)

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`;
1|0内连接

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值,应根据选择用以下 左外连接 或者 右外连接 或者 全连接。

1|0左外连接
SELECT ename,dname FROM `emp` LEFT OUTER JOIN `dept` ON deptId=did; #左外连接:显示左边表中所有的记录,即使右边表没有对于的值(无论是否NULL#这里emp表先写,即为左边的表

此时 emp 表中为NULL的值也能显示,但dept表中为NULL的值无法获取

1|0右外连接
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;
1|0全连接

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 市场部

2|7数据库的编码

默认数据库编码为ASCII码(美国信息交换标准代码),当填入中文信息时会出现乱码。

ASCII码仅支持英文等少数字符,除此之外,都会显示乱码;若想支持中文,可以用GBK码,但GBK只是在ASCII上增加中文;所以一般都使用国际通用的UTF8码(万国码)。

1|0解决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%';

2|8约束类型

用于解决列数据重复问题。例如:在开发中,学员的id,是唯一的,就需要进行约束。

1|0列约束的分类

主键约束(常用)

非空约束(常用)

唯一约束(常用)

检查约束

外键约束(常用)

默认值约束(常用)

自增列

1|0主键约束

[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);

1|0非空约束

NOT NULL

限定指定列上的值不能为NULL

CREATE TABLE `user`( #... loginPwd VARCHAR(32) NOT NULL, #... );

1|0唯一约束

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

1|0检查约束

mysql不再支持检查约束

检查约束会严重影响数据的插入,平时一般不使用。像用户注册等操作的验证一般在js中完成

CHECK限定指定列上的值不能为NULL

CREATE TABLE `user`( #... sex CHAR(3) CHECK(sex='男' OR sex='女'), #... );

1|0外键约束

作用:指定本表某个列必须在符合另一个表的规定值允许使用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值

*注意:本表外键约束的列 在另一个表中所要求符合的列,必须要声明为主键约束,否则报错

1|0默认值约束

指定当列上未明确指定值时所使用的默认值

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);

1|0自增列

用于自动增加的序列。

若主键列是整数类型,则同时可以声明此列上的值为“自动增长”——插入数据时未指定值或者指定为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

2|9补充

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) # );

1|0给密码加密

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'));

__EOF__

本文作者Myotsuki
本文链接https://www.cnblogs.com/myotsuki/p/16773390.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Myotsuki  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏