MySQL学习笔记(基础篇)
1. DATABASE 数据库
# 创建数据库
CREATE DATABASE `fish`DEFAULT CHARACTER SET = 'utf8mb4';# 查询数据库列表
SHOW DATABASES;# 选择数据库
USE fish;# 删除数据库
DROP DATABASE fish;
2. TABLE 数据表
2.1 操作语句
# 创建一张 user表
CREATE TABLE `user` (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',name VARCHAR(50) COMMENT '用户名',age INT COMMENT '年龄',address VARCHAR(100) COMMENT '地址',create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- TIMESTAMP 时间戳类型update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '用户表';# 查询所有数据表
SHOW TABLES;# 修改表名
ALTER `fish` RENAME `cat`;# 添加一列
ALTER TABLE `user` ADD COLUMN `hobby` VARCHAR(50) COMMENT '爱好' AFTER `age`;# 删除一列或多列
ALTER TABLE `user` DROP `hobby`, DROP `address`;# 编辑列类型
ALTER TABLE `user` MODIFY `age` INT(3) COMMENT '年龄', MODIFY `hobby` VARCHAR(50) COMMENT '爱好';# 修改列名
ALTER TABLE `user` CHANGE COLUMN `username1` `username` VARCHAR(50) COMMENT '用户名';
2.2 查询语句
# 查询结果别名展示
SELECT * FROM `user`;
SELECT id as user_id FROM `user`;# 按照年龄降序查询用户表前5条数据
SELECT * FROM `user` ORDER BY age DESC LIMIT 0, 5;
-- ASC升序(默认) DESC降序
-- LIMIT 限制查询 {开始(从0开始)},{数量} 从第一条开始往后查询5条数据# 条件联合查询 WHERE AND与 OR或
SELECT * FROM `user` WHERE username IN ('小表姐', '小表妹') AND age BETWEEN 20 AND 30;
-- IN () 包括括号中的值
-- [NOT] BETWEEN {20} AND {30} [不]在二者之间# 模糊查询 LIKE
SELECT * FROM `user` WHERE username LIKE '%小__';
-- %匹配任意个 _匹配一个
2.3 增删改语句
# 插入一条数据 INSERT INTO
INSERT INTO `user`(name,age,address) VALUES('鱼钓猫',24,'上海市');
INSERT INTO user(`username`, `age`, `hobby`, `address`) VALUES('小表姐', 24, '鸟语花香', '杭州市');
# 更新一条数据 UPDATE SET
UPDATE `user` SET username = '小表妹', age = 12 WHERE id = 6;
# 删除一条或多条数据 DELETE FROM
DELETE FROM `user` WHERE id IN (7, 8);
2.4 表达式 + 函数
SELECT CONCAT(`username`, '啊') AS username,
IF(`sex` = 1, '男', '女') as sex,
age + 1 AS age,
LEFT(`address`, 2) AS address,
ROUND(RAND(), 6) AS random_num
-- ROUND(AVG(age), 2) AS avg_age
FROM `user`;# 查询总条数
SELECT COUNT(*) AS total FROM `user`;
RAND()
:生成一个随机小数,[0, 1)CONCAT({字段}, 'str')
:字符串合并LEFT / RIGHT(2)
:左 / 右截取ROUND({字段}[, 2])
:四舍五入,[合并位数]SUM({字段})
:求和AVG({字段})
:求平均数MAX / MIN({字段})
:最大 / 最小值COUNT(*)
:总条数NOW()
:返回当前日期DATE_ADD / DATE_SUB(NOW(), INTERVAL 1 DAY)
:明天 / 昨天的时间IF({条件表达式}, {真值}, {假值})
:判断语句
2.5 子查询 IN([SQL查询语句])
# 查询用户表中所有语文成绩90分及以上的人员信息
SELECT * FROM `user` WHERE id IN (SELECT user_id FROM `source` WHERE Chinese >= 90);
2.6 连接查询
- 内连接:连接后的数据表中会包含两张表中所有的列,条数取决于关联表中较少的条数,可能会造成数据缺失。
SELECT * FROM `user`, `source` WHERE `user`.id = `source`.user_id;
-- 连接后的数据表中会包含两张表中所有的列,条数取决于关联表中较少的条数,可能会造成数据缺失。
SELECT * FROM `user` AS u INNER JOIN `source` AS s ON u.id = s.user_id;
- 外连接
- 左连接
LEFT JOIN ON
SELECT * FROM `user` AS u LEFT JOIN `source` AS s ON u.id = s.user_id;
-- user作为驱动表,source作为从表,user表中所有的记录都会被查询出来,source表中没有的记录会用NULL填充。
- 右连接
RIGHT JOIN ON
SELECT * FROM `user` AS u RIGHT JOIN `source` AS s ON u.id = s.user_id;
-- source作为驱动表,user作为从表,source表中所有的记录都会被查询出来,user表中没有的记录会用NULL填充。
3. 数据库链接
npm i mysql2 js-yaml
db.config.yaml
db:user: rootpassword: roothost: localhostport: 3306database: test
idnex.js
import fs from "fs";
import jsyaml from "js-yaml";
import mysql2 from "mysql2/promise";const yaml = fs.readFileSync("./db.config.yaml", "utf-8");
const config = jsyaml.load(yaml); // 获取配置对象
// console.log('config', config);const sql = await mysql2.createConnection(config.db);const [data] = await sql.query("SELECT * FROM user");