一、什么是数据库
用于存储和管理数据的仓库。
数据库有许多版本,MySQL是其中之一它是一款开源的、免费的。小型的数据库。MySQL 6.x开始要收费。
SQLLite数据库常用于嵌入式系统、手机应用和浏览器中
特点
一个文件系统,持久化存储数据,且方便管理数据。使用统一的SQL方法操作数据库。
二、SQL基本概念和通用语法
SQL:结构化查询语言
国际化标准组织置顶的一种定义的操作所有关系型数据库的规则,每一种数据库的操作方式主体上相同,但存在不同之处,这些不同之处成为每种数据库的方言。
SQL通用语法
1、SQL语句 可单行或多行书写,以分号;结尾
2、使用空格 ,和缩进Tab来增强可读性
3、MySQL数据库的SQL语句不区分大小写
4、3种注释方式:
- 单行注释:
-- 注释内容或# 注释内容(MySQL特有),注意--与#之后均有一个空格 - 多行注释:
/* 注释内容 */
基本数据类型
| 数据类型 | 实例 | 占用字节数 | 说明或范围 |
|---|---|---|---|
| 精确数值类型 | tinyInt | 1 | 0~255 |
| smallint | 小的整数 | ||
| mediumint | 中等大小整数 | ||
| bigint | 8 | -2^63 ~ 2^63-1 | |
int(integer)(常用) | 4 | -2^31 ~ 2^31-1 | |
| decimal | 由精度确定 | 压缩严格的定点数。decimal[(p[,s])],其中p是精度 | |
| 浮点数类型 | float | 单精度浮点数 | |
double(常用) | 双精度浮点数 | ||
| 日期类型 | year | YYYY 1901~2155 | |
| time | HH:MM:SS -838:59:59 ~ 838:59:59 | ||
| date | YYYY-MM-DD 1000-01-01-9999-12 ~ 3 | ||
| datetime | YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12~31 23:59:59 | ||
| timestamp | YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07UTC | ||
| 字符串 | char(M) | M为0~255的整数 | |
| varchar(M) | M为0~65535之间的整数 | ||
| BLOB | tinyblob | 允许长度为0~255字节 | |
| blob | 允许长度为0~65535字节 | ||
| mediumblob | 允许长度为0~167772150字节 | ||
| longblob | 允许长度为0~4294967295字节 | ||
| CLOB | tinytext | 允许长度为0~255字节 | |
| text | 允许长度为0~65535字节 | ||
| mediumtext | 允许长度为0~167772150字节 | ||
| longtext | 允许长度为0~4294967295字节 | ||
| 二进制 | varbinary(M) | 允许长度0~M个字节的变长字节 | |
| binary(M) | 允许长度0~M个字节的定长字节 |
三、登录MySQL
如果没有启动mysql,那么首先在打开我的电脑,按照以下顺序手动启动mysql,否则会报错无法连接到mysql,因为mysql没有启动
然后以管理员身份运行命令提示符
以我自己mysql装在D盘为例
-->输入D:转到D盘
-->跳转到自己mysql目录下的bin目录,以我的为例: cd D:\mysql-8.0.31-winx64\bin
-->输入 mysql -u root -p
-->输入自己设置的密码
-->登录成功
退出数据库登录: exit; 记得去启动数据库的地方手动关闭数据库
四、数据库的增删查改(CRUD)操作
写在前面,以下四个MySQL的系统默认数据库不要去乱动
语言分类
1、 DDL: 操作数据库、表
关键字:create、drop、alter等
2、 DML: 增删改表中的数据
关键字:insert、delete、update等
3、 DQL: 查询表中数据
关键字:select、where等
4、 DCL: 定义数据库的访问权限和安全级别、创建用户
关键字:GRANT、REVOKE等
DDL:操作数据库、表
1、操作数据库:CRUD
1.1、C(Create): 创建
| 操作 | 语句 |
|---|---|
| 创建数据库 | create database databaseName; |
| 创建数据库时判断待创建的数据库是否存在,若不存在则创建 | create database if not exists databaseName; |
| 创建数据库时设置其使用的字符集 | create databases databaseName character set xxx; |
综合语句:创建数据库时可以根据需要先判断是否存在再创建并设置其使用的字符集 -->
create databases if not exists databasesName character set xxx
示例:
1.2、R(Retrieve): 查询
| 操作 | 语句 |
|---|---|
| 查询所有数据库名称 | show databases;(注意语句最后的英文分号!) |
| 查看某个数据库的字符集: 查询某个数据库的创建语句 | show create databases databaseName; |
1.3、U(Update): 修改
| 操作 | 语句 |
|---|---|
| 修改数据库的字符集 | alter databases databaseName character set 字符集名称; |
1.4、D(Delete): 删库跑路
| 操作 | 语句 |
|---|---|
| 删除数据库 | drop database databaseName; |
| 先判断删除 | drop database if exists databaseName; |
1.5、使用数据库
| 操作 | 语句 |
|---|---|
| 查询当前正在使用的数据库名称 | select database();, |
| 使用某个数据库 | use databaseName; |
2、操作表
2.1、C(Create): 创建表
创建一个变量的格式为: 变量名 数据类型
| 操作 | 语句 |
|---|---|
| 创建表 | create table 表名(列名1 数据类型1, 列名2 数据类型2, ..., 列名n 数据类型n); |
| 复制表 | create table 复制出的表 like 被复制的表; |
| 创建数据举例 | int: age int(注意顺序) |
double: score double(5,2)(需要用括号设限制,括号内数字意思是,一共5位小数,小数点后保留2位) | |
date: 2022-11-13 date | |
datetime: 2022-11-13 16:48:52 datetime | |
timestamp(时间戳): yyyy-mm-dd hh:mm:ss timestamp,若对某个部分不赋值或者赋值为null,则会自动使用当前系统时间 | |
varchar(字符串类型): name varchar(20),括号内为该数据可容纳最大字符数 |
示例:
2.2、R(Retrieve): 查询表
| 操作 | 语句 |
|---|---|
| 查询某个数据中所有的表的名称 | show tables; |
| 查询某个表的结构 | desc 表名; |
示例:
2.3、D(Delete): 删除表
| 操作 | 语句 |
|---|---|
| 删除表 | drop table tableName; |
| 删除之前判断是否存在 | drop table if exists tableName; |
2.4、U(Update): 修改表
| 操作 | 语句 |
|---|---|
| 修改表名 | alter table nameNow rename to newName; |
| 修改标的字符集 | alter table tableName character set utf8; |
| 添加一列 | alter table tableName add 列名 数据类型 |
| 修改列名称 | 举例:alter table tableName change 列名 新列名 新数据类型; |
| 修改列数据类型 | alter table tableName modify 列名 新数据类型; |
| 删除列 | alter table tableName drop 列名; |
2.5、使用select * from tableName;,即可查看选定表格中所有的数据
DML:增删改表中数据
1、添加数据 - insert
1.1、语法: insert into tableName(列名1, 列名2, ...列名n) values(值1, 值2, ...值n);
1.2、注意事项:
- 列名和值要一一对应
- 如果 tableName 后不加列名,那么会默认给所有列名添加值,即:
insert into tableName values(值1, 值2, ...值n); - 除了数字类型, 其他类型需要使用引号(
``或者"")引起来
2、删除数据 - delete
2.1、语法: delete from tableName [where 条件] --> delete from Users where userId=5;
2.2、如果不加[where]条件,则会删除表中全部记录 --> delete from Users --> 效率低
2.3、先删除表,再创建一个一模一样的空表: TRUNCATE TABLE tableName --> 效率高
3、修改数据 - update
3.1、语法: update tableName set 列名1 = 值1, 列名2 = 值2, ... [where条件]
eg.update Users set identify="VIP", discount=0.6 where id=5; --> 在 表Users 中修改 id=5 的数据的 identify 为 "VIP", discount 为 0.6
3.2、注意事项: 若不加[where条件],那么会删除表中全部记录
DQL、查询表中的记录
语法
| 语句 | 说明 |
|---|---|
| select | 字段列表 |
| from | 表名列表 |
| where | 条件列表 |
| group by | 分组列表 |
| having | 分组之后的条件 |
| order by | 排序 |
| limit | 分页限定 |
基础查询
- 查询语法:
select 列名 from tableName; - 去除重复的结果集: 使用
distinct(根据字符去除) -->select distinct 列名 from tableName; - 起别名:
列名操作 as 别名或者列名 别名-->select name, math s数学, chinsese as 语文 from subjects; - 多个字段查询: 各字段之间用
,分隔,如果查询所有字段,则用*代替字段列表
1、排序查询
1.1、语法: order by 子句 --> order by 排序字段1 排序方式1, 排序字段2, 排序方式2...;
2.2、排序方式:
- ASC: 升序排列,默认
- DESC: 降序, 需要手动设置
eg.select * from Users order by money DESC, stickness ASC;
3.3、注意:
设置多个排序条件时,当前面的排序规则相同,才会依次调用后面的排序规则
2、聚合函数
解释: 将一列数据作为一个整体,进行纵向的计算
2.1、MySQL中自带的5个聚合函数
| 聚合函数 | 功能 | 语法 |
|---|---|---|
| count | 计算个数 | select count(列名) from tableName; |
| max | 计算最大值 | 类比count |
| min | 计算最小值 | 类比count |
| sum | 计算和 | 类比count |
| avg | 计算平均值 | 类比count |
2.2、聚合函数计算时会排除NULL值,解决方法(以count为例):
- IFNULL函数:
select count(ifnull(rent, 0)) from Users;--> 若rent为null,则将其替换为0 - 选择不包含null的列进行计算
*:只要一列数据有一个不为null,那么就算一列有效数据 ,count(*)- 主键:
count(id)
3、分组查询
3.1、语法: group by 分组字段; --> select identify, sum(rent), count(id) from group where rent>500 by identify;
3.2、注意:
- 分组之后查询的字段: 分组字段、聚合函数
- where 和 having 的区别: where 在分组前进行限定 - 若不满足条件则不参与分组; having 在分组之后进行限定 - 若不满足结果则不会被查询出; where 后不可以跟聚合函数,但 having 可以。
4、分页查询
4.1、语法:limit 开始的索引, 每页查询的记录条数; --> select * from Users limit 0,5;
开始的索引 =(当前页码-1) * 每页显示的条数
4.2、注意: limit是一个MySQL方言
5、条件查询
5.1、where后跟子句
5.2、运算符
- > 、< 、<= 、>= 、= 、<>(不等于)
- between ...and... 取一个闭合区间
- in 集合 -->
in (1,2,3,) - like - 模糊查询
- is NULL 判断值为null只能用
is - and 或者 &&
- or 或者 ||
- not 或者 !
5.3、like - 模糊查询
根据某类数据中的某个特征,在表中进行查询,得到含有该特征的所有值,除了特征需要给出外,其他部分(特征值的前或后)都用占位符 --> _代表一个字符,%代表任意多个字符
eg1.select * from Users where name like '路%' --> 查询 name 数据中第一个字符为 路 的人,%不管字符数,就是说 路 字后面的字符数任意,
eg2、select * from Users where name like "_鸣%" --> 查询 name 数据中第二个字符为 鸣 的人,一个_代表一个字符的占位符
eg3、select * from Users where name like '___' --> 查询 name 数据中为三个字符的人