MySQL基础-表数据插入-创建

DML语言

#一、插入语句
/**
语法:

INSERT INTO 表名(列名,.....) VALUES(值1,值2 .... );
① 可以为null值的列可以填充null
② 空值列可以去掉不写
③ 列的顺序是否可以调换
④ 列数和值的个数必须一致
⑤ 可以省略列名 默认所有列 而且列的顺序和表中列的顺序一致
*/
# 方式二
/**
语法:

INSERT into 表名 
set 列名1=值1,
	列名2=值2,...
*/

1,方式一支持插入多行 方式二 不支持 
2,方式一支持子查询,方式二不支持

子查询
INSERT INTO beauty 
SET id = 15,`name`='刘涛',phone='888888'

SELECT * FROM beauty
#1.插入值的类型要与列的类型一致或兼容
INSERT INTO beauty(id,`name`,sex,borndate,phone,photo,boyfriend_id)
VALUES (14,'郭襄','女','2000-12-03','18862517892',null,null)


INSERT INTO beauty (id,name,phone)
SELECT 21,'宋茜','3333' 先有结果集 在插入

INSERT INTO beauty ( id, `name`, phone ) SELECT
id,boyName,'123456' FROM boys WHERE id > 3;
二、修改语句

/*
1.修改单表的记录

语法:执行过程  update  where  set 
UPDATE 表名 ①
set 列=新值,列=新值,.... ③
WHERE 筛选条件  ② 

2.修改多表的记录[补充]

语法:
sql92语法 
 UPDATE 表1 别名,表2 别名
 set 列 = 值,....
 WHERE 连接条件 [只支持内联]
 and 筛选条件 

sql99语法
 UPDATE 表1 别名
 INNER|LEFT|RIGHT JOIN 表2 别名
 on 连接条件 
 set 列 = 值,....
 WHERE 筛选条件
*/

# 2.修改多表的记录[补充]

#修改张无忌的女朋友的手机号为114
UPDATE beauty b 
LEFT JOIN boys bo 
on b.boyfriend_id = bo.id 
SET phone ='114'
WHERE bo.boyName='张无忌'

#修改没有男朋友的女神的男朋友编号都为2号
UPDATE beauty b
LEFT JOIN boys bo ON b.boyfriend_id = bo.id 
SET boyfriend_id = 2 
WHERE
	boyfriend_id NOT IN ( SELECT id FROM boys );

#另一种写法
UPDATE boys bo 
RIGHT JOIN beauty b on b.boyfriend_id = bo.id
SET boyfriend_id =2 
WHERE bo.id is null;

#1.修改单表的记录
# 修改姓唐的电话
UPDATE beauty 
SET phone ='455778'
WHERE `name` LIKE '%唐%'


#修改boys表中id为2名称张飞 魅力值10
UPDATE boys 
SET userCP = 10,
boyName = '张飞' 
WHERE
	id = 2

三、删除语句

#三、删除语句 
/**
方式一:DELETE 
语法:
#补充的删除 前面几n条
DELETE FROM beauty  LIMIT n; 
#一、单表的删除
DELETE FROM 表名 WHERE 筛选条件

2、多表的删除[补充]
sql92 
DELETE 别名
FROM 表1 别名,表2 别名 
WHERE 连接条件 AND 筛选条件

sql99
DELETE 别名
FROM 表1 别名
LEFT|RIGHT|INNER JOIN 表2 别名 
on 连接条件
WHERE  筛选条件


方式二  TRUNCATE  截断一张表 
语法 :TRUNCATE table 表名 
*/

#方式一 :DELETE 
#1.单表的删除
#案例1 删除手机号以9结尾的女神信息 以什么结尾 %放前面 
DELETE FROM beauty WHERE phone LIKE '%7'

#多表删除
#删除张无忌女朋友的信息
DELETE b,bo
FROM beauty b ,boys bo  
WHERE b.boyfriend_id=bo.id AND bo.boyName='张无忌'

#sql99模式
DELETE b
FROM beauty b INNER JOIN boys bo  on b.boyfriend_id=bo.id
WHERE  bo.boyName='张无忌'

#删除黄晓明的信息以及他女朋友的信息
DELETE b,bo
FROM beauty b ,boys bo  
WHERE b.boyfriend_id=bo.id 
AND bo.boyName='黄晓明'


#sql99
DELETE b,bo
FROM beauty b INNER JOIN boys bo  on b.boyfriend_id=bo.id
WHERE  bo.boyName='黄晓明'

#方式二 TRUNCATE语句
#清空表 清空数据 
TRUNCATE TABLE boys;
delete 和TRUNCATE 区别
/**
1.DELETE 可以加WHERE条件  TRUNCATE 不能加
2.TRUNCATE删除 效率高一点
3.假如要删除的表中有自增长列 
如果用delete删除后 再插入数据 自增长列的值从断点开始
而 TRUNCATE 删除后 再插入数据 自增长列的值从1开始 
4.TRUNCATE删除没有返回值     DELETE删除有返回值(返回你受影响行数)

5.TRUNCATE删除不能回滚   DELETE删除可以回滚 
*/
#查看表结构
DESC employees
SELECT * FROM boys;

TRUNCATE TABLE boys
DELETE FROM  boys  WHERE id =4;

INSERT INTO boys (boyName,userCP)
VALUE
('段誉',90)

DDL语言

一、库的管理
创建,修改,删除
二、 表的管理
创建,修改,删除
创建:CREATE
修改:ALTER
删除:DROP
1.创建数据库
CREATE DATABASE [IF NOT EXISTS] 库名;

2.库的修改
#更改字符集
ALTER DATABASE book CHARACTER SET utf8

3.库的删除
DROP DATABASE  IF EXISTS book;
4.表的创建
CREATE TABLE IF NOT EXISTS  表名(
			列名 列的类型[(长度) 约束],
			列名 列的类型[(长度) 约束],
			列名 列的类型[(长度) 约束],
			.....
			列名 列的类型[(长度) 约束]
)
5.表的修改
#①修改列名 加上类型 
ALTER TABLE book CHANGE COLUMN publishDate pbDate DATETIME;

#②修改列的类型或者约束
ALTER TABLE AUTHORS MODIFY COLUMN annual VARCHAR(20);

#③添加新列
ALTER TABLE authors ADD COLUMN annual DOUBLE COMMENT '年刊';

#添加到指定的后面
#ALTER TABLE 表名 add COLUMN 列名 类型 [FIRST|AFTER 字段名]
ALTER TABLE beauty ADD COLUMN garden  int  AFTER sex;

#删除列
ALTER TABLE author DROP COLUMN annual;

#修改表名
ALTER TABLE author RENAME to AUTHORS
/*
ALTER TABLE 表名 add|CHANGE|MODIFY|DROP COLUMN 列名 [列类型 约束 ];
*/

7.表的删除
#三、表的删除 
DROP TABLE if EXISTS book;
SHOW TABLES;

#通用的写法
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;

DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 表名();

8.表的复制
#仅仅复制表结构
CREATE TABLE copy LIKE AUTHORS;

#复制表结构+数据
CREATE TABLE copy2 
SELECT * FROM AUTHORS;

#只复制部分数据
CREATE TABLE copy3 
SELECT id ,au_name
FROM AUTHORS WHERE id =4;

#仅仅复制某些字段 # 0 false | 1 true;
CREATE TABLE copy4 
SELECT id ,au_name
FROM AUTHORS 
WHERE 0; 

常见的数据类型

#常见数据类型的介绍
/*
数值型
			整型:
			小数:
						定点数:
						浮点数:
字符型:
				较短的文本:char,VARCHAR
				较长的文本:text,blob(较长的二进制数据)

日期型:

*/

#一、整型  从小到大 
/**					字节     			 范围
Tinyint  			1 				有符号:-128~127  无符号0~255 
SMALLINT 			2 				
					
MEDIUMINT 	  3


Int,INTEGER 	4 

BIGINT 				8 

特点:
① 如果不设置无符号还是有符号 默认有符号 设置无符号 添加UNSIGNED 
② 不设置长度 会有默认长度 
③ INT(7) ZEROFILL 零填充  INT默认 变成无符号
④ 长度代表了显示的最大宽度 如果不够会用0在左边填充 但必须搭配ZEROFILL使用 
*/

#1.如何设置无符号和有符号
DROP TABLE IF EXISTS tab_int;
CREATE TABLE tab_int(
		t1 INT ZEROFILL ,#不写默认有符号 
		t2 INT(7) ZEROFILL  UNSIGNED #无符号 
);

DESC tab_int;
INSERT into tab_int VALUES (-1234567);
INSERT into tab_int VALUES (-1234567,-1234567);

INSERT into tab_int VALUES (123,123);

SELECT * FROM tab_int;

#二、小数
/*
分类:
1.浮点型
2.定点型

# 浮点数类型    		  字节   
	FLOAT(M,D) 			4
	DOUBLE(M,D)          8
	
定点数类型
	DEC(M,D)				M+2			最大值范围与double相同 给定decimal的有效取值范围由M和D决定
	DECIMAL(M,D)


特点:
①M和D 
M:整数部位+小数部位
D:小数部位 
超过范围则插入失败

② M和D可以省略
如果是decimal 则默认为10 D默认为0 
如果是float和double 会根据插入的数值的精度来决定精度

③ 定点型的精确度较高 如果要求插入数值的精度较高如货币运算规则等考虑使用
*/

#原则
/*
所选择的类型越简单越好 能保存数值的类型越小越好
*/

#三、字符型
/**
较短的文本
char(M):固定长度的字符 
M:代表字符数 a 中 都是一个字符数
VARCHAR :可变长度的字符 

#  解释
char(10) VARCHAR(10)

中国 两个字符
char(10) 给十个字符
VARCHAR(10) 给两个字符 

特点:			写法 		M的意思						特点				空间的耗费			效率

CHAR 			CHAR(M)		最大字符数 可以省略 默认1 	固定长度的字符			比较耗费				高

VARCHAR 		VARCHAR(M) 	最大字符数	不可以省略   	固定长度的字符			比较节省				低


较长的文本
text
BLOB(较大的二进制)


BINARY和 VARBINARY用于保存较短的二进制
enum 用于保存枚举
set用于保存集合
*/

CREATE TABLE tab_char(

			c1 ENUM('a','b','c')
);

desc tab_char;
#数值是 枚举的定位 
INSERT INTO tab_char VALUES(3)

INSERT INTO tab_char VALUES('a');
INSERT INTO tab_char VALUES('b');
INSERT INTO tab_char VALUES('c');
INSERT INTO tab_char VALUES('M');#直接不插入 
SELECT * FROM tab_char;


DROP TABLE IF EXISTS tab_float;
CREATE TABLE tab_float(
			f1 FLOAT,
			f2 DOUBLE,
			f3 DECIMAL
);

DESC tab_float;

INSERT INTO tab_float VALUES (1233.4,1233.4,1234.4777777);

SELECT * FROM tab_float;

#set集合
DROP TABLE if EXISTS tab_set;
CREATE TABLE tab_set(
			s1 set('a','b','c','d')
);
desc tab_set;

#多个字符插入
INSERT into tab_set VALUES('b,a,c');
INSERT into tab_set VALUES('A')

SELECT * FROM tab_set;

日期型

#日期型
/*						字节				最小值
date        		4 					只可以放日期

time  只存放时间

year  年

TIMESTAMP 			4	 			日期+时间 

datetime 				8 				日期+时间

TIMESTAMP 和 datetime区别

TIMESTAMP取值范围小
datetime 取值范围大

TIMESTAMP和实际时区有关
datetime 反映出插入时的当地时区

TIMESTAMP受版本影响
*/


CREATE TABLE tab_date(
			t1 DATETIME,
			t2 TIMESTAMP #会受时区的影响 
);

DESC tab_date;

INSERT into tab_date  VALUES (NOW(),NOW());

SELECT * FROM tab_date;

##查看时区
SHOW VARIABLES LIKE 'time_zone'

SET time_zone='+08:00'

主键和外键

#常见约束
/*
含义:一种限制 用于限制表中的数据 为了保证表中的数据的一致性

分类:六大约束
					1.NOT NULL :非空 用于保证该字段的值不能为空 比如姓名 学号等
					2.DEFAULT: 默认 用于保证该字段有默认值 比如性别
					3.PRIMARY KEY:主键 用于保证该字段的值具有唯一性 并且非空
					比如 学号 员工编号等 
					4.UNIQUE:唯一性 保证该字段的值具有唯一性 可以为空 比如座位号
					5.CHECK:检查约束[mysql不支持] 比如 年龄 性别 
					6.FOREIGN KEY :外键 用于限制两个表的关系 用于保证字段的值必须来自于主表的关联的值
												在从表添加外键约束 用于引用主表中某列的值
												比如学生表的专业编号 员工表的部门编号 

添加约束时机:
					1.创建表时
					2.修改表时
数据添加之前 					
					
约束的添加分类
			列级约束:
			六大约束语法以上都支持 但外键约束没有效果
			
			表级约束:
			
					除了非空 默认 其他都支持
					
主键和唯一键 					
		保证唯一性	是否允许为空	一个表中可以有多少个	  是否允许组合
主键 			√		×			至多一个			允许 不推荐															 						

唯一			√		√			有多个			允许 不推荐																	
			
外键:
				1.要求从表设置外键关系 
				2.从表的外键列的类型和主表的关联列的类型要一致或兼容 名城无要求
				3.主表的关联列必须是一个key(主键,唯一)
				4.插入数据时 先插入主表 在插入从表 
					删除数据时 先删除从表 在删除主表
*/

CREATE TABLE 表名 (
			字段名  字段类型 列级约束 
			字段名  字段类型,
			表级约束	
);


# 一、创建表时约束 
# 1.添加列级约束
/*
语法:
	
	直接在字段名和类型后面 追加 约束类型即可
	
	只支持:默认 非空 主键 唯一 
*/
#表级约束	  唯一索引
ALTER TABLE actor ADD CONSTRAINT uniq_idx_firstname UNIQUE( first_name) ;
# 对last_name创建普通索引idx_lastname
ALTER TABLE actor ADD INDEX idx_lastname (last_name) USING BTREE;

#二、 修改表时添加约束
/*
1.添加列级约束
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 新约束

2.添加表级约束
ALTER TABLE 表名 add [CONSTRAINT 约束名]  约束类型(字段名) [外键引用]
*/

# 三、修改表时删除约束

#删除主键
ALTER TABLE stuinfo DROP PRIMARY key;
#删除唯一
alter table 表名 drop index 索引名

CREATE DATABASE students;

use students;

DROP TABLE if  EXISTS  stuinfo;
CREATE TABLE stuinfo(
		id int PRIMARY key COMMENT '主键 ',
		stuName VARCHAR(20) NOT NULL COMMENT '非空',
		gender CHAR(1) CHECK(gender='男' or gender='女'),
		seat int UNIQUE COMMENT '唯一',
		age int DEFAULT 18 COMMENT '默认值',
		majorId int  REFERENCES major(id)#外键
);

desc stuinfo;


CREATE TABLE major(
		id int PRIMARY key,
		majorName VARCHAR(20)
);

desc major;

#查看索引 表中所有的索引 包括主键  外键 唯一 
show index FROM stuinfo


# 2.添加表级约束
/*

语法:
在各个字段的最下面 
[CONSTRAINT 约束名] 约束类型(字段名)
*/


DROP TABLE IF EXISTS stuinfo;

CREATE TABLE stuinfo(
			id int ,
			stuname VARCHAR(20),
			gender char(1),
			seat int ,
			age int ,
			majorid int,
			#CONSTRAINT pk PRIMARY KEY(id,stuname), 组合主键 
			CONSTRAINT pk PRIMARY KEY(id),
			CONSTRAINT uq UNIQUE(seat),
			CONSTRAINT ck CHECK(gender='男' or gender='女'),
			CONSTRAINT fk_stuinfo_major FOREIGN key (majorid) REFERENCES major(id)
);

标识列|自增长列

#标识列 
/*
又称为自增长列
含义:可以不用手动的插入值 系统提供默认的序列值

特点:
1.标识列必须和主键搭配吗? 不一定 但必须是一个key 
2.一个表最多只有一个增长列
3.标识列的类型只能是数值型
4.标识列可以通过SET auto_increment_increment =3 设置步长  
可以通过手动插入值 设置起始值 

*/
# 二、修改表时设置 标识列
ALTER TABLE tab_indentity MODIFY COLUMN id int PRIMARY key AUTO_INCREMENT;


DROP TABLE IF EXISTS tab_indentity;
CREATE TABLE tab_indentity(
			id int PRIMARY key AUTO_INCREMENT,
			NAME VARCHAR(20)
);



#一、创建表时设置标识列
SHOW VARIABLES LIKE '%auto_increment%'
#截断表 
TRUNCATE TABLE tab_indentity
#设置起始值  起始值为10 
INSERT into tab_indentity VALUES (10,'john');
INSERT into tab_indentity VALUES (NULL,'john');

SELECT * FROM tab_indentity

#设置步长
SET auto_increment_increment =1

级联删除

SHOW INDEX FROM major;

SHOW INDEX FROM stuinfo;

#添加外键
ALTER TABLE stuinfo ADD FOREIGN KEY fk_stuinfo_majors(majorid) REFERENCES major (id);

#删除外键 
ALTER TABLE stuinfo  DROP  FOREIGN KEY  fk_stuinfo_majors ;

SELECT * FROM major ;
SELECT * FROM stuinfo;

INSERT INTO major VALUES (3,'vue')

INSERT INTO stuinfo 
SELECT 1,'john1','女',NULL,NULL,1 UNION ALL 
SELECT 2,'john2','男',NULL,NULL,3 UNION ALL 
SELECT 3,'john3','女',NULL,NULL,3 UNION ALL 
SELECT 4,'john4','男',NULL,NULL,2 UNION ALL 
SELECT 5,'john5','女',NULL,NULL,1


#一、 级联删除 ON DELETE CASCADE  主表从表数据都删除 
ALTER TABLE stuinfo ADD   FOREIGN KEY fk_stuinfo_majors(majorid) REFERENCES major (id) ON DELETE CASCADE ;
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_majors  FOREIGN KEY (majorid) REFERENCES major (id) ON DELETE CASCADE ;

# 主表数据 先删从表 在删主表
DELETE FROM major WHERE id=3;

#二、级联置空 ON DELETE SET NULL 主表数据删除 从表置空 
ALTER TABLE stuinfo ADD   FOREIGN KEY fk_stuinfo_majors(majorid) REFERENCES major (id) ON DELETE SET NULL ;
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_majors  FOREIGN KEY (majorid) REFERENCES major (id) ON DELETE SET NULL ;

DELETE FROM major WHERE id=3;
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值