mysql快速学习
MySQL
简介
MySQL是关系型数据库(即通过外键关联来建立表与表的连接)
补充一下非关系数据库
NoSQL:非关系型数据库,常见的有Redis、mongoDB、CouchDB、cassandra等等
特点:
- 免费 , 开源数据库
- 小巧 , 功能齐全
- 使用便捷
- 可运行于Windows或Linux操作系统
- 可适用于中小型甚至大型网站应用
软件下载(压缩版)
mysql5.7 64位下载地址:
DBMS
DBMS:数据库管理系统
数据库管理软件 , 科学组织和存储数据 , 高效地获取和维护数据
MySQL就是一个DBMS
使用Navicat可视化工具
使用SQLyog管理工具自己完成以下操作 :
- 连接本地MySQL数据库
- 新建MySchool数据库
-
- 字段
-
- GradeID : int(11) , Primary Key (pk)
- GradeName : varchar(50)
- 数据库名称school
- 新建数据库表(grade)
开始学习
结构化查询语句分类
名称 | 解释 | 命令 |
---|---|---|
DDL(数据定义语言) | 定义和管理数据对象,如数据库,数据表等 | CREATE、DROP、ALTER |
DML(数据操作语言) | 用于操作数据库对象中所包含的数据 | INSERT、UPDATE、DELETE |
DQL(数据查询语言) | ⽤来查询数据库表中的记录/数据 | SELECT、WHERE |
DCL(数据控制语言) | ⽤来定义数据库的访问权限和安全级别 | GRANT、REVOKE |
TCL(事务控制语言) | ⽤来管理事务 | COMMIT、ROLLBACK |
MySQL的数据类型
- 大概分为三类:数值、日期/时间、字符串(字符)
- char、varchar一定要指定长度
- float会自动提升为double
- timestamp是时间的混合类型,理论上可以存储时间格式和时间戳
//数值类型
类型 | 说明 | 取值范围 | 存储需求 |
---|---|---|---|
tinyint | 非常小的数据 | 有符值:-2^7 ~ 27-1 无符号值:0 ~ 28-1 |
1 字节 |
smallint | 较小的数据 | 有符值:-2~2 - 1 无符号值:0 ~ 216-1 |
2 字节 |
mediumint | 中等大小的数据 | 有符值:-223 ~ 223-1 无符号值:0 ~ 224-1 |
3 字节 |
int | 标准整数 | 有符值:-231 ~ 231-1 无符号值:0 ~ 232-1 |
4 字节 |
bigint | 较大的整数 | 有符值:-263 ~ 263-1 无符号值:0 ~ 264-1 |
8 字节 |
float | 单精度浮点数 | 士1.1754351e-38 | 4 字节 |
double | 双精度浮点数 | +2.2250738585072014e -308 | 8 字节 |
decimal | 字符串形式的浮点数 | decimal(m,d) | 9 字节 |
//字符串类型
类型 | 说明 | 最大长度 |
---|---|---|
char[(M)] | 固定长字符串,检索快但费空间, 0 <= M <= 255 |
M 字符 |
varchar[(M)] | 可变字符串 0 <= M <= 65535 |
变 长度 |
tinytext | 微型文本串 | 28-1 字节 |
text | 文本串 | 216-1 字节 |
//日期和时间型数值类型
类型 | 说明 | 取值范围 |
---|---|---|
DATE | YYYY-MM-DD,日期格式 | 1000-01-01 ~ 9999-12-31 |
TIME | Hh:mm:ss,时间格式 | -838:59:59 ~ 838:59:59 |
DATETIME | YY-MM-DD hh:mm:ss | 1000-01-01 00:00:00至 9999-12-31 23:59:59 |
TIMESTAMP | YYYYMMDDhhmmss格式表示的时间戳 | 197010101000000 ~ 2037年的某个时刻 |
YEAR | YYYY格式的年份值 | 1901 ~ 2155 |
数据库相关
数据库操作
-- 语法:
SHOW datebases;-- 查看数据库
use 数据库名;-- 使用数据库
mysqldump -u root -p 数据库名 [表名] >数据库名.sql -- 表示将数据库名.sql 导入到数据库名中
mysql -u root -p 数据库名 < 数据库名.sql -- 导入数据
创建数据库
CREATE DATABASE IF NOT EXISTS game -- 指定数据库名为game DEFAULT CHARACTER SET utf8mb4 -- 指定数据库字符集为utf8mb4 MySQL8.0后默认 COLLATE utf8mb4_0900_ai_ci; -- 指定排序规则 MySQL8.0后默认 - uft8mb4 表示使用UTF-8编码,每个字符最多占4个 Byte. - 0900 是UNICODE 校对算法版本 - ai 表示口音不敏感 - ci 表示不区分大小写
(以上等价为)
create databese 数据库名;
删除数据库
DROP DATEBASE 数据库名;
表相关
表操作
-- 语法:
DESC 表名;-- 查询表结构
创建表
CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] -- [库名]表名 ( 表的结构定义 )[ 表选项]
CREATE TABLE player (
id int DEFAULT NULL
name varchar(45) DEFAULT NULL
level int DEFAULT NULL
exp int DEFAULT NULL
gold decimal(10,2) DEFAULT NULL
)ENGINE=InnODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4 0900_ai ci;
CREATE TABLE 表名(
字段1,
字段2,
.......,
字段n;
)
数据类型汇总
数值类型:
整型类型: INTEGER/INT, SMALLINT, TINYINT MEDIUMINT. BIGINT
定点类型: DECIMAL.NUMERIC
浮点类型: FLOAT, DOUBLE
日期类型:
DATE, DATETIME, TIMESTAMP ,TIME,YEAR
字符串类型:
CHAR, VARCHAR,BINARY, VARBINARY, BLOB,TEXT, ENUMSET
修改表
ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型; -- MODIFY COLUMN表示修改列
ALTER TABLE 表名 RENAME COLUMN 旧列名 to 新列名 -- RENAME COLUMN表示修改列名
ALTER TABLE 表名 ADD COLUMN 列名 数据类型;-- ADD COLUMN表示添加列
ALTER TABLE 表名 DROP COLUMN 列名; -- DROP COLUMN表示删除列
删除表
DROP TABLE 表名;
清空表
TRUNCATE TABLE player;
SQL基础
基本语法
USE 数据库名;
SELECT * -- 这里写需要返回的查询结果 *是全返回
FROM 表名 -- 查询什么表(可以是多个,中间逗号隔开)
WHERE 条件 -- 查询条件
ORDER BY 排序要求 -- DESC是降序,ASC是升序(默认升序)
LIMIT 限制要求; -- 限制要求,limit 3; 表示只记录三条数据;
-- limit 6,3(表示从第7行开始记录三条数据)
通常LIMIT用来处理分页:
select * from table limit (start-1)*pageSize,pageSize;
其中start是页码,pageSize是每页显示的条数
== MySQL不区分大小写,但是按照规范来说关键字大写,表名等小写以方便可读性 ==
每个SQL语句需要以分号;结尾。
-- 两个中横线表示注释
MySQL-Shell
常⽤命令:
mysqlsh # **登录**
\> \connect root@localhost. # **连接服务**
\> \js or \py or \sql # **切换语⾔**
\> \status or \s # **显示当前**MySQL Shell**的状态**
\> \help or \? or # **帮助**
\> \source or \. # **使⽤活动语⾔执⾏脚本⽂件**
\> \quit or \q or \exit # **退出**
下面开始用实例进行理解!
SELECT⼦句
-- 基本语法
SELECT name, level
FROM player
WHERE level = 1
ORDER BY gold
LIMIT 3;
-- 功能为:查询player表中level为1的name和level,按照gold字段升序排序,并只返回前三条数据
SELECT⼦句中可以使⽤*表示所有字段,也可以使⽤各种表达式或者函数。
SELECT DISTINCT column FROM player;
-- 去除重复列
WHERE
-- 基础语法
SELECT column1, column2, ...
FROM table_name
WHERE condition;
WHERE:⽤来按照condition指定的条件过滤数据。
SELECT * FROM player WHERE level >= 10;
-- 查询player中level大于等于10的所有信息
DISTINCT
-- 基本语法
SELECT DISTINCT column1, column2, ...
FROM table_name;
-- 检索table_name表中字段column1, column2, ...中不重复的数据
-- DISTINCT:去掉重复值。
SELECT DISTINCT sex FROM player;
-- 检索player中sex字段的不同数据
AND OR NOT
-- 基本语法
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3;
WHERE condition1 OR condition2 OR condition3;
SELECT column1, column2, ...
FROM table_name
WHERE NOT condition;
⽤于组合WHERE⼦句中的多个条件。优先级: NOT > AND > OR
IN
-- 基本语法
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
-- 检索table_name表中字段column_name是value1, value2, ...值的column_name(s)
-- IN可以指定WHERE⼦句中的多个值。
SELECT * FROM player WHERE level IN (1,3,5);
-- 检索player表中level在1,3,5中的所有信息
BETWEEN
-- 基本语法
SELECT column1, column2, ...
FROM table_name
WHERE column BETWEEN value1 AND value2;
BETWEEN:⽤来选取介于value1和value2之间的数据范围内的值。
SELECT * FROM player WHERE level BETWEEN 1 AND 10;
-- 查询player中level在1和10之间的所有信息
LIKE
-- 基本语法
SELECT column1, column2, ...
FROM table_name
WHERE column LIKE pattern;
/*
%代表一个或多个字符的通配符
_代表仅仅一个字符的通配符
*/
-- LIKE:⽤于在WHERE⼦句中搜索满⾜指定pattern模式的值。
SELECT * FROM player WHERE name LIKE '_五%';
-- 取player表中第二个字是五的所有name
REGEXP
-- 基本语法
SELECT column1, column2, ...
FROM table_name
WHERE column REGEXP pattern;
/*
正则表达式 常用通配符有:
.表示任意一个字符
^表示开头,$表示结尾
[abc]表示其中任意一个字符
[^abc]表示不匹配abc
[a-z]表示范围内的任意一个字符
a|b表示a或者b
*/
REGEXP:⽤于在WHERE⼦句中搜索满⾜指定pattern模式的值。
SELECT * FROM player WHERE name LIKE '^张';
-- 查询player中姓张的所有数据
GROUP BY
-- 基本语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name -- 分组
HAVING aggregate_function(column_name) operator value; -- 分组后的数据再进行条件判断
GROUP BY:结合聚合函数aggregate_function,根据⼀个或者多个列队结果集进
⾏分组。常⽤的聚合函数包括COUNT、SUM、AVG、MIN、MAX等等
HAVING:⽤于筛选分组后的数据
SELECT * FROM player
GROUP BY SUBSTR(name,1,1)
-- substr()函数,代表姓名这个字符串中第一个位置开始取步长为1的字符串
HAVING COUNT(*) >=5;
-- 在player表中 按照姓氏开始分组,并统计行数大于5的返回(同姓大于5个的数据)
ORDER BY
-- 基本语法
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2 ... ASC|DESC;
ORDER BY:⽤于按照column1,column2 ...来升序或者降序排序结果集。
SELECT * FROM player ORDER BY level DESC;
-- 查询在player表中的所有信息,按照level降序排序。
LIMIT
-- 基本语法
SELECT column1, column2, ...
FROM table_name
LIMIT number;
LIMIT:⽤于限定返回记录的条数。
SELECT * FROM player LIMIT 3;
-- 返回player中的前三条记录
UNION
-- 基本语法
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
UNION:⽤于 两个或多个SELECT⼦句的结果(并集),默认去重复,如果允
许重复值,请使⽤UNION ALL****。
SELECT * FROM player WHERE level BETWEEN 1 AND 5
UNION
SELECT * FROM player WHERE gold BETWEEN 1 AND 5;
-- 返回player中level在1-5之间或gold在1-5之间的记录
INTERSECT
-- 基本语法
SELECT column_name(s) FROM table1
INTERSECT
SELECT column_name(s) FROM table2;
INTERSECT:⽤于合并两个或多个SELECT⼦句的结果(交集)
-- 基本语法
SELECT * FROM player WHERE level BETWEEN 1 AND 5
INTERSECT
SELECT * FROM player WHERE gold BETWEEN 1 AND 5;
-- 查询player表中level在1-5之间且gold也在1-5之间的数据
EXCEPT
-- 基本语法
SELECT column_name(s) FROM table1
EXCEPT
SELECT column_name(s) FROM table2;
EXCEPT:⽤于合并两个或多个SELECT⼦句的结果(差集)
SELECT * FROM player WHERE level BETWEEN 1 AND 5
EXCEPT
SELECT * FROM player WHERE gold BETWEEN 1 AND 5;
-- 查询player中level在1-5之间且gold不在1-5之间的记录
INNER JOIN
-- 基本语法
SELECT column_name(s) FROM table1
(INNER) JOIN table2
ON table1.column_name = table2.column_name;
INNER JOIN:内连接
SELECT * FROM player
INNER JOIN equip
ON player.id = equip.player_id;
-- 左表和右表所匹配的数据
-- 返回玩家信息以及玩家对应装备的信息
LEFT JOIN
-- 基本语法
SELECT column_name(s) FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
LEFT JOIN:左连接
SELECT * FROM player
LEFT JOIN equip
ON player.id = equip.player_id;
-- 返回左表中所有的数据和右表中匹配的数据,没有匹配数据的话NULL填充
-- 返回玩家表中的所有数据和玩家对应的装备信息,没有装备的话用NULL填充
RIGHT JOIN
-- 基本语法
SELECT column_name(s) FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
RIGHT JOIN:右连接
SELECT * FROM player
RIGHT JOIN equip
ON player.id = equip.player_id;
-- 返回右表中所有的数据和左表中匹配的数据,没有匹配数据的话NULL填充
-- 返回包含装备表的所有数据以及装备所对应的玩家信息,没有匹配到的玩家信息就用NULL来填充
FULL JOIN
-- 基本语法
SELECT column_name(s) FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;
FULL JOIN:全连接
SELECT * FROM player
FULL JOIN equip
ON player.id = equip.player_id;
-- 左连接和有链接的并集(会删除重复行)
-- 返回两个表中的符合条件的所有行
索引 (INDEX)
【创建】:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
ON table_name (column_name(s));
【查询】:
SHOW INDEX FROM table_name;
【删除】:
DROP INDEX index_name ON table_name;
==补充=
视图与表的使用方式是一致的,只是视图是动态数据,可以随着表的修改而发生变化!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理