Mysql知识点总结(进阶2)

Mysql知识点总结(进阶2)

前言:笔记所需数据库在我的博客资源里面

#数据类型

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

日期型:

*/

#测试M和D
#M:整数部位+小数部位
#D:小数部位
#M和D都可以省略
CREATE TABLE tab_float(
​ f1 FLOAT(5,2),
​ f2 DOUBLE(5,2),
​ f3 DECIMAL(5,2)

);
SELECT * FROM tab_float;
INSERT INTO tab_float
VALUES(123.45,123.45,123.45);

/*
原则:
所选择的类型越简单越好

*/

#字符型
/*
char:固定长度字符(比较耗费空间)(效率低)
varchar:可变长度字符(耗费空间比较小)(效率高)
enum:枚举型
*/

CREATE TABLE tab_char(
​ e1 ENUM(‘a’,‘b’,‘c’)

);

INSERT INTO tab_char VALUE(‘a’);
INSERT INTO tab_char VALUE(‘b’);
INSERT INTO tab_char VALUE(‘c’);
INSERT INTO tab_char VALUE(‘D’);
INSERT INTO tab_char VALUE(‘C’);

SELECT * FROM tab_char;

#四、日期
/*
分类:
date 只保存日期
time 只保存时间
year 只保存年份

datetime:保留日期加时间
timetamp:保留日期加时间

特点:

timetamp更加准确
datetime:范围更大
*/

#常见约束

#常见约束
/*
含义:
​ 一种限制,用于限制表中的数据为了保证表中的数据准确和可靠性

分类:六大约束
​ not null 非空约束(姓名,学号等)
​ default 默认约束
​ primary 主键,用于保证该字段的值有唯一性并且非空
​ unique 唯一,用于保证字段值的唯一性,可以为空(座位号)
​ check 检查约束(mysql中不支持)
​ foreign key 外键,用于限制俩个表的关系,用于保证该字段的值必须
​ 保证来自于主表的关联列的值(在从表添加外键约束,用于引用主表
​ 中某列的值 比如专业编号和工种编号)

添加约束的时机:
​ 1、创建表时
​ 2、修改表时


约束的添加分类:
​ 1、列级约束
​ 六大约束语法上够可以用
​ 但是外键约束没效果


2、表级约束
除了非空、默认,其他的都支持

*/
CREATE TABLE 表名

​ 字段名 字段类型 约束,
​ 字段名 字段类型,
​ 表级约束

#创建表时添加约束
​ #1.添加列级约束
CREATE DATABASE students;
CREATE TABLE stuinfo(
​ id INT PRIMARY KEY,#主键
​ stuName VARCHAR(20) NOT NULL,
​ gender ENUM(‘男’,‘女’),
​ seat INT UNIQUE,#唯一
​ age INT DEFAULT 18,#默认约束
​ majorId INT REFERENCES major(id)#外键
);
DESC stuinfo;
CREATE TABLE major(
​ id INT PRIMARY KEY,
​ majorname VARCHAR(20)
);

CREATE TABLE stuinfo(
​ id INT PRIMARY KEY,#主键
​ stuName VARCHAR(20) NOT NULL,
​ gender ENUM(‘男’,‘女’),
​ seat INT UNIQUE,#唯一
​ age INT DEFAULT 18,#默认约束
​ majorId INT REFERENCES major(id)#外键
);

#主键和唯一键的大对比:
/*
主键和唯一键的大对比:
主键: 可以确保唯一性 不可以为空 允许组合
唯一键:可以确保唯一性 可以为空 允许组合

*/

#外键
/*
1、要求在从表设置外键关系
2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3、主表的关联列必须是一个key(一般是主键或唯一)
4、插入数据时先插入主表,再插入从表
删除数据时,先删除从表在删除主表
*/

#修改表时添加约束
#1、添加非空约束
CREATE TABLE stuinfo(
​ id INT ,#主键
​ stuName VARCHAR(20),
​ gender CHAR(1),
​ seat INT ,#唯一
​ age INT ,#默认约束
​ majorId INT #外键
);
DROP TABLE stuinfo;
#加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL;
#加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#加主键
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
DESC stuinfo;

#删除约束
#1、删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NULL;

DESC stuinfo;

ALTER TABLE dept1 MODIFY COLUMN id INT (4) PRIMARY KEY;
CREATE TABLE dept2 MODIFY COLUMN dept_id INT REFERENCES dept1(id);

ALTER TABLE dept2 ADD COLUMN dept_id INT;
ALTER TABLE dept2 MODIFY COLUMN dept_id INT FOREIGN KEY(dept_id)
REFERENCES dept1(id);

CREATE DATABASE play;
DROP DATABASE play;

#事务控制

#TCL
/*
transaction control language 事务控制语言

事务:
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行要么全部都不执行

案例:
​ 转账:
​ 张三丰:1000
​ 郭襄:1000
update 表 set 张三丰的余额=500 where name=‘张三丰’;
updata 表 set 郭襄的余额=1500 where name =‘郭襄’;

*/
#查看存储引擎
SHOW ENGINES;

#事务的ACID属性
/*
​ 1、原子性(不可分割)
​ 2、一致性(从一个一致状态变成另一个一致状态)
​ 3、隔离性(一个事务的执行不受其他事务的影响)
​ 4、永久性(比如:删除了就再删除了 )
/
#事务的创建
/

隐式事务: 事务没有明显的开启和结束标记
比如:insert update delete 语句。

显示事务: 事务具有明显的开启和关闭标记
前提:
​ 必须设置好自动提交功能为禁用(set autocommit=0;)
步骤一、
set autocommit=0;
start transaction;可选的
步骤二(编写事务中sql语句)(select insert update delete)
语句1;
语句2;
步骤三、
commit;提交事务
rollback;回滚事务
*/

#查看变量的语法
SHOW VARIABLES LIKE ‘autocommit’;

#------------------------------------操作----------------------------
CREATE TABLE account(
​ id INT PRIMARY KEY AUTO_INCREMENT,
​ username VARCHAR(20),
​ balance DOUBLE
);
INSERT INTO account(username,balance)
VALUE(‘张无忌’,1000),(‘赵敏’,1000);
SELECT * FROM account;

SET autocommit=0;
START TRANSACTION;
UPDATE account SET balance=1000 WHERE username=‘张无忌’;
UPDATE account SET balance=1000 WHERE username=‘赵敏’;
ROLLBACK;
COMMIT;
#结束事务

#视图

#一、创建视图
/*
create view 视图名
as
查询语句;
*/

#如下的例子,以后每次用它都要写一遍很烦
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON
e.department_id=d.department_id
WHERE e.last_name LIKE ‘%e%’;

#新的法子:视图

CREATE VIEW ev
AS
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON
e.department_id=d.department_id
WHERE e.last_name LIKE ‘%e%’;

SELECT * FROM ev
WHERE last_name LIKE ‘%a%’;

视图的修改

#视图的修改
#方式一、
/*
create or replace view 视图名
as
查询语句;
*/

CREATE OR REPLACE VIEW ev2
AS
SELECT last_name
FROM employees
WHERE last_name LIKE ‘%a%’;

#方式二、
/*
语法:
alter view 视图名
as
查询语句;

*/
ALTER VIEW ev2
AS
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id;

SELECT * FROM ev2;

#删除视图

/*
语法:drop view 视图名,视图名,视图名。。。。;

*/
DROP VIEW ev,ev2;

#查看视图

DESC ev2;

SHOW CREATE VIEW ev2;

#视图的更新

#建立一个视图
CREATE OR REPLACE VIEW ev2
AS
SELECT * FROM acount;

SELECT * FROM ev2;
#插入

ALTER TABLE acount MODIFY COLUMN userID INT(20) PRIMARY KEY;
DESC acount;
INSERT INTO ev2 VALUE (122354,55541);

#修改
UPDATE ev2 SET PASSWORD=159753 WHERE userID=12354;

#删除
DELETE FROM ev2 WHERE userID=12354;

#具备以下特点的视图是不允许更新的(一般不更新)
/*
1、包含以下关键字的sql语句:分组函数,distinct、group by、having、union、union all
2、
*/

INSERT INTO ev2 VALUE(235556,123456);
SELECT * FROM ev2;
SELECT * FROM acount;
SELECT * FROM acount GROUP BY PASSWORD=123456;

CREATE OR REPLACE VIEW ev2
AS
SELECT * FROM acount
GROUP BY PASSWORD=123456;

#更新不了

#变量

/*
系统变量:
​ 全局变量
​ 会话变量
自定义变量:
​ 用户变量
​ 局部变量
*/

#一、系统变量

/*
说明:变量由系统提供的,不是用户定义,属于服务器后面
注意:
​ 如果是全局变量,需要加global,如果是会话变量,直接省略
​ 或加上一个session

使用语法:
​ 1、查看所有的系统变量、
​ show global|session variables;
​ 2、查看满足条件的部分系统变量
​ 例子:show global|session variables like ‘%char%’;
​ 3、查看指定的某个系统变量的值
​ select @@global|session.系统变量名
​ 4、为某个变量赋值
​ 方式一、:
​ set global|session 系统变量名=值;
​ 方式二、
​ set @@global|session.系统变量名=值;
*/

#全局变量

/*
作用域:服务器每次启动将为所有的全局变量赋值初始值,针对所有的会话连接有效
,但不能跨重启;

*/
#查看所有的全局变量
SHOW GLOBAL VARIABLES;

#查看部分的全局变量
SHOW GLOBAL VARIABLES LIKE ‘%char%’;

#为某个指定的全局变量赋值;
SET GLOBAL @@global.autocommit=0;

#自定义变量

#一、全局变量

#声明并初始化
SET @用户变量名=值;或
SET @用户变量名:=值;或
SELECT @用户变量名:=值;

#赋值(更新变量的值)
SET @ 用户变量名=值;或
SET @用户变量名:=值;或
SELECT @用户变量名:=值;

#查看某个用户变量的值(使用)
SELECT @用户变量名;

#案例:
SET @name=‘john’;
SET @name=100;
SET @count=1;

SELECT COUNT(*) FROM employees
INTO @count;

SELECT @count;

#二、局部变量

#注意:只能用于begin和end之间
#声明并初始化
DECLARE 局部变量名 类型;或
DECLARE 局部变量名 类型;或
SELECT @局部变量名 类型;

#赋值(更新变量的值)
SET 局部变量名=值;或
SET 局部变量名:=值;或
SELECT @局部变量名:=值;

#查看某个用户变量的值(使用)
SELECT 局部变量名;

猜你喜欢

转载自blog.csdn.net/m0_46160373/article/details/107590848