学习笔记7——数据库基础知识以及mysql的查询语句

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

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

数据库

  • 三个概念区分

    • DB:数据库,存储数据的仓库,有组织的数据容器
    • DBMS:数据库管理系统
    • SQL:几乎所有的DBMS都支持的语言
  • 对数据库的大致了解过程

    MySQL详细学习教程(建议收藏)-CSDN博客

    聚集索引(聚类索引)与非聚集索引(非聚类索引) - 知乎 (zhihu.com)

    主键约束(PRIMARY KEY)和唯一约束(UNIQUE)的区别_主键约束和唯一约束有什么区别-CSDN博客

    事务ACID理解-CSDN博客

    数据库三级模式:外模式、模式和内模式_数据库模式内模式外模式-CSDN博客

  • 基础知识

    • mysql的索引从1开始,但是分页查询是从0开始起始索引
    • 起别名,as或者空格,需要注意**【由于mysql先执行from,所以起了别名后,其他地方就不能再使用原名】**
    • mysql中+只有运算符含义,如果遇到字符串就会将字符转化为数据:转化成功继续计算,转化失败则将字符型转化为0,如果其中一个为null那么拼接结果为null
    • 字符串拼接:SELECT CONCAT(first_name,last_name) AS “name” FROM employees; 如果其中一个为null那么拼接结果为null
    • DESC departments;
    • 字段用着重符,如果是加入的字符串要用单引
    • IFNULL(字段,0) 字段为null则改为0,不为null则仍为原数据
    • 在GBK中一个字符占2个字节,utf8中一个字符占3个字节
  • 1、> < = != >= <=
    2、and or not
    3、like / between and / in / is null

  • like 用通配符% 表示任意多的字符,包括0个,下划线表示一个

    • SELECT *
      FROM employees
      WHERE first_name LIKE ‘%a%’;

      SELECT *
      FROM employees
      WHERE first_name LIKE ‘__e__a%’;

      SELECT *
      FROM employees
      WHERE last_name LIKE ‘__%’

  • between

    • 两边都是闭区间、有前后关系

      SELECT *
      FROM employees
      WHERE employee_id BETWEEN 100 AND 120;

  • IN: 表示某字段是否满足in列表中的一项,in中的判断逻辑是:是否能找到直接相等?

    • SELECT *
      FROM employees
      WHERE job_id IN (‘IT_PROG’,‘AS_VD’);
  • IS NULL:等号不能判断null, <=>安全等于符号

    • SELECT *
      FROM employees
      WHERE commission_pct IS NULL;
    • SELECT *
      FROM employees
      WHERE commission_pct IS NOT NULL;
  • 排序查询

    • 默认为升序、ASC \ DESC

    • 一般放在查询的最后边

    • SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS money
      FROM employees
      ORDER BY money DESC;
      
      # 按照多个条件进行排序
      SELECT *
      FROM employees
      ORDER BY salary DESC, employee_id;
      
  • 常见函数

    • 单行函数:concat / length / ifnull / UPPER / LOWER (变化大小写) / substr(截取字符串) / instr(返回第一次出现的起始索引),trim是去掉左右空格,lpad

      # 返回第一次出现的起始索引
      SELECT INSTR('zhuahdhqwdhqwo','hq');
      # 可以选择去前或者去后
      SELECT TRIM('a' FROM 'aaaazhiyaaaaaaa');
      # lpad进行左长度填充,超过固定长度就会截断
      SELECT LPAD('yyy',10,'-');
      # rpad右填充
      SELECT RPAD('yyy',10,'-');
      # replace
      SELECT REPLACE('nihaowoshiczy','czy','dameinv');
      
      # round:四舍五入
      SELECT ROUND(4.5);
      SELECT ROUND(1.657,2);
      
      # ceil:向上取整,返回大于等于本身的最小整数
      
      # floor:向下取整,返回小于等于本身的最小整数
      
      # truncate 截断
      SELECT TRUNCATE(1.666666,3);
      
      #mod取余,结果只看被除数的正负号: mod(a,b)  =  a-a/b*b
      
      #时间转换 STR_TO_DATE
      SELECT STR_TO_DATE('7-31 2023','%c-%d %Y');
      SELECT DATE_FORMAT(NOW(),'%Y  %c_%d');
      
      select version();
      select database();
      
      # 查询时间之差
      SELECT DATEDIFF(NOW(),'2000-7-31');
      
    • 流程控制函数

      # if
      SELECT IF(commission_pct IS NULL,'A','B') FROM employees;
      
      # case当作switch使用
      SELECT salary, department_id, 
      CASE department_id
      WHEN 30 THEN salary*1.1
      WHEN 40 THEN salary*1.2
      WHEN 50 THEN salary*1.3
      ELSE salary
      END 
      FROM employees;
      
      # case当作if else使用
      SELECT salary,
      CASE
      WHEN salary >20000 THEN 'A'
      WHEN salary >15000 THEN 'B'
      WHEN salary >10000 THEN 'C'
      ELSE 'D'
      END
      FROM employees;
      
    • 分组函数:max / min / avg / sum / count 和分组函数一起查询的字段需要和分组函数结果一致

      sum和avg不计算考虑null
      max和min也忽略考虑null
      count计算的是非空字段的数量
      
      SELECT COUNT(*) FROM employees;
      SELECT COUNT(1) FROM employees;
      
  • 查询

    • 分组查询

      SELECT MAX(salary),job_id
      FROM employees
      GROUP BY job_id;
      
      
      SELECT COUNT(*), department_id
      FROM employees
      GROUP BY department_id
      HAVING COUNT(*)>2;
      
      # 查询每个工种有奖金的最高工资大于12000的工种和最高工资
      SELECT job_id, MAX(salary)
      FROM employees
      WHERE commission_pct IS NOT NULL
      GROUP BY job_id
      HAVING MAX(salary)>12000;
      
      # 查询领导编号大于102的每个领导下最低工资大于5000的领导编号和最低工资
      SELECT manager_id, MIN(salary)
      FROM employees
      WHERE manager_id > 102
      GROUP BY manager_id
      HAVING MIN(salary)>5000;
      
      # 多个字段分组
      SELECT AVG(salary), department_id, job_id
      FROM employees
      GROUP BY department_id, job_id;
      
      # 多个字段分组查询
      SELECT AVG(salary), department_id, job_id
      FROM employees
      WHERE department_id IS NOT NULL
      GROUP BY department_id, job_id
      HAVING AVG(salary)>10000
      ORDER BY AVG(salary) DESC;
      
    • 连接查询:sql92和sql99语法

      # sql92语法内连接语法:
      
      # 等值连接:产生交集部分
      SELECT `name`,boyname FROM beauty, boys
      WHERE beauty.`boyfriend_id` =  boys.`id`;
      
      SELECT department_name,d.manager_id,MIN(salary)
      FROM departments d, employees e
      WHERE e.`department_id` = d.`department_id` AND e.`commission_pct` IS NOT NULL
      GROUP BY department_name,d.manager_id;
      
      # 非等值连接
      SELECT salary, grade_id
      FROM employees,job_grade
      WHERE salary BETWEEN lowerst_sal AND highest_sal;
      
      # 自连接
      SELECT a.`employee_id`, b.`employee_id`
      FROM employees a, employees b
      WHERE a.`manager_id` = b.`employee_id`;
      
      
      SELECT country_id, COUNT(*)
      FROM departments d,locations l
      WHERE d.`location_id` = l.`location_id`
      GROUP BY l.`country_id`
      HAVING COUNT(*)>2;
      
      # sql99内连接语法
      #inner join
      SELECT last_name,department_name
      FROM employees e
      INNER JOIN departments d
      ON e.`department_id` = d.`department_id`;
      
      # 三表连接
      SELECT last_name,department_name,job_title 
      FROM employees e
      INNER JOIN departments d
      ON e.`department_id` = d.`department_id`
      INNER JOIN jobs j
      ON e.`job_id` = j.`job_id`
      ORDER BY department_name;
      
      # 非等值连接
      # 自连接
      SELECT e.last_name,m.last_name
      FROM employees e
      INNER JOIN employees m
      ON e.`manager_id` = m.`employee_id`
      WHERE e.`last_name` LIKE '%k%';
      
      # 外连接,用于查询一个表中有另一个表中没有,结果为主表的全部记录
      # 包括两部分:内连接(只要有相等就会显示) + 主表有但是从表没有的显示为null(筛选的时候用从表的主键)
      # 左外和右外交换表的顺序,可以实现同样的结果
      # 一般是为了查询除了交集部分的不匹配的行
      
      # left outer  right outer
      SELECT `name`,boys.*
      FROM beauty
      LEFT OUTER JOIN boys 
      ON beauty.`boyfriend_id` = boys.`id`
      WHERE boys.id IS NOT NULL;
      
      SELECT department_name
      FROM departments d
      LEFT OUTER JOIN employees e
      ON d.department_id = e.department_id
      WHERE e.employee_id IS NULL;
      
      
      # 查询部门名为SAL或者IT的员工信息,防止出现SAL部门没有员工
      SELECT e.*
      FROM employees e
      RIGHT OUTER JOIN departments d
      ON e.`department_id` = d.`department_id`
      WHERE d.`department_name`= 'SAL' OR d.`department_name` = 'IT';
      
      # full outer join,除了内连接结果,保留左和右边没有匹配的部分
      
      # 交叉连接:就是笛卡尔乘积
      SELECT `name`, boyname
      FROM beauty
      CROSS JOIN boys;  
      
    • 子查询

      # 有了子查询后尽量不要用两表连接筛选了
      # 如果是select嵌套select那么成为外查询/主查询
      
      # 子查询,结果集为一个标量值
      # where后边加select
      SELECT last_name,job_id,salary
      FROM employees
      WHERE salary=(
      	SELECT MIN(salary)
      	FROM employees
      );
      
      # having后边加select
      SELECT department_id,MIN(salary)
      FROM employees
      GROUP BY department_id
      HAVING MIN(salary)>(
      	SELECT MIN(salary)
      	FROM employees
      	WHERE department_id = 50
      );
      
      in/not in:可以改写为 =any / !=all
      ANY
      ALL
      
      # select后边加select
      # 查询是一条一条进行遍历的,所以在select后边的查询必须是一行一列
      SELECT d.*,(
      	SELECT COUNT(*)
      	FROM employees e
      	WHERE e.department_id = d.department_id
      )FROM departments d;
      
      # from后边加select,必须给新表起别名
      SELECT ag_dep.*, jg.level
      FROM
      (
      	SELECT AVG(salary) ag,department_id
      	FROM employees
      	GROUP BY department_id
      ) ag_dep INNER JOIN job_grades jg
      ON ag_dep.ag BETWEEN jg.lowest_sal AND jg.highest_sal
      
      # exist
      SELECT d.department_name
      FROM departments d
      WHERE d.department_id IN (
      	SELECT e.department_id
      	FROM employees e
      );
      
      SELECT d.department_name
      FROM departments d
      WHERE EXISTS(
      	SELECT *
      	FROM employees e
      	WHERE e.`department_id` = d.`department_id`
      );
      
      SELECT bo.*
      FROM boys bo
      WHERE EXISTS(
      	SELECT *
      	FROM beauty b
      	WHERE b.`boyfriend_id`  = bo.`id`
      );
      
      SELECT bo.*
      FROM boys bo
      WHERE bo.`id`  IN (
      	SELECT b.`boyfriend_id`
      	FROM beauty b
      );
      
    • 分页查询

      # 分页查询
      limit offset,size;
      offset:要显示的起始索引,从0开始
      size:要显示的条目数
      
      # 分页公式:
      limit (page-1)*size,size;
      
      SELECT *
      FROM employees
      WHERE commission_pct IS NOT NULL
      ORDER BY salary DESC
      LIMIT 10;
      

      在这里插入图片描述

      # 一个经典的样例
      # 查平均工资最高的部门的manager的信息
      # 两个表的不同拼接会是不同结果
      (
      如果是employee的department_id和department的department_id拼接,那么得到的结果是我们知道每个员工的部门详细信息
      但是如果是employee的employee_id和department的manager_id拼接,那么得到的是我们知道每个部门领导人的详细信息
      )
      
      SELECT *
      FROM employees e
      INNER JOIN departments d
      ON e.`employee_id` = d.`manager_id`
      WHERE d.`department_id` = (
      	SELECT  department_id
      	FROM employees
      	GROUP BY department_id
      	ORDER BY AVG(salary) DESC
      	LIMIT 1
      );
      
    • 联合查询

      union 连接两个查询结果:查询结果来自于多个表,表之间没有连接关系,但是查询结果列数和列类型要一致 
      union all:可以包含两个表中的重复项
      

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

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

相关文章

从PDF和图像中提取文本,以供大型语言模型使用

想法 大型语言模型已经席卷了互联网&#xff0c;导致更多的人没有认真关注使用这些模型最重要的部分&#xff1a;高质量的数据&#xff01;本文旨在提供一些有效从任何类型文档中提取文本的技术。 Python库 本文专注于Pytesseract、easyOCR、PyPDF2和LangChain库。实验数据是一…

jQuery的使用

目录 jquery对象&#xff1a; jquery作为一般函数调用参数: jquery事件机制 jquery dom操作 jquery对象&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" cont…

MySQL 教程 1.4

MySQL 连接 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库。 实例 以下是从命令行中连接mysql服务器的简单实例&#xff1a; [roothost]# mysql -u root -p Enter password:****** 在登录成功后会出现 mysql> 命令提示窗…

Python全栈之基本数据类型详解

文章目录 1.注释2.输出3.变量4.命名规范5.变量的定义方式1.字符串类型2.数字类型3.List列表类型4.tuple 元组类型的定义5.Dict字典类型6.set集合类型7.数据类型转换8.自动类型转换9.强制类型转换关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品…

Reactor网络线程模型

目录 传统下网络服务模型 事件监听模型 NIO核心概念 单线程Reactor模式 多线程Reactor模式 Kafka 的网络设计 主要概念 类比思维理解 参考文章 传统下网络服务模型 线程太多无法处理大规模请求 事件监听模型 NIO核心概念 nio是实现reactor模式的底层API代码 单…

【SparkSQL】SparkSQL函数定义(重点:定义UDF函数、使用窗口函数)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍SparkSQL 定义UDF函数、SparkSQL 使用窗口函数。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#xff1a;《【SparkSQL…

C++相关闲碎记录(2)

1、误用shared_ptr int* p new int; shared_ptr<int> sp1(p); shared_ptr<int> sp2(p); //error // 通过原始指针两次创建shared_ptr是错误的shared_ptr<int> sp1(new int); shared_ptr<int> sp2(sp1); //ok 如果对C相关闲碎记录(1)中记录的shar…

【前缀和]LeetCode1862:向下取整数对和

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 作者推荐 动态规划LeetCode2552&#xff1a;优化了6版的1324模式 题目 给你一个整数数组 nums &#xff0c;请你返回所有下标对 0 < i, j < nums.length 的 …

一文带你了解网络安全简史

网络安全简史 1. 上古时代1.1 计算机病毒的理论原型1.2 早期计算机病毒1.3 主要特点 2. 黑客时代2.1 计算机病毒的大流行2.2 知名计算机病毒2.3 主要特点 3. 黑产时代3.1 网络威胁持续升级3.2 代表性事件3.3 主要特点 4 高级威胁时代4.1 高级威胁时代到来4.2 著名的APT组织4.3 …

Python之Requests模块简介与安装

Requests模块简介 在python的标准库中&#xff0c;虽然提供了urllib,utllib2,httplib&#xff0c;但是做接口测试&#xff0c;requests使用更加方便快捷&#xff0c;正如官方说的&#xff0c;“让HTTP服务人类”。 Requests是用python语言基于urllib编写的&#xff0c;采用的是…

利用异或、取反、自增bypass_webshell_waf

目录 引言 利用异或 介绍 eval与assert 蚁剑连接 进阶题目 利用取反 利用自增 引言 有这样一个waf用于防御我们上传的文件&#xff1a; function fun($var): bool{$blacklist ["\$_", "eval","copy" ,"assert","usort…

折扣因子的变化图(Python)

var 3 var_list [3] for _ in range(50):var * .95var_list.append(var)import matplotlib.pyplot as plt import numpy as np plt.plot(np.arange(len(var_list)), var_list, linewidth1) plt.show()

美丽的时钟

案例绘制一个时钟 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>美丽的时钟</title><script language"javascript">window.onloadfunction(){var clockdocument.getElementById("clock"…

你需要知道所有设计模式吗?

后续我会详细展开设计模式 &#x1d5d7;&#x1d5fc; &#x1d5ec;&#x1d5fc;&#x1d602; &#x1d5e1;&#x1d5f2;&#x1d5f2;&#x1d5f1; &#x1d5e7;&#x1d5fc; &#x1d5de;&#x1d5fb;&#x1d5fc;&#x1d604; &#x1d5d4;&#x1d5f9;&…

溜冰场电脑收银系统软件会员管理操作教程,佳易王溜冰场会员卡管理软件下载

溜冰场电脑收银系统软件会员管理操作教程&#xff0c;佳易王溜冰场会员卡管理软件下载 一、软件 部分功能简介&#xff1a; 1、会员信息登记 &#xff1a;可以直接使用手机号登记&#xff0c;也可以使用实体卡片&#xff0c;推荐用手机号即可。 2、会员卡类型 &#xff1a;可…

Redis:事务操作

目录 Redis事务定义相关命令事务的错误处事务冲突的问题Redis事务三特性 Redis事务定义 redis事务是一个单独的隔离操作&#xff0c;事务中的所有命令都会序列化、按顺序地执行&#xff0c;事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 redis事务…

HTAP 还可以这么玩?丨TiDB 在 IoT 智慧园区的应用

作者&#xff1a;某物联网公司设施云平台负责人 用户简介&#xff1a;我们是一家提供全链智慧园区整体解决方案的物联网公司&#xff0c;致力于打造可持续发展的智慧园区。 基础设施平台简介 基础设施平台是集团一线作业人员日常工作中高度依赖的重要系统&#xff0c;涵盖了各…

涉密计算机违规外联原因及防范措施

高度信息化的时代&#xff0c;涉密计算机违规外联已成为一种严重的安全威胁。涉密计算机违规外联是指涉密计算机通过互联网、电子邮件等方式与外部计算机或网络进行连接&#xff0c;导致机密信息泄露或被恶意攻击。 为了应对这一问题&#xff0c;本文将探讨涉密计算机违规外联的…

WPF实战项目十九(客户端):修改RestSharp的引用

修改HttpRestClient&#xff0c;更新RestSharp到110.2.0&#xff0c;因为106版本和110版本的代码不一样&#xff0c;所以需要修改下代码 using Newtonsoft.Json; using RestSharp; using System; using System.Threading.Tasks; using WPFProjectShared;namespace WPFProject.S…

wps备份功能 救了我一命

感谢wps备份功能 救了我一命 文章目录 感谢wps备份功能 救了我一命**&#x1f4dd;场景回现&#xff0c;往后再不干了**&#x1f9e3;灵光一现&#x1f4c7;备注中心的设置流程&#x1f58a;️最后总结 &#x1f4dd;场景回现&#xff0c;往后再不干了 小&#x1f42e;今天接到…