Navicat的使用--mysql

表关系

数据库的操作,表字段的设计,一般都由于图形化界面工具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文件
在这里插入图片描述

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

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

相关文章

贷款行业极难获客,怎么获取实时客户数据?

我们能想象当客户有贷款需求时会发生什么吗&#xff1f; 客户可能会打开手机搜索“如何借款”、“哪笔贷款利息低”、“最多能借多少钱”、“贷款需要什么条件”等关键词&#xff0c;然后&#xff0c;客户点击进入第一个链接&#xff0c;然后填写他们的姓名和电话号码来测试他…

fmx windows 下 制作无边框窗口最小化最大化并鼠标可拖移窗口

1,最顶端 放一个rectangle 置顶 ,此区域后面实现鼠标拖动 移动窗口,可在上面放置最大,最小,关闭按钮 2,窗口边框模式 设置 none 3,rectangel mousemove事件 uses Winapi.Windows,Winapi.Messages,FMX.Platform.Winprocedure TfrmMain.Rectangle1MouseMove(Sender: TObje…

下拉列表框Spinner

在XML文件中的创建 <Spinnerandroid:id"id/spinner"android:layout_width"wrap_content"android:layout_height"wrap_content"/> 在Java文件中的设置 //获取Spinner对象 Spinner spinnerfindViewById(R.id.spinner); //创建数组…

经典OJ题:随机链表的复制

目录 题目&#xff1a; 本题的解图关键在于画图与看图&#xff01; 思路分析&#xff1a; 方法一&#xff1a;暴力求解法。 方法二&#xff1a;插入法 方法解析&#xff1a; 步骤一、插入 步骤二、 处理每一个copy的randdom指针⭐————重点 步骤三、拆卸节点 代码…

剑指offer全集系列Java版本(2)

目录 反转链表 替换空格 二叉树 链表的中间结点 附录 StringBuffer类中常用的方法 反转链表 反转链表_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId265&tqId39226&rp1&ru/exam/oj/ta&qru…

思谋科技进博首秀:工业多模态大模型IndustryGPT V1.0正式发布

大模型技术正在引领新一轮工业革命&#xff0c;但将其应用于工业制造&#xff0c;仍面临许多挑战&#xff0c;专业知识的缺乏是关键难点。11月5日&#xff0c;香港中文大学终身教授、思谋科技创始人兼董事长贾佳亚受邀参加第六届中国国际进口博览会暨虹桥国际经济论坛开幕式。虹…

SAP 使用函数创建多个备选BOM ( 改造标准函数 : CSAP_MAT_BOM_MAINTAIN 和 CSAP_MAT_BOM_CREATE )

参考博客1&#xff1a;https://blog.csdn.net/Buffalo_soldier/article/details/117956986 参考博客2&#xff1a;https://blog.csdn.net/u014535256/article/details/111539629 RFC CSAP_MAT_BOM_MAINTAIN 改造 SAP标准函数CSAP_MAT_BOM_MAINTAIN可以增删改BOM&#xff0c;但是…

Android JVM内存模型——老生常谈

jvm简介 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 jvm作用 Java中的所有类&#xff0c;必须…

循环链表的设计与基本操作的实现

目录 一.循环链表的设计 二.循环链表的实现 三.循环链表的总结 一.循环链表的设计 1.循环链表的结构设计: typedef struct CNode{int data;struct CNode* next;}CNode ,*CList; 2.循环链表的示意图: 3.循环链表和单链表的区别: 唯一区别,没有空指针,尾节点的后继为头,为循…

OpenAI开发者大会之后,当何去何从?

简介 过往总结 ​产品升级 GPT-4 Turbo Agent化 此间的未来 定制GPT GPT商店 Assistants API 总结与思考 简介 此次发布会简单总结如下。 1. 发布GPT-4 Turbo&#xff1a; 更长。支持128K上下文输入&#xff0c;标准GPT-4是8K版本&#xff0c;之前升级出了32K版本 更…

TensorFlow学习笔记--(2)张量的常用运算函数

张量的取值函数 求张量的平均值: tf.reduce.mean(%张量名%)求张量的最小值:tf.reduce_min(%张量名%)求张量的最大值:tf.reduce_max(%张量名%)求张量的和:tf.reduce_sum(%张量名%)其次,对于上述所有操作 都可在函数后添加一个新的参数 axis%维度% axis0 代表第一维度 axis1 代表…

文件加密软件怎么用(附2种解密破解工具)

有时候出差或者有些商务场合&#xff0c;需要对一些敏感文件做一下简单的加密&#xff0c;这样在分享内容的时候&#xff0c;可以起到初步的保护作用。 当然了&#xff0c;如果文件非常重要&#xff0c;涉及到一些商业机密&#xff0c;这个时候你需要使用专业的加密工具&#x…

什么是代理IP池?如何判断IP代理商的IP池是否真实优质?

代理池充当多个代理服务器的存储库&#xff0c;提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务&#xff0c;而无需担心被检测或阻止的风险。代理池为各种在线活动&#xff08;例如网页抓取、安全浏览等&#xff09;提高后勤保障。 读完…

机器学习基础之《回归与聚类算法(5)—分类的评估方法》

问题&#xff1a;上一篇的案例&#xff0c;真的患癌症的&#xff0c;能被检查出来的概率&#xff1f; 一、精确率和召回率 1、混淆矩阵 在分类任务下&#xff0c;预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合&#xff0c;构成混淆矩阵(适…

【Python自学笔记】python os.getcwd文件目录找不对

写小组项目的时候需要按照路径读入数据表&#xff0c;数据库和图片列表显示到html&#xff0c;按ChatGPT的答案写了python os.getcwd()&#xff0c;结果迁移到同组同学的电脑上总是报错。 经过一番查询&#xff0c;在CSDN上发现一个完美解决问题的好帖&#xff0c;特此存下链接…

订水商城实战教程09-跑马灯

目录 1 跑马灯效果2 创建数据源3 创建变量4 搭建组件5 数据绑定6 录入测试数据总结 上一篇我们介绍了轮播图如何开发&#xff0c;本节我们介绍一下跑马灯的效果开发。 1 跑马灯效果 通常小程序会增加一点动画的效果来让页面显得不那么死板&#xff0c;我们这里增加了一个跑马灯…

ChatGPT生产力|中科院学术ChatGPT优化配置

资源链接&#xff1a;GitHub - binary-husky/gpt_academic b站配置讲解链接&#xff1a;chatgpt-academic 新手运行官方精简指南&#xff08;科研chatgpt拓展&#xff09; 某知配置图文讲解&#xff1a;图文详解&#xff1a;在windows中部署ChatGPT学术版 - 知乎 (zhihu.com) 一…

统计一个只包含大写字母的字符串中顺序对的数量.其中顺序对的定义为前面的字符小后面的字符大.例如在“ABC“中的顺序对为3,因为有AB,AC,BC

哈希法&#xff1a;扫描字符串&#xff0c;将出现的字符次数加1&#xff0c;统计比当前字符字典序小的字母出现的次数&#xff0c;即为顺序串的个数。 int CounSq(const char* arr)//时间复杂度O&#xff08;n&#xff09; {int sig[26] { 0 };int index 0;int sum 0;for (…

微信小程序:js实现不改变原数组的情况下增加一条对象到新数组中

效果 核心 old_array.slice(0) 表示对 old_array 这个数组进行切片操作&#xff0c;从索引 0 开始&#xff08;包括索引 0&#xff09;&#xff0c;直到数组的末尾&#xff0c;old_array.slice(0) 中的 0 表示开始切片的索引位置&#xff0c;而由于没有传入第二个参数&#xff…