# 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