当前位置:首页 > 文章列表 > 数据库 > MySQL > mysql 基础学习笔记

mysql 基础学习笔记

来源:SegmentFault 2023-01-25 20:22:37 0浏览 收藏

怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《mysql 基础学习笔记》,涉及到MySQL,有需要的可以收藏一下

安装

MacOS

Windows 10

Centos 7

SQL规范

  1. 不区分大小写,但是建议大写
    数值:
        整型:
        小数:
            定点数
            浮点数
    字符:
        短字符: char varcahr 
        长文本: text blob
    日期:
        date        2020-02-03
        datetime    2020-02-02 02:02:02
        timesiamp   1594279093389
        time        02:02:02
        year        2020

    常用SQL

    use test; -- 选中 数据库
    show tables; -- 现实当前选中的库的所有表
    
    show tables from mysql; # 查询mysql下的tables
    
    SHOW INDEX FROM stuinfo; # 显示当前的索引
    
    select database(); # 查看当前库
    
    /* create table table1(
        id int,
        name varchar(24)
    ); */
    
    desc table1; -- 查看表结构
    
    select * from table1;
    
    insert into table1 (id,name) values(1,'测试'); -- 插入
    
    update table1 set name='我靠' where name='ces'; -- 修改
    
    update table1 set id=0 where name='我靠'; -- 修改
    
    delete from table1 where name='我靠'; -- 删除
    
    

    常见函数

    单行函数

    处理

    字符函数

    SELECT LENGTH('我是谁'); -- 根据当前字符集 得到当前字节长度
    
    SELECT CONCAT('我','是','谁呀'); -- 拼接字符串
    
    SELECT UPPER('Abc'); -- 转换成大写字符
    
    SELECT LOWER('Abc'); -- 转换成小写
    
    SELECT SUBSTR('abc123一二三',4,3); -- 从4开始截取3个 包含4 索引从1开始
    
    SELECT SUBSTRING('abc123一二三',4,3); -- 从4开始截取3个 包含4 索引从1开始
    
    SELECT INSTR('01234556','234'); -- 查找字符串出现的位置 没找到就是0
    
    SELECT TRIM(' A B C D '); -- 去除前后空格
    
    SELECT TRIM('a' FROM 'aaaaA B  CaaaDaaaa' ); -- 去除前后的a
    
    SELECT LPAD('abc123一二三',20,'*'); -- 左填充/保留左边的
    SELECT RPAD('abc123一二三',20,'*'); -- 右填充/保留左边的
    

    数学函数

    SELECT ROUND(0.4); -- 四舍五入
    SELECT ROUND(0.5);  -- 四舍五入
    SELECT ROUND(-0.4);  -- 四舍五入
    SELECT ROUND(-0.5);  -- 四舍五入
    
    SELECT CEIL(0.2); -- 向上取整
    SELECT FLOOR(0.9); -- 向下取整
    
    SELECT RAND(); -- 随机数
    
    SELECT TRUNCATE(0.2345,3); -- 保留多少位小数 不进行处理
    
    SELECT MOD(10,3); -- 取余
    

    日期函数

    SELECT NOW(); -- 返回当前的日期时间
    
    SELECT CURDATE(); -- 返回当前的日期
    
    SELECT CURTIME(); -- 返回当前时间
    
    SELECT YEAR(NOW()) as `year`, MONTH(NOW()) as `month`, DAY(NOW()) as date as `day`; -- 年/月/日
    
    SELECT STR_TO_DATE('2020-03-23 22:32:12','%Y-%m-%d %H:%i:%s'); -- 将字符串解析成时间
    
    SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s'); -- 格式化时间

    其他函数

    SELECT VERSION(); -- 查看版本号
    
    SELECT DATABASE(); -- 查看当前的库
     
    SELECT USER(); -- 当前用户

    流程控制函数

    SELECT IF(10

    统计函数

    统计

    SELECT COUNT(*) FROM `employees`; -- 数量统计
    SELECT SUM(`salary`) FROM `employees`; -- 相加和
    SELECT AVG(`salary`) FROM `employees`; -- 平均值
    SELECT MAX(`salary`) FROM `employees`; -- 最大值
    SELECT MIN(`salary`) FROM `employees`; -- 最小值
    
    SELECT COUNT(*) AS `count`, SUM(`salary`) AS `sum`, AVG(`salary`) AS `avg`, MAX(`salary`) as `max`, MIN(`salary`) as `min`
    FROM `employees`;
    
    # 注意
    /*
    
    */

    常见约束

    一种限制,用于限制表中的数据,用来保证表中数据的准确和可靠性

    分类:
        六大约束:
            NOT NULL: 非空,用于保证该字段的值不能为空
            DEFAULT: 默认值
            PRIMARY KEY: 主键,用于保证该字段具有唯一性(非空)
            UNIQUE: 唯一(可空)
            CHECK: 检查 (mysql 不支持)
            FOREIGN KEY: 外键,用于限制两个表的关系,用于保证该字段必须来自关联表的主键
        添加约束的时机:
            1. 创建表
            2. 修改表
        约束的添加分类:
            列级约束:
                六大约束语法上都支持,外键约束无效
            表级约束:
                除了非空和默认其他都支持
                
    主键和唯一的区别:
        主键:唯一、非空、只能一个
        唯一:唯一、可空、多个
    
    外键:
        1. 从表设置外键关系
        2. 主从表类型一致/兼容
        3. 主表关联键一般为主键或唯一
        4. 必须对应主表数据,删除先删除从表再删除主表

    DQL 数据查询语言

    常量、表达式、函数

    SELECT 1; -- 常量值
    SELECT 10*20; -- 表达式
    SELECT VERSION(); -- 函数

    别名

    SELECT 1+2 as number;

    去重

    SELECT DISTINCT 
        `name`
    FROM 
        `table`

    +号

    SELECT 1+2; -- 数字相加
    SELECT 1+'123'; -- 字符串会强转成数字非数字转为0
    SELECT 1 + Null; -- 与Null返回Null

    字符串连接
    SELECT CONCAT('a','b','c'); -- 字符串拼接
    SELECT CONCAT(`first_name`,`last_name`) as `name` FROM `employees`; -- 拼接字段

    条件查询

    条件表达式
    # 等于
    SELECT 
        CONCAT(`first_name`,`last_name`) as `name` 
    FROM `employees` 
    WHERE 
        `first_name`='Bruce'; 
    
    # 安全等于 可查 Null
    
    SELECT 
        CONCAT(`first_name`,`last_name`) as `name` 
    FROM `employees` 
    WHERE 
        `first_name`'Bruce'; 
    
    # 大于
    SELECT 
        *
    FROM `employees` 
    WHERE 
        `department_id` > 60;
    
    # 小于
    SELECT 
        *
    FROM `employees` 
    WHERE 
        `department_id`  60;
    逻辑表达式
    # 且查询
    # 不建议 &&
    SELECT 
    CONCAT(`first_name`,`last_name`) as `name`
    FROM `employees` 
    WHERE 
        `first_name`='Bruce' 
        AND 
        `last_name`='Ernst';
    
    # 或
    SELECT 
        CONCAT(`first_name`,`last_name`) as `name` 
    FROM `employees` 
    WHERE 
        `first_name`='Bruce' 
        OR 
        `last_name`='K_ing';
        
    # 非
    SELECT 
        CONCAT(`first_name`,`last_name`) as `name` 
    FROM `employees` 
    WHERE 
        NOT
        `first_name`='Bruce' 
    模糊查询
    # 包含 a
    SELECT * FROM `employees` 
    WHERE 
        `first_name` like '%a%'; 
    
    # 定义转义字符
    SELECT * FROM `employees` 
    WHERE 
        `last_name` like '%$_%' ESCAPE '$'; 
    
    # 查找100 到200 之间的数据
    SELECT * FROM `employees` 
    WHERE 
        `employee_id` BETWEEN 100 AND 200;
    # 查询是否属于某些列表中的某一个
    SELECT * FROM `employees` 
    WHERE 
        `job_id` IN ('SH_CLERK','AD_ASST','AD_VP');
    # 查询字段为空的
    SELECT * FROM `employees`
    WHERE
        `commission_pct` IS NULL;
    
    # 查询不为空的
    SELECT * FROM `employees`
    WHERE
        NOT `commission_pct` IS NULL;
    
    SELECT * FROM `employees`
    WHERE
        `commission_pct` IS NOT NULL;
    SELECT * FROM `employees`
    WHERE
        `commission_pct`  NULL;
    SELECT * FROM `employees` ORDER BY `salary` ASC; -- 升序
    SELECT * FROM `employees` ORDER BY `salary` DESC; -- 降序
    
    SELECT `salary` * IFNULL(`commission_pct`,0) + IFNULL(manager_id,0) as money,`salary`  FROM `employees` ORDER BY `money`; -- 表达式别名降序
    
    SELECT LENGTH(`last_name`) as len FROM `employees` ORDER BY len; -- 按函数
    
    SELECT * FROM `employees` ORDER BY `salary` DESC, `employee_id` ASC; -- 多个排序条件

    分组查询

    # 每个工种的总工资
    SELECT SUM(`salary`) AS `money`,`job_id` FROM `employees` GROUP BY `job_id` ORDER BY `money`;
    
    # 每个工种的最高工资
    SELECT MAX(`salary`) as `max`,`job_id` FROM `employees` GROUP BY `job_id` ORDER BY `max`;
    
    # 查询邮箱包含a的工种的最高工资
    SELECT MAX(`salary`) as `max`, `job_id`
    FROM `employees`
    WHERE email LIKE '%a%' 
    GROUP BY `job_id` 
    ORDER BY `max`;
    
    # 查询邮箱包含a的工种的最高工资大于1万的   HAVING
    SELECT MAX(`salary`) as `max`, `job_id` 
    FROM `employees`
    WHERE email LIKE '%a%' 
    GROUP BY `job_id`
    HAVING `max` > 10000
    ORDER BY `max`;
    
    # 查询名称长度一样的大于5个人的数据
    SELECT LENGTH(`first_name`) AS `name`, COUNT(1) AS `count`
    FROM `employees`
    GROUP BY `name`
    HAVING `count` > 5;
    
    # 多字段分组
    SELECT AVG(`salary`) AS `avg`,`department_id`,`job_id`
    FROM `employees`
    GROUP BY `department_id`,`job_id`
    ORDER BY `department_id`,`job_id`

    连接查询

    分类:
        按年代划分:
            sql92标准:只支持内连接
            sql99标准【推荐】:支持内连接+外来连接(左外、右外)+交叉连接
        按功能划分:
            内连接:
                等值连接
                非等值连接
                自连接
            外连接:
                左外连接
                右外连接
                全外连接
            交叉连接

    sql92标准

    # 等值连接
    SELECT e.`first_name`,j.`job_title`,`j`.`job_id`
    FROM `employees` as e,`jobs` as j
    WHERE `e`.`job_id` = `j`.`job_id`;
    
    # 非等值连接
    
    # 自连接
    SELECT e.last_name,m.employee_id,e.manager_id,m.last_name 
    FROM `employees` AS e, `employees` AS m
    WHERE `e`.employee_id = `m`.manager_id

    sql99标准

    # 等值连接
    SELECT `last_name`,`department_name`
    FROM employees
    INNER JOIN departments
    ON employees.`department_id` = departments.`department_id`
    
    # 复杂的等值连接
    SELECT department_name,COUNT('*') AS count,MAX(`salary`) AS max,min(`salary`) AS min
    FROM employees
    INNER JOIN departments
    ON employees.department_id = departments.department_id
    WHERE last_name LIKE '%o%'
    GROUP BY department_name
    HAVING `count` BETWEEN 2 AND 10
    ORDER BY `count`
    
    # 多表等值连接
    SELECT last_name,department_name,job_title
    FROM employees
    INNER JOIN departments
    ON departments.department_id =employees.department_id
    INNER JOIN jobs
    ON employees.job_id = jobs.job_id;
    

    子查询

    分类:
        按出现位置:
            select 后面:
                只支持标量子查询
            form 后面
                表子查询
            where 和having后面 *
                标量子查询  *
                列子查询    *
                行子查询
            exists后面
                表子查询
            
        按结果集的行列数不同:
            标量子查询(结果集只有一行一列)
            列子查询(结果集只有一列多行)
            行子查询(结果集只有多列一行)
            表子查询(结果集一般多行多列)

    where 和having后面

    特点: 1. 放在小括号内 2. 放在条件右侧 3. 标量子查询:配合单行操作符。列子查询:配合多行操作符。

    # 查询工资比Abel高的人
    SELECT * FROM employees 
    WHERE salary > (
        SELECT salary FROM employees 
        WHERE last_name = 'Abel'
    );
    
    # job_id与141号员工一样且工资大于143号员工的员工
    SELECT last_name,salary,employee_id FROM employees
    WHERE job_id = (
        SELECT job_id FROM employees WHERE employee_id = 141
    ) AND salary > (
        SELECT salary FROM employees WHERE employee_id = 143
    )
    
    # 查询比50号部门最低工资高的部门的最低工资
    SELECT department_id, COUNT(*),MIN(salary) AS minsalary FROM employees 
    GROUP BY department_id
    HAVING minsalary > (SELECT MIN(salary) AS minsalary FROM employees WHERE department_id = 50)
    ORDER BY minsalary DESC;

    分页查询

    SELECT *
    FROM `employees` 
    LIMIT (page-1)*size,size;
    
    SELECT *
    FROM `employees` 
    LIMIT 10,10;

    联合查询

    # 无

    DML 数据操作语言

    插入

    INSERT INTO jobs(job_id,job_title,min_salary,max_salary) VALUES('p_a','捡垃圾1',200,6000);
    
    INSERT INTO jobs 
    VALUES('p_a1','捡垃圾1',200,6000),
    ('p_a2','捡垃圾2',200,6000);
    
    INSERT INTO jobs SET job_id = 'ces',job_title="123"
    
    INSERT INTO jobs SELECT 'ces1','444',200,6000

    修改

    # 简单修改
    UPDATE jobs
    SET job_title = '2222'
    WHERE job_id = 'ces1'
    
    # 修改多表
    UPDATE jobs
    INNER JOIN employees
    ON employees.job_id = jobs.job_id
    SET jobs.job_title = CONCAT(jobs.job_title,'22222'),employees.job_id = 'ces1'
    WHERE jobs.job_title = 'Public Accountant12322222'

    删除

    # 单表删除
    DELETE FROM jobs
    WHERE job_id = 'ces'
    
    # 清空整表
    TRUNCATE TABLE ttt;
    
    # 多表删除
    DELETE employees
    FROM employees
    INNER JOIN jobs
    ON jobs.job_id = employees.job_id
    WHERE jobs.job_id = 'SA_MAN'

    DDL 数据定义语言

    1. 库的管理
        创建\修改\删除
    2. 表的管理
        创建\修改\删除
    
    创建: create
    修改: alter
    删除: drop

    库管理

    # 创建 IF NOT EXISTS 进行容错 CHARACTER SET  字符集
    CREATE DATABASE IF NOT EXISTS books CHARACTER SET utf8;
    
    # 修改 不能该了
    RENAME DATABASE books TO newbook;
    
    # 更改字符集
    ALTER DATABASE books CHARACTER SET gbk;
    
    # 库的删除
    DROP DATABASE IF EXISTS books;
    

    表的管理

    创建表

    USE books;
    # 表的创建
    /*
    CREATE TABLE 表名(
        列名 列类型([长度]) [约束],
        列名 列类型([长度]) [约束],
        ...
    )
    */
    CREATE TABLE book (
        id INT,
        b_name VARCHAR(20),
        price DOUBLE,
        author_id INT,
        publish_date DATETIME
    );
    
    DESC book;
    
    CREATE TABLE author(
        id INT,
        au_name VARCHAR(20),
        nation VARCHAR(10)
    );
    
    DESC author;

    表的修改

    /*
    修改列:
    ALTER TABLE 表名 [CHANGE|MODIFY|ADD|DROP] COLUMN 列名 类型|约束;
    修改表名:
    ALTER TABLE 表名 RENAME TO 新表名;
    */
    # 修改列名
    ALTER TABLE book CHANGE COLUMN publish_date publishDate DATETIME;
    # 修改列类型约束
    ALTER TABLE book MODIFY COLUMN publishDate TIMESTAMP;
    # 添加新列
    ALTER TABLE author ADD COLUMN annual DOUBLE;
    # 删除
    ALTER TABLE author DROP COLUMN annual;
    # 修改表名
    ALTER TABLE author RENAME TO authers;

    表的删除

    DROP TABLE IF EXISTS authers;

    表的复制

    # 复制表结构
    CREATE TABLE copy LIKE author;
    
    # 复制整个表
    CREATE TABLE copy2 
    SELECT * FROM author;

    约束

    添加表时添加约束

    # 列级约束
    CREATE TABLE stuinfo(
        id INT PRIMARY KEY, # 主键
        stu_name VARCHAR(20) NOT NULL, # 非空
        gender CHAR(1) DEFAULT '男', # 默认
        seat INT UNIQUE # 唯一
    );
    
    # 表级约束
    CREATE TABLE stuinfo(
        id INT, # 主键
        stu_name VARCHAR(20), # 非空
        gender CHAR(1) , # 默认
        seat INT, # 唯一
        majorid INT,
        
        CONSTRAINT pk PRIMARY KEY(id),# 主键
        CONSTRAINT uq UNIQUE(seat),# 唯一
        CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外键
    );
    
    # 通用建议约束
    DROP TABLE  IF EXISTS stuinfo;
    CREATE TABLE stuinfo(
        id INT PRIMARY KEY, # 主键
        stu_name VARCHAR(20) NOT NULL, # 非空
        gender CHAR(1) DEFAULT '男', # 默认
        seat INT UNIQUE, # 唯一
        majorid INT,
        -- 表级约束
        CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外键
    );
    
    

    修改表时的约束

    # 修改列约束
    ALTER TABLE stuinfo MODIFY COLUMN stu_name VARCHAR(20) NOT NULL; 
    # 表级约束
    ALTER TABLE stuinfo ADD PRIMARY KEY(id);
    ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);
    # 删除外键
    # ALTER TABLE stuinfo DROP PRIMARY KEY;

    标识列(自增长列)

    AUTO_INCREMENT

    CREATE TABLE stuinfo(
        id INT PRIMARY KEY AUTO_INCREMENT, # 主键
        stu_name VARCHAR(20) NOT NULL, # 非空
        gender CHAR(1) DEFAULT '男', # 默认
        seat INT UNIQUE, # 唯一
        majorid INT,
        -- 表级约束
        CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外键
    );

    TCL 事务控制语言

    一个或一组sql语句组成一个执行单位,要么全部执行,要么全部失败。

    ACID: A: 原子性 C: 一致性 I: 隔离性 D: 持久性

    # 提交表示完成,回滚代表异常
    set autocommit = 0; -- 关闭自动事务
    START TRANSACTION; -- 开始事务
    UPDATE stuinfo SET stu_name = '12232' WHERE id = 3;
    SAVEPOINT a; -- 保存节点
    UPDATE stuinfo SET stu_name = '12332' WHERE id = 5;
    ROLLBACK; -- 回滚事务
    ROLLBACK TO a; -- 回滚事务到指定节点
    COMMIT;    -- 提交事务 

    终于介绍完啦!小伙伴们,这篇关于《mysql 基础学习笔记》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布数据库相关知识,快来关注吧!

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
mysql数据实时同步到Elasticsearch注意事项
下一篇
mysql数据实时同步到Elasticsearch注意事项
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • SEO标题魔匠AI:高质量学术写作平台,毕业论文生成与优化专家
    魔匠AI
    SEO摘要魔匠AI专注于高质量AI学术写作,已稳定运行6年。提供无限改稿、选题优化、大纲生成、多语言支持、真实参考文献、数据图表生成、查重降重等全流程服务,确保论文质量与隐私安全。适用于专科、本科、硕士学生及研究者,满足多语言学术需求。
    24次使用
  • PPTFake答辩PPT生成器:一键生成高效专业的答辩PPT
    PPTFake答辩PPT生成器
    PPTFake答辩PPT生成器,专为答辩准备设计,极致高效生成PPT与自述稿。智能解析内容,提供多样模板,数据可视化,贴心配套服务,灵活自主编辑,降低制作门槛,适用于各类答辩场景。
    38次使用
  • SEO标题Lovart AI:全球首个设计领域AI智能体,实现全链路设计自动化
    Lovart
    SEO摘要探索Lovart AI,这款专注于设计领域的AI智能体,通过多模态模型集成和智能任务拆解,实现全链路设计自动化。无论是品牌全案设计、广告与视频制作,还是文创内容创作,Lovart AI都能满足您的需求,提升设计效率,降低成本。
    53次使用
  • 美图AI抠图:行业领先的智能图像处理技术,3秒出图,精准无误
    美图AI抠图
    美图AI抠图,依托CVPR 2024竞赛亚军技术,提供顶尖的图像处理解决方案。适用于证件照、商品、毛发等多场景,支持批量处理,3秒出图,零PS基础也能轻松操作,满足个人与商业需求。
    49次使用
  • SEO标题PetGPT:智能桌面宠物程序,结合AI对话的个性化陪伴工具
    PetGPT
    SEO摘要PetGPT 是一款基于 Python 和 PyQt 开发的智能桌面宠物程序,集成了 OpenAI 的 GPT 模型,提供上下文感知对话和主动聊天功能。用户可高度自定义宠物的外观和行为,支持插件热更新和二次开发。适用于需要陪伴和效率辅助的办公族、学生及 AI 技术爱好者。
    48次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码