首页 > 数据库 >MySQL学习笔记

MySQL学习笔记

时间:2022-10-09 19:46:46浏览次数:65  
标签:INSERT 笔记 查询 学习 VALUES emp MySQL NULL SELECT

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

数据库

什么是数据库

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

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

什么是数据表

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

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

数据库分类

网状数据库

层次型数据库

关系型数据库(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(小数)

布尔类型

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

INSERT 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-019999-12-31

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

DATATIME 日期时间类型,支持范围1000-01-01 00:00:009999-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 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 值

#查询在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

相关文章

  • mysql创建函数时提示1418。可选关闭二进制日志或者设置log_bin_trust_function_creato
    报错详情如下:1418--ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATAinitsdeclarationandbinaryloggingisenabled(you*might*wanttouse......
  • 遇到的比较好的学习视频
    B站上确实有很多不错的视频。自己看到过的,以后都在这里更新出来。 nginx讲解视频(2016 讲的不太细致)​​https://www.bilibili.com/video/av34488063/?p=7​​nginx讲解视......
  • drf学习-7
    一、内容回顾1、drf路由的使用  路由有三种写法    -视图类.as_view    -视图类.as_view({'get':'list'})    -自动生成路由      导入——实例......
  • mysql 知识点 最完整的 思维导图
     下边的文章是我遇到的 总结sql知识点,并且做成了思维导图做的非常全的。推荐大家点击看。​ 还有一篇是 mysql 基础的sql语句的 思维导图,也很不错。​  常用的sql......
  • 计算机本科如何制定学习计划,给自己安排上
    写在前边:本文适合刚入学的大一新生,或者大二学生,如果想做计算机这一行,如果没有方向,可以看看这篇文章。当然了,对于更优秀的人,如果看到了,希望能给我更好的建议,目前我是大三下。......
  • 推荐一个今天误入的 源码学习网站
    今天想查看一下 spring data JPA 的源码,然后看到一个不错的源码学习网站。 链接地址:​​http://www.iocoder.cn/Spring-Data-JPA/good-collection/​​......
  • Python学习路程——Day09
    Python学习路程——Day09文件操作1、文件的概念''' 操作系统为了使用户更好的使用计算机,而创建的一个快捷方式。 双击一个文件,相当于把硬盘的数据资源加载到内存中。......
  • 2022-2023-1 20221313《计算机基础与程序设计》第六周学习总结
    2022-2023-120221313《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程<班级的链接>https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP......
  • 《代码大全》阅读笔记
    隐喻思维在西方是一个热门的话题,隐喻的认知功能在各个学科正受到越来越多的重视,依照我的理解,其实就是以众所周知或者理解主体熟悉的事物为符号去将新事物、新概念具象化,与......
  • 【博学谷学习记录】超强总结,用心分享 。多线程相关点知识学习。
    一、实现多线程1.1了解多线程多线程是指从软件或硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提......