1 数据库简介
1.1 什么是数据库
数据库(DB,DataBase)
概念:数据仓库,软件,安装在操作系统之上,SQL 可以储存大量数据
作用:存储,管理数据
1.2 数据库分类
关系型数据库: (SQL)
-
MySQL ,Oracle, Sql Server ,DB2, SQLlite
-
通过表和表之间,行和列之间的关系进行数据的存储,
非关系型数据库: (NoSQL) Not Only
- Redis MongoDB
- 非关系型数据库,对象存储,通过对象的自身的属性来决定
DBMS(数据库管理系统)
- 数据库的管理软件,科学有效的管理数据,维护和获取数据
- MySQL,数据库管理系统
1.3 MySQL简介
1.4 安装MySQL
-
解压安装包
-
配置环境变量
-
新建MySQL配置文件 my.ini
[client] default-character-set=utf8 [mysqld] basedir=D:\mysql-8.0.25-winx64\mysql-8.0.25-winx64\ datadir=D:\mysql-8.0.25-winx64\mysql-8.0.25-winx64\data\ port=3306
-
管理员模式启动cmd ,cd到MySQL的bin目录
-
输入mysqld -install安装服务–
-
输入mysqld --initialize-insecure --user=mysql初始化数据库文件
-
输入net start mysql启动mysql,重置密码
-
输入mysql -u root -p
-
输入alter user ‘root’@‘localhost’ identified by ‘************’;重置密码
-
输入 flush privileges; 刷新
-
输入 net stop mysql关闭服务
-
再次开启mysql 输入mysql -u root -p
-
输入密码进入mysql
1.5 图形显示界面----SQLyog
1.6 基本命令行语句
-- 所有SQL语句都用分号结尾
-- mysql关键字不分大小写
-- 查看所有数据库:show databases
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
| testbase |
+--------------------+
-- 切换数据库:use+数据库名
use school;
Database changed
-- 查看数据库中的表:show tables
show tables;
+------------------+
| Tables_in_school |
+------------------+
| student |
+------------------+
-- 显示数据库中表中的所有信息:descirbe+表名
describe student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | NO | | NULL | |
| age | int | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
-- 创建一个数据库:create database + name
create database newdatabase;
Query OK, 1 row affected (0.00 sec)
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| newdatabase |
| performance_schema |
| school |
| sys |
| testbase |
+--------------------+
-- 退出链接:exit
exit
Bye
数据库语言 CRUD 增删改查
-
DDL 数据库定义语言
-
DML 数据库操作语言
-
DQL 数据库查询语言
-
DCL 数据库管理语言
2 数据库操作
2.1 数据库操作
- 创建数据库
-- []表示可选内容,{}表示必选内容
CREATE DATABASE [IF NOT EXISTS] newdatabase
- 删除数据库
DROP DATABASE [IF EXISTS] testbase
- 切换数据库
-- 如果表名或字段名是一个特殊字符,就要加上``
use newdatabase
- 查看数据库
show databases
2.2 数据库的列类型
数值
-
tinyint 十分小的数据 1字节
-
smallint 较小的数据 2字节
-
mdiumint 中等大小的数据 3字节
-
int 标准整数 4字节
-
bigint 较大的数据 8字节
-
float 浮点数 4字节
-
double 浮点数 8字节
-
decimal 字符串形式的浮点数 用于保留准确精确度的列,例如会计系统中的货币数据
字符串
- char 字符串固定大小 0~255 固定长度
- varchar 可变字符串 0~255 可变长度
- tinytext 微型文本 28 - 1
- text 文本串 216 - 1 保存大文本
- longtext 超大文本串 232 - 1
日期与时间
- date 日期(yyyy-mm-dd)
- time 时间(hh:mm:ss)
- datetime 日期与时间组合(yyyy-mm-dd hh:mm:ss)
- timestamp 时间戳 1970.1.1到现在的毫秒数
- year 年份 (yyyy)
2.3 数据库的字段属性
默认
- 设置默认的值
主键
- 唯一地标识表中的每一行
- 用与其他表的外键关联,以及本记录的修改与删除
- 一个表一般只有一个唯一的主键
- 主键一定非空
非空
- 假设设置为not null,如果不给他赋值,就会报错
- 如果不勾选not null ,不填写值默认就为null
unsigned
- 无符号整数
- 声明了该列不能为负数
自增
- 自动在上一条基础上+1
- 通常用来设置唯一的主键 index ,必须是整数类型
- 可以自定义设置主键自增的起始值和步长
zerofill
- 不足的位数使用0来填充
2.4 创建表
CREATE DATABASE school;
USE school;
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`password` VARCHAR(30) NOT NULL DEFAULT '123456' COMMENT '密码',
`name` VARCHAR(20) NOT NULL DEFAULT'匿名' COMMENT '姓名',
`sex` varchar(3) not null default '男' comment '性别',
`address` varchar(100) default null comment '地址',
`birthday` datetime default null comment '出生日期',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
SHOW CREATE DATABASE school -- 查看创建数据库语句
SHOW CREATE TABLE student -- 查看创建表的语句
DESC student -- 查看表的具体结构
## 2.5 表的引擎
- INNODB : 现在默认使用 安全性高 支持事务的处理,多表多用户操作
- MYISAM : 早些年使用 节约空间,速度较快
| | INNODB | MYISAM |
| :----------: | :--------------------: | :----------: |
| 事务支持 | 支持 | 不支持 |
| 数据行锁定 | 支持(行锁) | 不支持(表锁) |
| 外键约束 | 支持 | 不支持 |
| 全文索引 | 不支持 | 支持 |
| 表空间的大小 | 较大(约为MYISAM的两倍) | 较小 |
## 2.6 修改和删除数据表字段
```sql
-- 修改表名 ALTER TABLE 旧名 RENAME AS 新名
ALTER TABLE student RENAME AS student1;
-- 增加表的字段 ALTER TABLE 表名 ADD 字段名 字段的列属性
ALTER TABLE student1 ADD age INT(8);
-- 修改表的字段
ALTER TABLE student1 MODIFY age VARCHAR(5); -- 修改约束
ALTER TABLE student1 CHANGE age stu_age VARCHAR(6) -- 重命名 要添加新的约束
-- 删除表的字段
ALTER TABLE student1 DROP stu_age
-- 删除表
DROP TABLE IF EXISTS student1
所有的创建和删除操作,尽量加上(IF EXISTS/IF NOT EXISTS)判断,以免报错
3 MySQL数据管理
3.1 外键
3.2 DML语言
DML语言: 数据操作语言
insert
-- 插入语句
-- insert into `表名`(`字段1`,`字段2`,`字段3`) values('值1','值2','值3'......);
INSERT INTO `student1` (`name`) VALUES('Bob');
一般写插入语句,一定要保证数据和字段一一对应
如果一次性插入多个值,values加括号
-- insert into `表名`(`字段1`,`字段2`,`字段3`) values('值1'),('值2'),('值3')......);
注意事项
- 字段和字段之间使用英文逗号隔开
- 字段是可以省略的,但是后面的值必须要一一对应
- 可以同时插入多条数据,values后面的值需要使用括号隔开 values(‘值1’),(‘值2’)
update
-- update 表名 set 字段名 = '' where [条件]
UPDATE `student1` SET `name` = 'Ruby' WHERE id = 1;
UPDATE `student1` SET `sex` = '女' WHERE id = 1;
-- 不指定条件的情况下,会写该所有表
update `student1` set `name` = 'Ruby' ;
-- 修改多个属性,用逗号隔开
update `student1` set `name` = 'Bob',`sex` = '男' where id = 1;
条件:where字句 运算符
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<> \ != | 不等于 | 5<>6 | true |
> | 大于 | 5>6 | false |
< | 小于 | 5<6 | true |
>= | 大于等于 | 5>=6 | false |
<= | 小于等于 | 5<=6 | true |
BETWEEN…AND… | 闭合区间 | 5∈[2,5] | true |
AND | 条件与&& | 5>1&&1>2 | false |
OR | 条件或|| | 5>1||1>2 | true |
语法: UPDATE 表名
set column_name
= value,[column_name = value…] [where 条件]
注意事项
- column_name 是数据库的列,尽量带上``
- 如果没有指定条件,则会修改所有的列
- value 可以是一个具体的值,也可以是一个变量
delete
-- delete 删除数据
-- delete from `表名` [where 条件]
DELETE FROM `student1` WHERE id = 2;
truncate
作用: 完全清空一个数据库表,表的结构和索引约束不会变
-- 清空表
TRUNCATE `表名`
与delete区别
- 相同点:都能删除数据,都不会删除表结构
- 不同点:
- TRANCATE 重新设置自增列计数器,使其归零
- TRANCATE 不会影响事物
DQL语言
DQL:数据查询语言
- 所有查询操作都用它 SELECT
- 简单查询和复杂查询都能做
-- select 字段 from 表
-- 查询全部学生信息
SELECT * FROM `student`;
-- 查询指定字段
SELECT `studentno`,`studentname` FROM `student`;
-- 给查询结果起别名,可以给字段起别名,也可以给表起别名 AS
SELECT `studentno` AS 学号,`studentname` AS 姓名 FROM `student`;
去重
作用: 去除select语句询结果中重复的数据
-- 查询全部的考试成绩
select * from `result`
-- 查询哪些同学参加了考试,
select `studentno` from result
-- 发现重复数据,去重
select distinct `studentno` from result
数据库的列(表达式)
select 表达式
select version() -- 查询当前MySQL版本(函数)
select 1+2+5*7 as 结果 -- 计算表达式
select @@auto_increment_increment -- 查询自增步长(系统变量)
select `studentno`,`studentresult`+1 as 学生成绩加一分 from result
数据库中的表达式:
- 文本值
- 列
- null
- 函数
- 计算表达式
- 系统变量
where条件子句
作用: 检索数据中符合条件的值
搜索的条件由一个或多个表达式组成 结果为布尔值
运算符 | 语法 | 描述 |
---|---|---|
and /&& | a and b/a&&b | 逻辑与 |
or/|| | a or b /a||b | 逻辑或 |
Not / ! | not a / ! a | 逻辑非 |
尽量使用英文
模糊查询
运算符 | 语法 | 描述 |
---|---|---|
is NULL | a is null | 如果操作符为NULL,结果为真 |
is NOT NULL | a is not null | 如果操作符不为null,结果为真 |
BETWEEN | a between b and c | 如果a在b和c 之间,则结果为真 |
LIKE | a like b | SQL匹配,如果a匹配b,则结果为真 |
IN | a in (a1,a2,a3…) | 如果a在a1,a2,a3…之中,则结果为真 |
-- ===========模糊查询==========
-- 查询姓李的人
-- like结合 %代表0到任意个字符 _代表一个字符
-- 查询所有姓李的
SELECT `StudentNo`,`StudentName` FROM `student` WHERE StudenName LIKE '李%'
-- 查询名字后面只有一个字的
SELECT `StudentNo`,`StudentName` FROM `student` WHERE StudenName LIKE '李_'
-- 查询名字里有天字的
SELECT `StudentNo`,`StudentName` FROM `student` WHERE StudenName LIKE '%天%'
-- in(具体的一个或多个值)
-- 查询学号为1001,1002,1003的同学
SELECT `StudentNo`,`StudentName` FROM `Student` WHERE StudentNo IN (1001,1002,1003);
联表查询
语法
/*
select 查询列表
from 表1 别名
[连接类型] join 表2 别名 on 连接条件
[where 筛选条件]
[group by 分组]
[having 分组筛选条件]
[order by 排序列表]
*/
分类
- 内连接 inner
- 外连接
- 左外 left [outer]
- 右外 right [outer]
- 全外 full [outer] (MySQL不支持)
- 交叉连接 cross
(一) 内连接
语法
/*
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件;
*/
分类
- 等值
- 非等值
- 自连接
特点
- inner 可以省略
- 筛选条件放在where后面,连接条件放在on后面,提高分离性
- 添加排序,分组筛选
(二)外连接
应用:用于查询一个表中有,另一个表中没有的记录
语法
/*
select 查询列表
from 表1 别名
left/right/full [outer] join 表2 别名
on 连接条件;
*/
特点
-
外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果 = 内连接结果+主表中有而从表中没有的值
-
左外连接:left join 左边是主表
右外连接:right join 右边是主表
-
左外和右外交换两个表的顺序,可得到同样的结果
(三)交叉连接
语法
/*
select 查询列表
from 表1 别名
cross join 表2 别名
*/
结果
表1与表2的笛卡尔乘积
分页和排序
- 等值
- 非等值
- 自连接
特点
- inner 可以省略
- 筛选条件放在where后面,连接条件放在on后面,提高分离性
- 添加排序,分组筛选
(二)外连接
应用:用于查询一个表中有,另一个表中没有的记录
语法
/*
select 查询列表
from 表1 别名
left/right/full [outer] join 表2 别名
on 连接条件;
*/
特点
-
外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果 = 内连接结果+主表中有而从表中没有的值
-
左外连接:left join 左边是主表
右外连接:right join 右边是主表
-
左外和右外交换两个表的顺序,可得到同样的结果
(三)交叉连接
语法
/*
select 查询列表
from 表1 别名
cross join 表2 别名
*/
结果
表1与表2的笛卡尔乘积