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

news2024/12/23 0:33:24

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

链接: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:可以包含两个表中的重复项
      

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.整数转换为布尔值【2023.12.1】

1.问题描述 整数转换为布尔值。 2.解决思路 输入一个整数。 输出布尔值并输出。 3.代码实现 numint(input("请输入一个数字")) boolnumbool(num) print(boolnum)4.运行结果

Linux破解用户密码【基于redhat9】

Linux破解用户密码【基于redhat9】 操作步骤&#xff1a; 重启虚拟机&#xff0c;选择第二行&#xff0c;按下e键在倒数第二行的末尾加入 rd.break,按下ctrlx键&#xff0c;进入终端界面重新挂载/sysroot为读写切换到bash修改用户密码创建 /.autorelabel 文件使SELinux安全策略…

Grammarly premium语法检测工具使用方法,及删除检测记录

科研写作神器&#xff1a;Grammarly—语法&#xff0c;标点&#xff0c;单词拼写错误修改。 一、背景 在写英文论文时&#xff0c;作为母语不是英语的我们&#xff0c;不可避免的存在语法错误或笔误&#xff0c;这时就需要Grammarly语法修改软件帮助我们进行修正&#xff0c…

计算机毕业设计 基于SpringBoot的敬老院管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

vscode中使用luaide-lite插件断点调试cocos2dx-lua

使用quick-cocos2dx-lua&#xff0c;用了众多插件&#xff0c;包括免费的BabeLua,VS调试太慢&#xff0c;vscode上的免费的EmmyLua, 还有收费的luaide&#xff0c;都没搞出来&#xff0c;唯独这个免费luaide-lite用成功了&#xff0c;步骤也简单&#xff0c;可以断点调试&#…

DLL(直接激光雷达定位)编译运行过程记录

文章&#xff1a;DLL: Direct LIDAR Localization. A map-based localization approach for aerial robots 代码&#xff1a;https://github.com/robotics-upo/dll GitHub - robotics-upo/dll: DLL: Direct Lidar Localization 下载安装DLL 在GitHub网站下载再手动解压、复…

云服务器哪家便宜靠谱?深入解析亚马逊云科技与技术评估

云服务器哪家便宜靠谱呢&#xff1f;换句话说&#xff0c;在选择云服务器时&#xff0c;我们需要选择性价比高便宜、安全性技术性顶尖的&#xff0c;那么&#xff0c;亚马逊云科技作为全球的云服务供应商&#xff0c;其高性价比、高可用性、弹性、安全性和灵活性等特点&#xf…

web前端之css变量的妙用、通过JavaScrip改变css文件中的属性值、querySelector、setProperty

MENU 效果图htmlJavaScripstylequerySelectorsetProperty 效果图 html <div id"idBox" class"p_r w_680 h_160 b_1s_red"><div id"idItem" class"p_a l_0 t_30 w_100 h_100 bc_rgba_255_00_05 radius_50_"></div> …

springboot+jsp+java房屋销售出租赁网站的ssm设计与实现7xcvq

三、研究方案&#xff08;主要研究内容、目标、研究方法等&#xff09; 主要研究内容 房屋租售网站采用的开发框架为springboot框架&#xff0c;也就是Spring mvc、Spring、MyBatis这三个框架&#xff0c;页面设计用的是jsp技术作为动态页面文件设计&#xff0c;jsp文件里可以对…

AH6922B-3V升压9V1A芯片

AH6922B芯片是一款3V升压9V1A芯片&#xff0c;具有可调限流和低功耗等特点。该芯片的工作电压范围为2.7V~12V&#xff0c;可调输出电压最高可达13V&#xff0c;固定工作频率为400kHz&#xff0c;VFB反馈电压为1.2V(2%)。 AH6922B芯片内置了一颗15mΩ、10A、14V的MOSFET&#x…

解决 MapBox addMapStyle 失败,主动刷新地图

应用场景&#xff1a; 底图加载后&#xff0c;边界的图层有时能加载&#xff0c;有时加载不上&#xff0c;在点击或者拖拽移动后可加载成功 最后解决方案&#xff1a; 在子组件中写一个延迟函数&#xff0c;模拟手动点击效果 created(){setTimeout(() > {if ( !this.isLoa…

conda 安装指定Version的指定Build

入下图&#xff0c;我想装cudnn的7.6.5的指定Build版本cuda10.0_0 应该使用如下命令&#xff1a; mamba install cudnn7.6.5cuda10.0_0 没有mamba用conda install也可以

DAPP开发【04】测试驱动开发

测试驱动开发(Test Driven Development)&#xff0c;是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码&#xff0c;然后只编写使测试通过的功能代码通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码&#xff0c…

每日一练2023.12.1——输出GPLT【PTA】

题目链接&#xff1a;L1-023 输出GPLT 题目要求&#xff1a; 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序&#xff0c;按GPLTGPLT....这样的顺序输出&#xff0c;并忽略其它字符。当然&#xff0c;四种字符&#xff08;不区分大小写&#x…

程序员职业发展之旅:从代码入门到身体管理的完美进化

导言&#xff1a; 在编程的世界中&#xff0c;程序员们经常面对着繁忙的工作、长时间的电脑操作和高度集中的注意力。这种职业特性使得许多程序员在追求代码的完美的同时&#xff0c;往往忽略了自身的健康。让我们通过一段幽默的编程时光&#xff0c;探讨程序员的职业发展与身体…

Apache HTTPD 2.448 mod_proxy SSRF漏洞(CVE-2021-40438)

任务一&#xff1a; 复现漏洞 任务二&#xff1a; 尝试利用SSRF漏洞&#xff0c;访问重庆邮电大学官网&#xff08;http://www.cqupt.edu.cn) 1.搭建环境 2.了解这个地方是httpd作为了一个反向代理服务器&#xff0c;也就是先是客户端发送请求给代理服务器&#xff0c;然后…

SSM项目实战-mapper实现

1、SysUserMapper.java package com.atguigu.schedule.mapper; import com.atguigu.schedule.pojo.SysUser; import org.springframework.stereotype.Repository; Repository public interface SysUserMapper {SysUser getSysUser(SysUser sysUser); }2、ScheduleMapper.java p…

Qt for Python 札记

文章目录 一、简介 一、简介 Qt for Python 官网

JAVA全栈开发 集合详解(day14+day15汇总)

一、数组 数组是一个容器&#xff0c;可以存入相同类型的多个数据元素。 数组局限性&#xff1a; ​ 长度固定&#xff1a;&#xff08;添加–扩容&#xff0c; 删除-缩容&#xff09; ​ 类型是一致的 对象数组 &#xff1a; int[] arr new int[5]; … Student[] arr …

中职组网络安全-PYsystem003.img(环境+解析)

​ web安全渗透 1.通过URL访问http://靶机IP/1&#xff0c;对该页面进行渗透测试&#xff0c;将完成后返回的结果内容作为flag值提交&#xff1b; 访问该网页后发现F12被禁用&#xff0c;使用ctrlshifti查看 ctrlshifti 等效于 F12 flag{fc35fdc70d5fc69d269883a822c7a53e} …