学习笔记10——Mysql的DDL语句

学习笔记系列开头惯例发布一些寻亲消息

链接:https://baobeihuijia.com/bbhj/contents/3/197161.html
在这里插入图片描述

  • 数据库创建:

    CREATE DATABASE books;
    CREATE DATABASE IF NOT EXISTS books;
    
  • 更改字符集

    ALTER DATABASE books CHARACTER SET gbk;
    
  • 库的删除

    DROP DATABASE IF EXISTS books;
    
  • 表的创建

    CREATE TABLE book(
    	id INT,
    	bName VARCHAR(20),
    	price DOUBLE,
    	authorId INT,
    	publishDate DATETIME
    );
    
  • 表的修改

    # 改列名改列属性
    ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
    # 改列属性
    ALTER TABLE book MODIFY COLUMN pubDate TIMESTAMP;
    # 改表名字
    ALTER TABLE book RENAME TO books;
    ALTER TABLE book ADD COLUMN pubDate TIMESTAMP 【first/after 字段名】;
    ALTER TABLE book DROP COLUMN pubDate;
    
  • 表的删除

    DROP TABLE IF EXISTS book;
    
  • 表的复制

    # 仅仅复制表的结构
    CREATE TABLE author_copy LIKE author;
    
    # 复制表的结构+数据
    CREATE TABLE author_copy2 SELECT * FROM author;
    
    # 仅仅复制某些字段
    CREATE TABLE copy4
    SELECT id,an_name
    FROM author
    WHERE 0;
    
    # 可以跨库,只要写成 库名.表名
    CREATE TABLE dept2
    SELECT department_id, department_name
    from my_employees.departments;
    
    
  • 常见数据类型

    # 整型 Tinyint/Smallint/Mediumint/Int/integer/bigint
    
    # 默认为有符号,大于范围则插入临界值
    CREATE TABLE tab_int(
    	t1 INT,
    	t2 INT UNSIGNED
    	# 长度不够7用0来填充
    	t3 INT(7) ZEROFILL
    );
    
    # 浮点小数 :MD都可以省略,随着插入的数据改变
    float(M,D):M代表整数+小数部分长度,D代表小数部分长度
    double(M,D)
    
    # 定点小数 :MD都可以省略,M默认为10,D默认为0,精度更高
    dec(M,D)
    
    # 短的字符型 
    char     不可变长,可以省略默认为1  	不可超过最大字符数  效率高
    varchar   可变					  不可超过最大字符数  效率低
    
    # ENUM:枚举,只能选择列表中一个插入
    e1 enum('a','b','c');
    # set :选择列表中一个或者多个插入
    s1 set('a','b','c','d')
    # binary和varbinary 保存较短的二进制
    # 长的字符型 text,blob(长的二进制)
    
    # 日期
    date 1001-01-01
    time 22:22:22
    year 1001
    datetime:1001-01-01 00:00:00,只插入年份会自动给时间
    timestamp:和datetime表示一样,但是会受当前的时区影响,更能反映真实时间
    
    INSERT INTO tab_date VALUES (NOW(),NOW());
    
  • 常见约束

    列级约束
    - NOT NULL
    - DEFAULT:保证字段有默认值
    - PRIMARY KEY:主键,唯一且非空
    - UNIQUE:唯一但是可以为空
    
    CREATE TABLE stuinfo1(
    	id INT PRIMARY KEY,
    	stuName VARCHAR(20) NOT NULL,
    	gender CHAR(1) CHECK(gender='男' OR gender ='女'),
    	age INT DEFAULT 18,
    	majorId INT,
    	seat INT UNIQUE
    );
    
    
    表级约束
    - CHECK:mysql没效果
    - PRIMARY KEY:主键,唯一且非空
    - UNIQUE:唯一但是可以为空
    - FOREIGN KEY:外键,该表格的该字段值来自于主表的关联列的值
    CREATE TABLE stuinfo1(
    	id INT ,
    	stuName VARCHAR(20) ,
    	gender CHAR(1) ,
    	age INT ,
    	majorId INT,
    	
    	CONSTRAINT pk PRIMARY KEY(id),
    	CONSTRAINT uq UNIQUE(seat),
    	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)	
    	
    	# 或者不起名
    	PRIMARY KEY(id),
    	UNIQUE(seat),
    	FOREIGN KEY(majorid) REFERENCES major(id)
    );
    
  • 主键和唯一的区别

  • 外键:

    • 关联列必须是主键/唯一键
    • 插入数据时,先插入主表再插入从表,删除的时候先删除从表再删主表
  • 修改约束

    # 主键的增删只需要一次,不需要每次motify都带着
    # 列级约束
    ALTER TABLE stuinfo1 MODIFY COLUMN id INT PRIMARY KEY;
    ALTER TABLE stuinfo1 MODIFY COLUMN stuName VARCHAR(10) NOT NULL;
    
    # 表级约束
    ALTER TABLE stuinfo1 ADD PRIMARY KEY(seat); # 必须先存在再添加
    ALTER TABLE stuinfo1 ADD UNIQUE(seat); # 必须先存在再添加
    ALTER TABLE stuinfo1 ADD FOREIGN KEY (majorId) REFERENCES major(id);
    ALTER TABLE stuinfo1 ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY (majorId) REFERENCES major(id);
    
  • 删除约束

    ALTER TABLE stuinfo1 MODIFY COLUMN id INT;
    
    # 删除主键和唯一键的名字(主键起名也没有效果),列级约束无法删除主键
    ALTER TABLE stuinfo1 DROP PRIMARY KEY;
    ALTER TABLE stuinfo1 DROP INDEX seat;
    
    # 删除外键
    ALTER TABLE stuinfo1 DROP FOREIGN KEY fk_stuinfo_major;
    
  • 标识列

    # 只有key才能设置标识列、只有有一个、只能是数值类型的
    
    CREATE TABLE tab_identify(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	NAME VATCHAR(20)
    );
    # 无需手动增加
    INSERT INTO tab_identify values(NULL,'JOIN');
    
    # 所有库都会被修改
    SHOW VARIABLES LIKE '%auto_increment%';
    SET auto_increment_increment = 3;
    # 起始位置可以手动插入
    
    # 增删标识列
    ALTER TABLE tab MOTIFY COLUMN id INT PRIMARY KRY AUTO_INCREMENT;
    ALTER TABLE tab MOTIFY COLUMN id INT;
    
  • 事务

    要么全部执行、要么全部不执行
    # 四大特性:原子性、一致性、隔离性、持久性
    
    # 需要设置自动提交功能为OFF,只有当前事务设置有效
    set autocommit = 0;
    start transaction;
    仅限 sql语句不包含DDL语句
    commit/rollback; 二选一,上述sql只是提交到了内存中,如果要执行那么就commit,如果不执行那就rollback
    
    - 脏读:没有提交
    - 不可重复读:更新
    - 幻读:插入
    
    # 查看隔离级别
    select @@tx_isolation
    set session|global transaction isolation level read committed;
    
    # 四种隔离级别
    read uncommitted:事务尚未提交,库中的数据就已经修改了,当事务rollback的时候,这些临时修改且被读到的数据成为脏数据
    read committed:可以避免脏读(未提交就不会修改),但是该事务commit前后,另一个事务的读取不可重复
    repeatable_read:不管另一个事务是否提交,读到什么就一直是什么,避免不可重复读;但是另一个事务插入行之后,数据还是会变多
    serializable:串行化,另一个事务的修改都会被阻塞
    
    # 设置保存点
    SAVEPOINT a;
    ROLLBACK TO a;
    
  • 视图

    # 只保存了sql语句,没有保存真实的数据
    - 简化sql,不必了解查询细节
    - 保护数据,提高安全性
    
    # 创建
    CREATE VIEW avg_salary
    AS
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id;
    
    # 使用
    SELECT * FROM avg_salary;
    
    # 修改1
    CREATE OR REPLACE VIEW myv3
    AS
    SELECT AVG(salary),job_id
    FROM employees
    GROUP BY job_id;
    
    # 修改2
    ALTER VIEW myv3
    AS 
    SELECT AVG(salary),job_id
    FROM employees
    GROUP BY job_id;
    
    # 删除
    DROP VIEW myv3;
    
    # 修改,原始表也会修改(要看视图定义方式,有的可以更新有的不能)
    INSERT INTO myv3 VALUES('张飞','qq,com');
    UPDATE myv3 SET NAME='吴京' WHERE email = 'qq,com';
    DELETE FROM myv3 WHERE email = 'qq,com';
    
  • 删除带外键的主表的方式

    - 级联删除,主表内容删除会把从表内容删除
    ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
    
    - 级联置空
    ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
    
  • 系统变量

    系统变量:系统提供,属于服务器层面
    - 全局变量服务器每次启动会将全局变量赋初始值,针对所有会话有效,重启无效
        SHOW GLOBAL【SESSION】 VARIABLES;
        SHOW GLOBAL【SESSION】 VARIBLIES LIKE '%char%';
        SELECT @@global|session.系统变量名
        SET global|session.系统变量名 = VALUE;
        SET @@global|session.系统变量名 = VALUE;
    
    	SELECT @@global.tx_isolation;
    	SET @@global.autocommit = 0;
    	
    - 会话变量:仅针对当前会话有效,换一个连接就无效了
    	SHOW SESSION VARIABLES;
    	SELECT @@SESSION.transaction_isolation;
    	SELECT @@SESSION.transaction_isolation = read uncommitted;
    
  • 自定义变量

    - 用户变量:仅当前会话有用,要加@,不需要限定类型
    SET @用户变量名:=值;
    SELECT 字段 INTO @变量名 FROM 表;
    SELECT COUNT(*) INTO @count FROM emplyees;
    # 使用
    SELECT @count;
    
    - 局部变量:作用于begin end中的第一句话,一般不用加@,需要限定类型
    声明: DECLARE 
    赋值:SET/SELECT
    使用:SELECT 
    
    
    SET @m = 1;
    SET @n = 2;
    SELECT @n: = 2;(加冒号)
    SET @sum= @m + @n;
    SELECT @sum;
    
    BEGIN
    DECLARE m INT DEFAULT 1;
    SET m = 2;
    SELECT @m = 3;
    SELECT m;
    END
    
  • 存储过程和函数

    - 提高代码的重用
    - 减少编译次数
    - 减少了逐步与服务器的连接次数
    
    # 创建
    CREATE PROCEDURE 名字(参数)
    BEGIN
    	一组合法的SQL语句
    END
    
    参数模式
    IN:参数可以作为输入
    OUT:参数作为返回值
    INOUT:既需要输入值,又可以返回值
    
    #### IN
    DELIMITER $
    CREATE PROCEDURE myp1(IN beautyName VARCHAR(20))
    BEGIN
    	SELECT bo.*
    	FROM boys bo
    	RIGHT JOIN beauty b
    	ON b.boyfriend_id  = bo.id
    	WHERE b.name = beautyName;
    END $
    
    CALL myp1('柳岩');
    
    #### OUT
    DELIMITER $
    CREATE PROCEDURE myp1(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)
    BEGIN
    	SELECT bo.boyName, bo.userCP INTO boyName, INTO userCP
    	FROM boys bo
    	RIGHT JOIN beauty b
    	ON b.boyfriend_id  = bo.id
    	WHERE b.name = beautyName;
    END $
    
    SET @boyName$
    CALL myp1('小昭',@boyName)$
    
    select @boyName;
    
    #### INOUT
    SET @a=3;
    SET @b=4;
    
    DELIMITER $
    CREATE PROCEDURE myp1(INOUT a INT,INOUT b INT)
    BEGIN
    	SET a = a*2;
    	SET b = b*2;
    END $
    
    CALL myp1(@a,@b)$
    SELECT @a$
    
    # 删除
    DROP PROCEDURE myp1;
    
    # 查看
    SHOW CREATE PROCEDURE myp1;
    
    # 一般无法修改存储过程
    

    在这里插入图片描述

  • 函数和存储过程的区别

    • 存储过程可以0或多个返回、而函数必须有且仅有一个返回
    # 无参
    DELIMITER $
    CREATE FUNCTION myf1() RETURNS INT
    BEGIN
    	DECLARE c INT DEFAULT 0;
    	SELECT COUNT(*) INTO c
    	FROM employees;
    	RETURN c;
    END $
    SELECT myf1() $
    
    # 有参
    DELIMITER $
    CREATE FUNCTION myf1(empName VARCHAR(20)) RETURNS DOUBLE
    BEGIN
    	SET @SAL=0;
    	SELECT salary INTO @SAL
    	FROM employees
    	WHERE first_name = empName;
    	RETURN @SAL;
    END $
    SELECT myf1('cynthia') $
    
    # 实现两数相加
    DELIMITER $
    CREATE FUNCTION test_fun1(num1 FLOAT, num2 FLOAT) RETURNS FLOAT
    BEGIN
    	DECLARE s FLOAT DEFAULT 0;
    	SET s = num1 + num2;
    	RETURN s;
    END $
    SELECT test_fun1(2.3,1.7)$
    
    # 查看函数
    SHOW CREATE FUNCTION myf1;
    
    # 删除
    DROP FUNCTION myf1;
    
  • 流程控制结构(顺序/分支/循环)

    一、分支
    - if函数:任何位置
    IF(表达式1,表达式2,表达式3);
    
    - case:任何位置
    DELIMITER $
    CREATE PROCEDURE test(IN SCORE INT)
    BEGIN
    	CASE
    	WHEN score>=90 AND score <=100 THEN SELECT 'A';
    	WHEN score>=80 THEN SELECT 'B';
    	WHEN score>=60 THEN SELECT 'C';
    	ELSE SELECT 'D';
    	END CASE;
    END$
    SELECT test(20)$
    
    - if结构:只能放在begin end中
    DELIMITER $
    CREATE FUNCTION test(SCORE INT) RETURNS CHAR
    BEGIN
    	IF score>=90 AND score <=100 THEN RETURN 'A';
    	ELSEIF score>=80 THEN RETURN 'B';
    	ELSEIF score>=60 THEN RETURN 'C';
    	ELSE RETURN 'D';
    	END IF;
    END$
    SELECT test(20)$
    
    二、循环 while/loop/repeat,必须放在begin end之间
    CREATE PROCEDURE pro_while(IN insertCount INT)
    BEGIN
    	DECLARE i INT DEFAULT 1;
    	WHILE i<=insertCount DO
    	INSERT INTO boys VALUES(16,'zhangsan',200);
    	SET i = i+1;
    	END WHILE;
    END $
    CALL pro_while(2);
    
    # 如果添加leave或者iterate,就必须添加名称
    # 添加leave
    CREATE PROCEDURE pro_while(IN insertCount INT)
    BEGIN
    	DECLARE i INT DEFAULT 1;
    	a:WHILE i<=insertCount DO
    		INSERT INTO boys VALUES(16,'zhangsan',200);
    		SET i = i+1;
    		IF i>=20 THEN LEAVE a;
    		END IF;
    	END WHILE a;
    END $
    CALL pro_while(2)$
    
    # 添加iterate
    CREATE PROCEDURE pro_while(IN insertCount INT)
    BEGIN
    	DECLARE i INT DEFAULT 1;
    	a:WHILE i<=insertCount DO
    		IF MOD(i,2)!=0 THEN ITERATE a;
    		END IF;
    		INSERT INTO boys VALUES(16,'zhangsan',200);
    		SET i = i+1;
    	END WHILE a;
    END $
    CALL pro_while(2)$
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/247772.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《数据结构、算法与应用C++语言描述》- 构建哈夫曼树

哈夫曼树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_29huffmanTree 定长编码与可变长编码 定长编码 每个字符都用固定长度的编码来表示。 例如假设一个文本是由字符 a、u、x 和 z 组成的字符串&#xff0c;每个字符用2位二进…

ShardingSphereJDBC简单入门

ShardingSphere 介绍ShardingSphere-JDBCSharding-Sphere-ProxyShardingSphere-Sidecar混合架构运行模式DistSQL可拔插架构ShardingSphere的发展路线 主从复制ShardingSphere-JDBC功能SQL解析SQL支持程度SQL稳定支持SQL实验性支持 MySQL不支持SQL清单分页 数据分片垂直分片水平…

不再花冤枉钱!教你怎么选知识付费平台

在当今的知识付费市场中&#xff0c;用户面临的选择越来越多&#xff0c;如何从众多知识付费平台中正确选择属于自己的平台呢&#xff1f;下面&#xff0c;我们将为您介绍明理信息科技知识付费平台相比同行的优势&#xff0c;帮助您做出明智的选择。 一、创新的技术架构&#…

docker部署go gin框架 Windows环境

目录 文章目的是什么 环境介绍 Windows 环境下 docker 部署 go gin 详细步骤 运行容器时因为挂载文件可能会出现的问题 直接部署gin&#xff08;跳过运行容器时因为挂载文件可能会出现的问题&#xff09; 文章目的是什么 假设我们学习了 go 语言&#xff0c;在 Windows(本…

C语言 简单使用qsort 比较结构体字符串大小

1.先简单调用C语言封装好的冒泡排序 #include<stdio.h> #include<stdlib.h> #include<string.h> //qsort C语言封装好的冒泡排序 可比较任何类型 struct stu{char name[20];int age; }; //用户自己写的函数。函数名字也作为函数指针使用。是qsort函数的第四…

代码随想录第三十三天(一刷C语言)|斐波那契数爬楼梯使用最小花费爬楼梯

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 动态规划步骤&#xff1a; 确定dp数组以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 一、斐波那契数 思路&#xff1a;参考carl文档 1、dp[i]的定义为&#xff…

PDI/Kettle-9.2.0.0-R(对应jdk1.8)源码编译问题记录及源码结构简介

目录 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;目的&#x1f4d7;总体方向 &#x1f4da;第二章 代码结构初识基本结构&#x1f4d7;代码模块详情 ⁉️问题记录❓问题一&#xff1a;代码分支哪些是发布版本❗答&#xff1a;后缀-R的版本 ❓问题二&#xff1a;50…

猫粮哪个牌子质量好性价比高?盘点十款主食冻干猫粮品牌排行榜!

在过去的100多年里&#xff0c;猫咪主食市场一直被膨化猫粮主导。然而&#xff0c;随着猫咪频频出现猝死、失明、发育不良以及营养不良等问题&#xff0c;猫主人们开始质疑膨化粮是否最适合猫咪。于是&#xff0c;从上世纪90年代开始&#xff0c;出现了生骨肉喂养。生骨肉确实是…

[算法总结] 十大排序算法

[算法总结] 十大排序算法 简介&#xff1a; 本文首发于我的个人博客&#xff1a;尾尾部落排序算法是最经典的算法知识。因为其实现代码短&#xff0c;应该广&#xff0c;在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速排序和归并排序等基本的排序算法…

代码随想录算法训练营 | day48 动态规划 198.打家劫舍,213.打家劫舍Ⅱ,337.打家劫舍Ⅲ

刷题 198.打家劫舍 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被…

c YUV 转 JPEG(准备霍夫曼编码)

先取yuv 文件中一个168的块&#xff0c;跑通全流程 理解与思路&#xff1a; 1.块分割 YUV 文件分为&#xff1a;YUV444 YUV 422 YUV420。444:就是&#xff1a;12个char 有4个Y&#xff0c;4个U&#xff0c;4个 U&#xff0c;422&#xff1a;8个char 中有4个Y &#x…

Oracle MongoDB

听课的时候第一次碰到&#xff0c;可以了解一下吧&#xff0c;就直接开了墨者学院的靶场 #oracle数据库 Oracle数据库注入全方位利用 - 先知社区 这篇写的真的很好 1.判断注入点 当时找了半天没找到 看样子是找到了&#xff0c;测试一下看看 id1 and 11 时没有报错 2.判断字段…

开发人员必须掌握的几个高级命令

xargs命令 在平时的使用中,我认为 xargs 这个命令还是较为重要和方便的。我们可以通过使用这个命令,将命令输出的结果作为参数传递给另一个命令。 比如说我们想找出某个路径下以 .conf 结尾的文件,并将这些文件进行分类,那么普通的做法就是先将以 .conf 结尾的文件先找出…

linux(centos7)mysql8.0主从集群搭建(两台机器)

docker安装:&#xff08;转载&#xff09;centos7安装Docker详细步骤&#xff08;无坑版教程&#xff09;-CSDN博客 环境信息 主数据库服务器&#xff1a;192.168.1.10 从数据库服务器&#xff1a;192.168.1.11 1. mysql8.0镜像下载 docker pull mysql:8.0.23 2.创建docke…

SaaS 电商设计 (五) 私有化部署-实现 binlog 中间件适配

一、 背景 具体的中间件私有化背景在上文 SaaS 电商设计 (二) 私有化部署-缓存中间件适配 已有做相关介绍.这里具体讨论的场景是通过解析mysql binlog 来实现mysql到其他数据源的同步.具体比如:在电商的解决方案业务流中经常有 ES 的使用场景,用以解决一些复杂的查询和搜索商品…

17--异常处理

1、异常概述 1.1 什么是异常 异常&#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常情况&#xff0c;如果不处理最终会导致JVM的非正常停止。 异常指的并不是语法错误和逻辑错误。语法错了&#xff0c;编译不通过&#xff0c;不会产生字节码文件&#xff0c;根本运…

01.前言

前言 1.什么是前端开发 前端开发是创建 Web 页面或 app 等前端界面呈现给用户的过程核心技术&#xff1a;HTML&#xff0c;CSS&#xff0c;JavaScript 以及衍生出的各种技术&#xff0c;框架等 2.前端开发应用场景 3.前端职业路线 4.什么是CS架构与BS架构 介绍 应用软件&a…

SuperMap iClient3D for Cesium 实现鼠标移动选中模型并显示模型对应字段

SuperMap iClient3D for cesium 实现鼠标移动选中模型并显示模型对应字段 一、实现思路二、数据制作1. 计算出模型中心点并保存到属性表中2. 计算出模型顶部高程3. 模型数据切缓存4. 发布三维服务. 三、代码编写 作者&#xff1a;xkf 一、实现思路 将模型属性数据存储到前端&a…

c++面经总结

C基础语法 C和c的区别 c中new和delete是对内存分配的运算符&#xff0c;取代了c中的malloc和free 标准c中的字符串类取代了标准c函数库头文件中的字符数组处理函数(c中没有字符串类型). 在c中&#xff0c;允许有相同的函数名&#xff0c;不过他们的参数类型不能完全相同&…

JAVA:深入探讨Java 8 Stream的强大功能与用法

1、简述 Java 8引入了Stream API&#xff0c;为处理集合数据提供了一种更为强大和灵活的方式。Stream是一种抽象的数据结构&#xff0c;它允许你以一种声明性的方式处理数据集合。与传统的集合操作不同&#xff0c;Stream并不是一个存储数据的数据结构&#xff0c;而是在源数据…