# Mysql

测试Mysql 然后输入密码

mysql -uroot -p

# sql语句

创建数据库

create database `name`

名字不能重复

避免这个问题

create database if not exist `name`

如果数据库不存在就创建 存在就什么也不做

添加字符集utf-8

create database `name`
	default character set = 'utf8mb4';

数据表

创建表

CREATE TABLE `user` (
   id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   name varchar(100) COMMENT '名字',
   age int COMMENT '年龄',
   address varchar(255) COMMENT '地址',
   create_time timestamp DEFAULT CURRENT_TIMESTAMP  COMMENT '创建时间'
) COMMENT '用户表'

解析

create table 表名字 (
	id字段名称 int数据类型代表数字类型 NOT NULL(不能为空) AUTO_INCREMENT(id自增)
	PRIMARY KEY(id为主键)
	name(字段名称) varchar(100)字符串类型100字符 COMMENT(注释)
	age(字段名称) int数据类型代表数字类型 COMMENT(注释)
	create_time(字段名称) timestamp(时间戳) DEFAULT CURRENT_TIMESTAMP(自动填充创建时间)
) 

修改表名

ALTER TABLE `user` RENAME `user2`;

增加列

ALTER TABLE `user` Add COLUMN `hobby` VARCHAR(200) ;

删除列

ALTER TABLE `user` DROP COLUMN `hobby`;

编辑列

ALTER TABLE `user` MODIFY COLUMN `age` VARCHAR(255) NULL COMMENT '年龄2';

# 查询

查询是使用频率最高的语句

查询单个列

SELECT `name` FROM `users`;

查询多个列 逗号隔开即可

SELECT `name`,`id` FROM `users`;

查询所有列*

SELECT * FROM `users`

排序

ORDER BY [字段名称] desc降序(从大到小)asc升序(从小到大)

SELECT * FROM `users` ORDER BY id DESC

限制查询结果

limit[开始行][限制条数]
开始行从0开始 和js数组一样
SELECT * FROM `users` LIMIT 1,3

条件查询

要把 搜索条件 放在 WHERE 子句中

完全匹配

SELECT * FROM `users` WHERE name = 'songth1ef'

多个条件联合查询

name = 'songth1ef' 同时 age <= 20

and 操作符

SELECT * FROM 'users' WHERE name = 'songth1ef' AND age <= 20

or 操作符

SELECT * FROM 'users' WHERE name = 'songth1ef' OR age <= 20

模糊查询

LIKE 操作符

`开头%`	后可以是任意
`%结束`	前可以是任意
`%中间%`	前后可以是任意
SELECT * FROM `users` WHERE name LIKE `%th1ef%`

# 增删改

新增

INSERT INTO users(`name`,`age`) VALUES(`songth1ef`,18)

插入null值

INSERT INTO users(`name`,`age`) VALUES(NULL,NULL)

插入多条数据 逗号隔开即可

INSERT INTO
    users (`name`, `age`, `create_time`)
VALUES (NULL, NULL, NULL),
    (
        'new',
        32,
        '2024-06-06 15:38:00'
    )

删除

DELETE FROM `users` WHERE id = 10

批量删除

DELETE FROM `users` WHERE id IN (5, 6, 7)

更新数据

更新的字段使用=赋值,where确定更新的条例

UPDATE `users` SET name = '233', age = 23 WHERE id = 3

# 表达式和函数

表达式 MySQL表达式是一种在MySQL数据库中使用的计算式或逻辑式。它们可用于查询、更新和过滤数据,以及进行条件判断和计算。

​ 算术表达式:可以执行基本的数学运算,例如加法、减法、乘法和除法。例如:SELECT col1 + col2 AS sum FROM table_name; ​ 字符串表达式:可以对字符串进行操作,例如连接、截取和替换。例如:SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM table_name; ​ 逻辑表达式:用于执行条件判断,返回布尔值(TRUE或FALSE)。例如:SELECT * FROM table_name WHERE age > 18 AND gender = 'Male'; ​ 条件表达式:用于根据条件返回不同的结果。例如:SELECT CASE WHEN age < 18 THEN 'Minor' ELSE 'Adult' END AS age_group FROM table_name; ​ 聚合函数表达式:用于计算数据集的聚合值,例如求和、平均值、最大值和最小值。例如:SELECT AVG(salary) AS average_salary FROM table_name; ​ 时间和日期表达式:用于处理时间和日期数据,例如提取年份、月份或计算日期差值。例如:SELECT YEAR(date_column) AS year FROM table_name;

例如查询的时候增加数值100

SELECT age + 100 as `age100` FROM `users`

函数

MySQL提供了大量的内置函数,用于在查询和操作数据时进行计算、转换和处理。以下是一些常用的MySQL函数分类及其示例:

字符串函数:

CONCAT(str1, str2, ...):将多个字符串连接起来。 SUBSTRING(str, start, length):从字符串中提取子字符串。 UPPER(str):将字符串转换为大写。 LOWER(str):将字符串转换为小写。 LENGTH(str):返回字符串的长度。 数值函数:

ABS(x):返回x的绝对值。 ROUND(x, d):将x四舍五入为d位小数。 CEILING(x):返回不小于x的最小整数。 FLOOR(x):返回不大于x的最大整数。 RAND():返回一个随机数。 日期和时间函数:

NOW():返回当前日期和时间。 CURDATE():返回当前日期。 CURTIME():返回当前时间。 DATE_FORMAT(date, format):将日期格式化为指定的格式。 DATEDIFF(date1, date2):计算两个日期之间的天数差。 条件函数:

IF(condition, value_if_true, value_if_false):根据条件返回不同的值。 CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE result END:根据条件返回不同的结果。 聚合函数:

COUNT(expr):计算满足条件的行数。 SUM(expr):计算表达式的总和。 AVG(expr):计算表达式的平均值。 MAX(expr):返回表达式的最大值。 MIN(expr):返回表达式的最小值。

获取随机数

SELECT RAND() FROM `users`

# 连表and子查询

子查询 子查询(Subquery),也被称为嵌套查询(Nested Query),是指在一个查询语句中嵌套使用另一个完整的查询语句。子查询可以被视为一个查询的结果集,它可以作为外层查询的一部分,用于进一步筛选、计算或操作数据。

子查询通常出现在主查询的WHERE子句、FROM子句、HAVING子句或SELECT子句中,以提供更复杂的查询逻辑。子查询可以根据主查询的结果动态生成结果集,用于过滤和匹配数据,或者作为函数的参数使用。

子查询可以返回单个值、一列值、一行值或者一个结果集,具体取决于子查询的语法和用法。根据子查询返回的结果类型,可以将其与主查询的其他表达式进行比较、连接或使用作为条件进行过滤。

我们之前的案例都是在一张表去查询,现实中不会把所有东西都放在一张表,会进行分表,甚至还会分库分表,读写分离等等。

关联关系为 user表的id 关联 photo表的user_id

但是我们现在需要通过名字查询出photo表的数据 但是photo表没有存名字怎么弄

子查询

我们的思路就是通过名字查询user表的id,然后通过user表的id去查询photo的user_id就完成了

SELECT *
FROM `photos`
WHERE
    `create_by_id` = (
        SELECT id
        FROM `users`
        WHERE
            name = 'songth1ef'
    )

连表

Mysql的连表分为内连接,外连接,交叉连接

对于内连接的两个表,驱动表中的记录在被驱动表中找不到匹配的记录,该记录不会加入到最后的结果集,我们上边提到的连接都是所谓的内连接。

对于外连接的两个表,驱动表中的记录即使在被驱动表中没有匹配的记录,也仍然需要加入到结果集。

交叉连接是指在两张或多张表之间没有任何连接条件的连接。简单来说,交叉连接可以让你查询所有可能的组合。

内连接

SELECT *
FROM `users`, `photos`
WHERE
    `users`.`id` = `photos`.`create_by_id`

外连接

左连接

语法规则 LEFT JOIN [连接的表] ON [连接的条件]

SELECT *
FROM `users`
    LEFT JOIN `photos` ON `users`.`id` = `photos`.`create_by_id`

users中的id即使 在photos里没有找到 也会返回 并且 photos的值补充为null

右连接

语法规则 RIGHT JOIN [连接的表] ON [连接的条件]

SELECT *
FROM `users`
    RIGHT JOIN `photos` ON `users`.`id` = `photos`.`create_by_id`

photos中的id即使 在users里没有找到 也会返回 并且 photos的值补充为null

1
1
1
1
1