Navicat的使用--mysql

news2024/11/24 16:23:49

表关系

数据库的操作,表字段的设计,一般都由于图形化界面工具Navicat完成。
而表中数据的增删改查,需要熟悉sql语句。

一对一

一对一:一个A对应一个B,一个B对应一个A

  • 将A或B任意一张表的主键设置为外键

一对多

一对多:一个A对应多个B,一个B对应一个A。称A和B是一对多,B和A时多对一

  • 在多的一端设置外键,对应到另一张表的主键

在这里插入图片描述
添加完成:
在这里插入图片描述

多对多

多对多:一个A对应多个B,一个B对应多个A

  • 新建一张关系表,关系表至少包含两个外键,分别对应到A,B
    在这里插入图片描述

数据的增删改查

增删改

-- 1.增加数据
INSERT INTO `user` ( `name`, `age`) VALUES ('cjc', 100);
INSERT INTO `user` ( `name`, `age`) VALUES ('ccc', 999);
INSERT INTO `user` ( `name`, `age`) VALUES ('aaa', 111);

-- 2.删除数据
-- 删除所有数据
DELETE FROM `user`
DELETE FROM `user` WHERE `name` = 'aaa' 

-- 3.修改数据
UPDATE `user` SET `name` = 'CJC',`age` = 10000 WHERE `name` = 'cjc'
-- 修改数据时,手动加上时间的更新
UPDATE `user` SET `name` = 'CCC',`age` = 99999,`updateTime` = CURRENT_TIMESTAMP WHERE `name` = 'ccc'

-- 修改了数据,根据当前时间戳更新updateTime
ALTER TABLE `user` ADD `updateTime` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

单表查询

select…from…

-- 额外的一列
SELECT id, loginid, loginpwd, 'abc' as '额外的一列' from `user`;

-- 列名重命名 as
SELECT *, 'abc' as 'extra' from `employee`;

-- 将1/0映射为'男'/'女'
-- 新增一列level,值为 高/中/低 
SELECT id, `name`, 
case
when ismale = 1 then '男'
else '女'
end sex, 
case
when salary>=10000 then '高'
when salary>=5000 then '中'
else '低'
end `level`,
salary
FROM employee;

-- DISTINCT去重
select DISTINCT location from employee;

where

SELECT * FROM employee
WHERE ismale = 1;

-- companyId = 1 or companyId = 2
SELECT * FROM department
WHERE companyId in (1, 2);


-- null
SELECT * from employee
WHERE location is not null;

SELECT * from employee
WHERE location is null;


-- between...and
-- > >= < <=
SELECT * from employee
WHERE salary>=10000;

SELECT * from employee
WHERE salary BETWEEN 10000 and 12000;


-- like模糊查询
-- %任意字符0个或多个 _任意字符1个 
SELECT * from employee
WHERE `name` like '%曹%';
-- 第二个字符为c
SELECT * from employee
WHERE `name` like '_c';


-- and or
SELECT * from employee
WHERE `name` like '张%' and ismale=0 and salary>=12000;

SELECT * from employee
WHERE `name` like '张%' and (ismale=0 and salary>=12000
or
birthday>='1996-1-1');

order by

-- 按照gender升序,
-- 性别相同,则再按照salary降序
SELECT * from employee
ORDER BY gender asc, salary desc;

limit

-- 跳过1条数据后,查询前20条数据
SELECT * FROM `user` LIMIT 20 OFFSET 1
SELECT * FROM `user` LIMIT 1,20
-- 查询第3页,每页5条数据
-- 分页公式 limit (curPage-1)*pageSize, pageSize
SELECT * FROM `user` LIMIT 10,5

函数与分组

1.聚合函数

-- 数学函数
SELECT ABS(-1);
SELECT CEIL(1.4);
SELECT ROUND(3.1415926, 3);
SELECT TRUNCATE(3.1415926,3);

-- 字符串函数
SELECT CURDATE();
SELECT CURTIME();
SELECT TIMESTAMPDIFF(DAY,'2010-1-1 11:11:11','2010-1-2 11:11:12');

-- 聚合函数
SELECT count(id) as 员工数量,
	avg(salary) as 平均薪资,
	sum(salary) as 总薪资,
	min(salary) as 最小薪资
FROM employee;

2.分组group by
分组只能查询分组的列聚合列

-- 查询员工分布的居住地,以及每个居住地有多少名员工
SELECT location, count(id) as empnumber
FROM employee
GROUP BY location

-- 将居住地和性别都相同的分为一组
SELECT location, count(id) as empnumber
FROM employee
GROUP BY location,gender

多表查询

-- 1.笛卡尔积
-- a表m行记录,b表n行记录,笛卡尔积运算得m*n行记录
-- 查询出足球队的对阵表
SELECT t1.name 主场, t2.name 客场 
FROM team as t1, team as t2
WHERE t1.id != t2.id;

-- 2.左外连接
SELECT * 
from department as d 
left join employee as e
on d.id = e.deptId;

-- 3.右外连接
SELECT * 
from employee as e 
right join department as d 
on d.id = e.deptId;

-- 4.内连接
SELECT e.`name` as empname, d.`name` as dptname, c.`name` as companyname
from employee as e 
inner join department as d 
on d.id = e.deptId 
inner join company c 
on d.companyId = c.id;

sql书写顺序、执行顺序

书写顺序

SELECT 
	tagname as "tag1",
	tagname2 as "tag2",
	[聚合函数]...
	
FROM table1
[LEFT] JOIN table2
on xxx
[LEFT] JOIN table3
on xxx
WHERE 不含聚合函数的条件
GROUP BY tag1,tag2...等所有非聚合函数字段
HAVING 含聚合函数的条件

ORDER BY tag1,tag2 DESC
LIMIT [偏移量],显示的记录数;  # LIMIT 显示的记录数 OFFSET 偏移量;

执行顺序

  1. from
  2. join…on…
  3. where
  4. group by
  5. select
  6. having
  7. order by
  8. limit

sql查询语句练习

在这里插入图片描述

-- 三表连接
SELECT *
from employee e
INNER JOIN department d 
on d.id = e.deptId
INNER JOIN company c
on d.companyId = c.id
-- 1. 查询渡一每个部门的员工数量
SELECT COUNT(e.id),d.`name`
from employee e
INNER JOIN department d 
on d.id = e.deptId
INNER JOIN company c
on d.companyId = c.id
WHERE c.`name` LIKE '%渡一%'
GROUP BY d.id

-- 2. 查询每个公司的员工数量
SELECT COUNT(e.id),c.`name`
from employee e
INNER JOIN department d 
on d.id = e.deptId
INNER JOIN company c
on d.companyId = c.id
GROUP BY c.id

-- 3. 查询所有公司10年内入职的居住在万家湾的女员工数量
-- 注意:所有公司都要显示
SELECT c.id,c.`name`,res.count
from company c 
LEFT JOIN (
	SELECT c.id,c.`name`,COUNT(e.id) count
	from employee e
	INNER JOIN department d 
	on d.id = e.deptId
	INNER JOIN company c
	on d.companyId = c.id
	WHERE TIMESTAMPDIFF(YEAR,e.joinDate,CURDATE())<=10 AND e.location LIKE '%万家湾%'
	GROUP BY c.id
) as res
on c.id = res.id

-- 4. 查询渡一所有员工分布在哪些居住地,每个居住地的数量
SELECT e.location,COUNT(e.id)
from employee e
INNER JOIN department d 
on d.id = e.deptId
INNER JOIN company c
on d.companyId = c.id
WHERE c.`name` LIKE '%渡一%'
GROUP BY e.location

-- 5. 查询员工人数大于200的公司信息
SELECT *
from company c
WHERE c.id = (
	-- 查找到符合条件的公司id
	SELECT c.id
	from employee e
	INNER JOIN department d 
	on d.id = e.deptId
	INNER JOIN company c
	on d.companyId = c.id
	GROUP BY c.id
	HAVING count(e.id)>200
)


-- 6. 查询渡一公司里比它平均工资高的员工
SELECT e.*
from employee e
INNER JOIN department d 
on d.id = e.deptId
INNER JOIN company c
on c.id = d.companyId
WHERE c.`name` LIKE '%渡一%' AND e.salary > (
  -- 渡一的平均薪资
	SELECT AVG(e.salary)
	from employee e
	INNER JOIN department d 
	on d.id = e.deptId
	INNER JOIN company c
	on d.companyId = c.id
	WHERE c.`name` LIKE '%渡一%'
)


-- 7. 查询渡一所有名字为两个字和三个字的员工对应人数
SELECT CHARACTER_LENGTH(e.`name`) nameLen, COUNT(e.id)
from employee e
INNER JOIN department d 
on d.id = e.deptId
INNER JOIN company c
on c.id = d.companyId
WHERE c.`name` LIKE '%渡一%' 
GROUP BY CHARACTER_LENGTH(e.`name`)
HAVING nameLen in (2,3)

-- 8. 查询每个公司每个月的总支出薪水,并按照从低到高排序
SELECT c.`name`,sum(e.salary) totalSalary
from employee e
INNER JOIN department d 
on d.id = e.deptId
INNER JOIN company c
on d.companyId = c.id
GROUP BY c.id 
ORDER BY totalSalary desc

视图

我们可以把重复使用的查询封装成视图
在这里插入图片描述

mysql驱动程序

mysql驱动程序:连接mysql的数据和内存中的数据
常用mysql驱动程序:mysql,mysql2

const mysql = require('mysql2')

// 1.创建连接池
const connectionPool = mysql.createPool({
  host: 'localhost',
  port: 13306,
  user: 'root',
  password: 'root',
  database: 'koa-apis',
  connectionLimit: 5
})

// 2.测试是否连接成功
connectionPool.getConnection((err, connection) => {
  if (err) {
    console.log('数据库连接失败', err);
    return
  }

  connection.connect(err => {
    if (err) {
      console.log('和数据库交互失败', err);
    } else {
      console.log('和数据库交互成功');
    }
  })
})

// 3.定义预处理语句
// 防止sql注入
const statement = 'SELECT * FROM `student` WHERE id > ? AND name LIKE ?'

// 4.执行sql语句
// 使用promise语法
const connection = connectionPool.promise()
connection.execute(statement, [2, '%c%']).then(res => {
  const [val, fields] = res
  console.log(val);
}).catch(err => {
  console.log(err);
})

ORM

ORM(Object Relational Mapping)对象关系映射

  • 将程序中的对象和数据库关联
  • 使用统一的接口,完成对不用数据库的操作

node中常用ORM框架

  • Sequelize
  • TypeORM

连接到数据库

const { Sequelize } = require('sequelize');

const sequelize = new Sequelize('school', 'root', 'root', {
  host: 'localhost',
  dialect: 'mysql',
  port: '13306',
  logging: false // 关闭打印日志
});

// 测试连通性
(async function () {
  try {
    await sequelize.authenticate();
    console.log('Connection has been established successfully.');
  } catch (error) {
    console.error('Unable to connect to the database:', error);
  }
})();

module.exports = sequelize

模型定义和同步

const sequelize = require('./db');
const { DataTypes } = require('sequelize');

const Admin = sequelize.define('Admin', {
  // 在这里定义模型属性
  loginId: {
    type: DataTypes.STRING,
    allowNull: false
  },
  loginPwd: {
    type: DataTypes.STRING,
    allowNull: false
  },
  name: {
    type: DataTypes.STRING,
    allowNull: false
  }
}, {
  createdAt: true,
  updatedAt: true,
  paranoid: true, // 记录删除的时间,不会真正删除数据
  freezeTableName: false // 表名是否添加复数
});


(async function () {
  await Admin.sync({ alter: true })
  console.log('Admin 同步完成');
})();

module.exports = Admin

表关系(外键)

1.一对一
A.hasOne(B) 关联意味着 A 和 B 之间存在一对一的关系,外键在目标模型(B)中定义.
A.belongsTo(B)关联意味着 A 和 B 之间存在一对一的关系,外键在源模型中定义(A).

2.一对多
A.hasMany(B) 关联意味着 A 和 B 之间存在一对多关系,外键在目标模型(B)中定义.

3.多对多
A.belongsToMany(B, { through: ‘C’ }) 关联意味着将表 C 用作联结表,在 A 和 B 之间存在多对多关系. 具有外键(例如,aId 和 bId)

三层架构

在这里插入图片描述

增删改查

bookService.js

const Book = require("../models/Book");

// 1.增
exports.addBook = async function (obj) {
  // 业务逻辑判断
  // ...
  const ins = await Book.create(obj);
  return ins.toJSON();
};

// 2.删
exports.deleteBook = async function (id) {
  const result = await Book.destroy({
    where: {
      id,
    },
  });
  return result;
};

// 3.改
exports.updateBook = async function (id, obj) {
  const result = await Book.update(obj, {
    where: {
      id,
    },
  });
  return result;
};

数据的导入导出

通过后缀名为.sql的文件,导入导出数据

导入sql文件
在这里插入图片描述

导出sql文件
在这里插入图片描述

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

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

相关文章

高性能网络编程 - The C10M problem

文章目录 Pre概述回顾C10K实现C10M的挑战思路总结 Pre 高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路 概述 在接下来的10年里&#xff0c;因为IPv6协议下每个服务器的潜在连接数都是数以百万级的&#xff0c;单机服务器处理数百万的并发连接&#xff0…

SpringDataJpa(一)

一、JPA概述 1.1 ORM概述 ORM&#xff08;Object-Relational Mapping&#xff09; 表示对象关系映射。在面向对象的软件开发中&#xff0c;通过ORM&#xff0c;就可以把对象映射到关系型数据库中。只要有一套程序能够做到建立对象与数据库的关联&#xff0c;操作对象就可以直…

【自然语言处理】利用python创建简单的聊天系统

一&#xff0c;实现原理 代码设计了一个简单的客户端-服务器聊天应用程序&#xff0c;建立了两个脚本文件&#xff08;.py文件)&#xff0c;其中有一个客户端和一个服务器端。客户端和服务器之间通过网络连接进行通信&#xff0c;客户端发送消息&#xff0c;服务器端接收消息并…

工业相机基本知识理解:帧率、带宽(数据接口)、图像数据格式

1、帧率&#xff1a;Frame Per Second&#xff0c;单位fps&#xff0c;每秒采集的图像数量 2、带宽&#xff1a;一般单位用Gbps&#xff0c;每秒能传输的Gbit数据量 Gige&#xff1a;千兆网&#xff0c;带宽1Gbps USB3.0&#xff1a;带宽5Gbps&#xff0c;一般U3V工业相机用到3…

Redis笔记 Redis主从同步

文章目录 Redis主从搭建主从架构主从数据同步原理全量同步增量同步repl_backlog原理 主从同步优化小结 Redis主从 搭建主从架构 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 主从数据…

10 # 手写 every 方法

every 使用 every() 方法测试一个数组内的所有元素是否都能通过指定函数的测试。它返回一个布尔值。 ele&#xff1a;表示数组中的每一个元素index&#xff1a;表示数据中元素的索引array&#xff1a;表示数组 <script>var arr [1, 3, 5, 7, 8];var result arr.ever…

网络通信——与Socket交换数据(三十一)

1. 与Socket交换数据 1.1 知识点 &#xff08;1&#xff09;通过Android与Socket完成基本的Echo程序实现&#xff1b; &#xff08;2&#xff09;通过对象序列化进行大数据的传输&#xff1b; 1.2 具体内容 对于网络的开发而言&#xff0c;最常使用的交互模式&#xff1a;W…

ZZ308 物联网应用与服务赛题第F套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;F卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用…

【MySQL篇】数据库角色

前言 数据库角色是被命名的一组与数据库操作相关的权限&#xff0c;角色是权限的集合。因此&#xff0c;可以为一组具有相同权限的用户创建一个角色&#xff0c;使用角色来管理数据库权限可以简化授权的过程。 CREATE ROLE&#xff1a;创建一个角色 GRANT&#xff1a;给角色授…

个人前端编程技巧总结

目录 1. 让界面位于当前屏幕的中心&#xff08;屏幕中心&#xff09;css代码示例 2. 界面透明但是内部元素不透明&#xff08;毛玻璃&#xff09;css代码示例 3. 将当前界面的参数传递到跳转的目标页面&#xff08;携参跳转&#xff09;js代码 1. 让界面位于当前屏幕的中心&…

cmake 之add_definitions使用误区

需求 需要实现&#xff0c;在cmake中定义宏定义&#xff0c;可以&#xff1a;1&#xff09; 在code中可以使用&#xff1b;2&#xff09; 在cmake中可以识别是否已定义 问题 宏定义&#xff0c;cmake有add_definitions函数&#xff0c;直观的实现方法如下。 cmake_minimum…

java--实体javaBean

1.什么是实体类 1.就是一种特殊形式的类 2.这个类中的成员变量都要私有&#xff0c;并且要对外提供相应的getXXX&#xff0c;setXXX方法 3.类中必须要有一个公共的无参的构造器 2.实体类有啥应用场景 实体类只负责数据存取&#xff0c;而对数据的处理交给其他类来完成&…

【数据结构】线性表的链式存储结构

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 顺序存储结构的不足的解决办法 从上一节我们对顺序表的讨论中可见,线性表的顺序存储结构的特点是: 逻辑关系上相邻的两个元素在物理位置(内存)上也相邻,因此可以随机存取表中…

妙手ERP功能更新:Shopee认领配置中的主货号支持按后缀自动递增、Ozon采集箱支持批量编辑【颜色样本图】、TikTok Shop......

为了给卖家朋友带来更好的使用体验&#xff0c;更高效地运营跨境店铺&#xff0c;妙手ERP在上周优化了以下多项功能。 01、产品模块优化 全平台 - 系统新增密码错误被锁提示 Shopee - 认领配置中的主货号&#xff08;父SKU&#xff09;支持按后缀自动递增 - 发布配置中的【定…

通过SOLIDWORKS Composer让自定义视图更智能

SOLIDWORKS Composer是一款专业的技术文档创建工具&#xff0c;通过SOLIDWORKS Composer可以快速创建所需的技术文档&#xff0c;无论是用于装配说明&#xff0c;维护手册还是销售展示。 当使用SOLIDWORKS Composer创建交互式内容的时候&#xff0c;自定义视图至关重要。自定义…

DAY47 198.打家劫舍 + 213.打家劫舍II + 337.打家劫舍 III

198.打家劫舍 题目要求&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警…

前端-选中DOM定位源代码

用到的工具&#xff1a;react-dev-inspector 使用流程 根据react-dev-inspector文档进行配置 安装 yarn add --dev react-dev-inspector配置&#xff1a;在根目录下配置Inspector import { createRoot } from react-dom/client import { Inspector } from react-dev-inspe…

Spring中的循环依赖解决方案

前言&#xff1a;测试环境突发BeanCurrentlyInCreationException&#xff0c;导致后端服务启动失败&#xff0c;一看就是Spring的Bean管理中循环依赖。项目中存在Bean的循环依赖&#xff0c;是代码质量低下的表现。多数人寄希望于框架层来给擦屁股&#xff0c;造成了整个代码的…

[工业自动化-6]:西门子S7-15xxx编程 - PLC系统硬件组成与架构

目录 一、PLC系统组成 1.1 PLC 单机系统组成 1.2 PLC 分布式系统 二、PLC各个组件 2.1 PLC上位机 2.2 PLC主站&#xff1a;PLC CPU控制中心 &#xff08;1&#xff09;主要功能 &#xff08;2&#xff09;主站组成 2.3 PLC分布式从站: IO模块的拉远 &#xff08;1&am…

Pytorch R-CNN目标检测-汽车car

概述 目标检测(Object Detection)就是一种基于目标几何和统计特征的图像分割,它将目标的分割和识别合二为一,通俗点说就是给定一张图片要精确的定位到物体所在位置,并完成对物体类别的识别。其准确性和实时性是整个系统的一项重要能力。 R-CNN的全称是Region-CNN(区域卷积神经…