学习笔记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 employeesWHERE department_id = 50
      );in/not in:可以改写为 =any / !=all
      ANY
      ALL# select后边加select
      # 查询是一条一条进行遍历的,所以在select后边的查询必须是一行一列
      SELECT d.*,(SELECT COUNT(*)FROM employees eWHERE e.department_id = d.department_id
      )FROM departments d;# from后边加select,必须给新表起别名
      SELECT ag_dep.*, jg.level
      FROM
      (SELECT AVG(salary) ag,department_idFROM employeesGROUP 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_idFROM employees e
      );SELECT d.department_name
      FROM departments d
      WHERE EXISTS(SELECT *FROM employees eWHERE e.`department_id` = d.`department_id`
      );SELECT bo.*
      FROM boys bo
      WHERE EXISTS(SELECT *FROM beauty bWHERE 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_idFROM employeesGROUP BY department_idORDER BY AVG(salary) DESCLIMIT 1
      );
      
    • 联合查询

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能_机器学习056_拉格朗日乘子法原理推导_公式由来详解_原理详解---人工智能工作笔记0096

https://blog.csdn.net/Soft_Po/article/details/118332454 这里有老师的一篇文章介绍拉格朗日乘子法的原理推导 结合老师的这篇文章我们来看一下详细的推导过程 可以看到上一节我们说,一个有条件的,函数,可以转换为一个,无条件的函数, 根据拉格朗日乘子法,可以创建出一个等…

python使用记录

1、VSCode添加多个python解释器 只需要将对应的python.exe的目录&#xff0c;添加到系统环境变量中即可&#xff0c;VSCode会自动识别及添加 2、pip 使用 pip常用命令和一些坑 查看已安装库的版本号 pip show 库名称 通过git 仓库安装第三方库 pip install git仓库地址

Linux系统常用指令

1.使用xshell登录到云服务器的Linux系统&#xff1a; ssh 用户名公网IP&#xff0c;例如&#xff1a; ssh root111.11.111. 2.添加用户 adduser 用户名&#xff0c;例如&#xff1a; adduser user 3.为用户设置密码 passwd 用户名&#xff0c;例如&#xff1a; passwd …

Cloudflare Email Routing 免费邮件发送服务

Cloudflare Email Routing 免费邮件发送(作为 Service 服务)用于 Workers/Pages 项目中。 原文链接: https://willin.wang/blog/cloudflare-send-email-service 准备工作 准备一个域名,例如 example.com。现在,在 cloudflare-dashboard 中添加一个网站并构建您的域名。这…

【JavaScript】3.4 JavaScript在现代前端开发中的应用

文章目录 1. 用户交互2. 动态内容3. 前端路由4. API 请求总结 JavaScript 是现代前端开发的核心。无论是交互效果&#xff0c;还是复杂的前端应用&#xff0c;JavaScript 都发挥着关键作用。在本章节中&#xff0c;我们将探讨 JavaScript 在现代前端开发中的应用&#xff0c;包…

uniapp小程序分包页面引入wxcomponents(vue.config.js、copy-webpack-plugin)

实例&#xff1a;小程序添加一个源生小程序插件&#xff0c;按照uniapp官方的说明&#xff0c;要放在wxcomponents。后来发现小程序超2m上传不了。 正常的编译情况 会被编译到主包下 思路&#xff1a;把wxcomponents给编译到分包sub_package下 用uniapp的vue.config.js自定义…

机器学习的复习笔记3-回归的细谈

一、回归的细分 机器学习中的回归问题是一种用于预测连续型输出变量的任务。回归问题的类型和特点如下&#xff1a; 线性回归&#xff08;Linear Regression&#xff09;&#xff1a;线性回归是回归问题中最简单的一种方法。它假设自变量与因变量之间存在线性关系&#xff0c…

高校智慧用电管理平台

高校智慧用电管理平台是一种基于物联网、云计算、大数据等技术的智能化用电管理系统&#xff0c;旨在实现高校用电的实时监测、智能控制、数据分析和管理决策。 具体来说&#xff0c;该平台通常包括以下功能和特点&#xff1a; 实时监测&#xff1a;通过安装传感器、智能终端等…

基于SpringBoot的图书推荐系统的

摘 要 网络信息技术的高速发展&#xff0c;使得高校图书馆的服务空间日益扩大&#xff0c;依据个人特点的针对性服务逐渐成为新服务模式的主导趋势。对于大多数用户而言&#xff0c;很难在大量的学术图书馆中快速找到他们想要的材料。另外&#xff0c;随着时代的不断发展&…

class-dump 混淆加固、保护与优化原理

​ 进行逆向时&#xff0c;经常需要dump可执行文件的头文件&#xff0c;用以确定类信息和方法信息&#xff0c;为hook相关方法提供更加详细的数据.class-dump的主要用于检查存储在Mach O文件的Objective-C中的运行时信息&#xff0c;为类&#xff0c;类别和协议生成声明信息&am…

做外贸价格差也有等级

最近无意中看到一句话&#xff0c;挺有感触的&#xff0c;分享给大家&#xff0c;或许我们在谈客户的时候可以用到或者是作为评判的标准来对客户进行一定的定位。 差价2%&#xff0c;可能因为服务 差价5%&#xff0c;应该因为工艺 差价10%&#xff0c;肯定是因为材料 差价2…

设计模式---第二篇

系列文章目录 文章目录 系列文章目录前言一、抽象工厂模式二、装饰器模式是什么三、代理模式和装饰器模式有什么区别前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。…