MySQL

1. 安装

  1. 官网下载
  2. 系统自带包管理工具安装:brew install mysql
  3. Docker安装:docker pull mysql

linux:yum/rpm安装后,mysql默认有密码,需要修改密码。记得关闭防火墙。

mysql shell:官网下载

以“\”开头

默认的是js语言,以\sql即可改为sql语言,操作数据库

2. 数据库管理系统

分为关系型和非关系型。

2.1 关系型数据库

采用关系模型组织数据,借助集合、代数等数学概念和方法处理数据,通过二维表来表示数据之间的联系。

表的每一列代表一个字段,不同表之间通过关联字段来建立联系,

ex. MySQL、Oracle、PostgreSQL

2.2 非关系型数据库

数据量大,复杂

ex. Redis、mongoDB、neo4j

3. MySql

关键字大写,其他小写。

image-20240718194519404

常见命令:

# add all and as asc between by desc distance distinct from group if in join like limit left not null on or outer order select set to where

3.1 Sql数据库命令

windows中表名不区分大小写,但是linux中是区分的。

★运行某一句命令应选中再运行

show databases;   //展示数据库
drop database xxx; //删除数据库
CREATE DATABASE 数据库名; //创建数据库
USE database_name; //选择(指定)数据库

3.2 Sql数据表命令

create table xxx;	//创建表
DROP TABLE xxx; //删除表

对列和行的命令:

desc xxx; 	//描述表结构,字段、列
ALTER tabler xxx MODIFY name VARCHAR(200); //修改列,列的名字和数据类型
ALTER tabler xxx RENAME name to xxx; //修改某一列的名字
ALTER tabler xxx ADD COLUMN xxx DATETIME; //添加字段
ALTER tabler xxx DROP COLUMN xxx; //删除某一字段

创建表并设置字段:

CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
);
// 实例
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
birthdate DATE,
is_active BOOLEAN DEFAULT TRUE
);

3.3 数据的增删查改

查询数据

SELECT * from xxx;	//查询, “*” 代表所有的列
SELECT column1, column2, ...
FROM table_name
[WHERE condition] //是一个可选的子句,用于指定过滤条件,只返回符合条件的行。
[ORDER BY column_name [ASC | DESC]] //用于指定结果集的排序顺序,默认是升序(ASC)。
[LIMIT number]; //用于限制返回的行数。

-- 选择所有列的所有行
SELECT * FROM users;
-- 选择特定列的所有行
SELECT username, email FROM users;
-- 添加 WHERE 子句,选择满足条件的行
SELECT * FROM users WHERE is_active = TRUE;
-- 添加 ORDER BY 子句,按照某列的升序排序
SELECT * FROM users ORDER BY birthdate;
-- 添加 ORDER BY 子句,按照某列的降序排序
SELECT * FROM users ORDER BY birthdate DESC;
-- 添加 LIMIT 子句,限制返回的行数
SELECT * FROM users LIMIT 10;

-- 使用 AND 运算符和通配符
SELECT * FROM users WHERE username LIKE 'j%' AND is_active = TRUE;
-- 使用 OR 运算符
SELECT * FROM users WHERE is_active = TRUE OR birthdate < '1990-01-01';
-- 使用 IN 子句
SELECT * FROM users WHERE birthdate IN ('1990-01-01', '1992-03-15', '1993-05-03');

插入数据

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
//ex
INSERT INTO users (username, email, birthdate, is_active)
VALUES ('test', 'test@runoob.com', '1990-01-01', true);

如果你要插入所有列的数据,可以省略列名。如果你要插入多行数据,可以在 VALUES 子句中指定多组数值。


更新数据

//	语法
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition; //用于指定更新的行。如果省略 WHERE 子句,将更新表中的所有行。
//	更新使用子查询的值
UPDATE customers
SET total_purchases = (
SELECT SUM(amount)
FROM orders
WHERE orders.customer_id = customers.customer_id
)
WHERE customer_type = 'Premium';

以上 SQL 语句通过子查询计算每个 ‘Premium’ 类型客户的总购买金额,并将该值更新到 total_purchases 列中。


删除数据

//	语法
DELETE FROM table_name
WHERE condition; //是一个可选的子句,用于指定删除的行。
//	删除符合条件的行
DELETE FROM students
WHERE graduation_year = 2021;
//	使用子查询删除符合条件的行
DELETE FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
WHERE order_date < '2023-01-01'
);

3.4 约束

建表时指定一个默认值,NULL或NOT NULL来指定是否允许这个字段为空。或者UNIQUE指定字段唯一。
主键约束:保证数据的唯一性、不为空,且每个表只能有一个主键。

外键约束:数据的一致性,一个表的外键必须是另一个表的主键。

3.5 导入导出

i. mysql控制台导出sql

mysqldump -u root -p 数据库名称 > xxx.sql

ii. 导出

mysqldump -u root -p 数据库名称 < xxx.sql

4.常用语句

4.1 where子句

//	模糊匹配
SELECT * FROM customers WHERE first_name LIKE 'J%';
//	 IN 条件
SELECT * FROM countries WHERE country_code IN ('US', 'CA', 'MX');
// 也可以NOT···IN···
SELECT * FROM countries WHERE country_code NOT IN ('US', 'CA', 'MX');
//	NOT 条件
SELECT * FROM products WHERE NOT category = 'Clothing';
//	BETWEEN 条件
SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
//	 IS NULL 条件
SELECT * FROM employees WHERE department IS NULL;
// IS NOT NULL 条件
SELECT * FROM customers WHERE email IS NOT NULL;

4.2 LIKE子句

LIKE 子句中使用百分号 **%**字符来表示任意字符。

如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

//	语法
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;
//	1. 百分号通配符 %:
// % 通配符表示零个或多个字符。例如,'a%' 匹配以字母 'a' 开头的任何字符串。

SELECT * FROM customers WHERE last_name LIKE 'S%';
// 选择所有姓氏以 'S' 开头的客户。
//	2. 下划线通配符 _:
// _ 通配符表示一个字符。例如,'_r%' 匹配第二个字母为 'r' 的任何字符串。

SELECT * FROM products WHERE product_name LIKE '_a%';
// 选择产品名称的第二个字符为 'a' 的所有产品。
//	3. 组合使用 % 和 _:

SELECT * FROM users WHERE username LIKE 'a%o_';
// 匹配以字母 'a' 开头,然后是零个或多个字符,接着是 'o',最后是一个任意字符的字符串,如 'aaron'、'apol'。
//	4. 不区分大小写的匹配:

SELECT * FROM employees WHERE last_name LIKE 'smi%' COLLATE utf8mb4_general_ci;
// 选择姓氏以 'smi' 开头的所有员工,不区分大小写。

4.3 UNION 操作符

//	语法
SELECT column1, column2, ...
FROM table1
WHERE condition1
UNION
SELECT column1, column2, ...
FROM table2
WHERE condition2
[ORDER BY column1, column2, ...];
1. 基本的 UNION 操作:

SELECT city FROM customers
UNION
SELECT city FROM suppliers
ORDER BY city;
// 选择客户表和供应商表中所有城市的唯一值,并按城市名称升序排序。

4.4 ORDER BY(排序)

//	语法
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
//	使用 NULLS FIRST 或 NULLS LAST 处理 NULL 值

SELECT product_name, price
FROM products
ORDER BY price DESC NULLS LAST;
// 选择产品表 products 中的产品名称和价格,并按价格降序 DESC 排序,将 NULL 值排在最后。
//	使用表达式排序

SELECT product_name, price * discount_rate AS discounted_price
FROM products
ORDER BY discounted_price DESC;
// 选择产品表 products 中的产品名称和根据折扣率计算的折扣后价格,并按折扣后价格降序 DESC 排序。
//  使用数字表示列的位置:

SELECT first_name, last_name, salary
FROM employees
ORDER BY 3 DESC, 1 ASC;
// 选择员工表 employees 中的名字和工资列,并按第三列(salary)降序 DESC 排序,然后按第一列(first_name)升序 ASC 排序。

4.5 GROUP BY 语句

GROUP BY 语句根据一个或多个列对结果集进行分组。

在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

GROUP BY 语句是 SQL 查询中用于汇总和分析数据的重要工具,尤其在处理大量数据时,它能够提供有用的汇总信息。

//	语法
SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1;

4.6 MySql连接

使用 MySQL 的 JOIN 在两个或多个表中查询数据。

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
//	语法
SELECT column1, column2, ...
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;

3. 索引

索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。


5. Windosw操作mysql

5.1 启动mysql监视器

打开cmd,输入

mysql -u 用户名 -p密码
示例:
mysql -u root -p123456
// 注意只有 -p和密码 之间不需要空格,其他地方需要一个空格

接下来就进入了mysql监视器,提示 Welcome to the MySQL monitor. Commands end with ;

便可以使用数据库命令来操作数据库。

输入status,可以查看有关mysql的一些设置情况。

修改用户密码:

// 以下在8.0中已废除PASSWORD()
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1234');
// 8.0以上的修改方法
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

创建用户:

CREATE USER 新用户名 IDENTIFIED BY '密码';

设置用户权限:

GRANT 赋予的权限 ON 数据库名.表名 TO 用户名;
// 赋予的权限有all、select、update、所有数据库的所有表:*.*

删除用户名:

DROP USER 用户名;

备注:“用户名”需要按照 “用户名@主机名” 的方式书写。

数据的编码方式:

命令提示符端使用字符编码GBK进行数据输入和输出,而数据库则使用UTF-8存储数据。即向数据库存储时(GBK$\to$UTF-8),从数据库读取数据显示在客户端时(UTF-8$\to$GBK)。

image-20240920134039516

若想将GBK设置为UTF-8,使用命令chcp 65001。65001代表UTF-8。

5.2 数据类型和数据输入

向数值类型的列中输入文字,不会发生错误,默认输入的是“0”.