目录
1.数据库概述
1.1数据库发展
在计算机的早期,“打孔卡”用来输入,输出和数据存储。
计算机数据库始于1960年代,这十年流行称为CODASYL的网络模型和称为IMS的分层模型。网状数据模型是以“图结构”表示数据记录之间的联系,层次数据模型是以“树结构”表示数据记录之间的联系。
在1974年至1977年之间关系数据库系统原型被创建,关系数据模型是以“二维表”(或称为关系)的方式表示数据记录之间的联系。关系数据库管理系统(RDBMS)的局限性:无法处理复杂类型数据(如文本、图像、视频等)。
NoSQL模型是非关系模型,使用“分布式”数据库系统,不仅可以处理结构化和非结构化的数 据,还可以非常快速地处理非结构化的大数据。
1.2数据库分类
1.2.1关系型数据库:
Oracle:大型数据库,收费
DB2:大型数据库,收费
SqlServer:中型数据库,收费
MySQL:中型数据库,免费
Access:小型数据库,是office套件中的一员
SQLite:嵌入式数据库,c语言开发
1.2.2.非关系型数据库:
Redis:缓存,键值对存储
Mongodb:分布式数据库,c++语言开发
1.3数据库的优点
- 1. 降低存储数据的冗余度
- 2. 更高的数据一致性
- 3. 存储数据的可以共享
- 4. 可以建立数据库所遵循的标准
- 5. 便于维护数据完整性
- 6. 能够实现数据的安全性
1.4数据库管理系统、数据库和表的关系
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建 立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系 统访问数据库中表内的数据。 数据库管理程序(DBMS)可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保存应用中实 体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。
注:
- 1. 一个数据库服务器包含多个数据库
- 2. 一个数据库包含多张表
- 3. 一张表包含多条记录
- 4. 一条记录包含多个字段(列)
2.SQL概念
SQL(Structured Query Language):结构化查询语言
2.1 SQL作用
1. 是一种所有关系型数据库的查询规范,不同的数据库都支持
2. 通用的数据库操作语言,可以用在不同的数据库中
3. 不同的数据库SQL语句有一些区别
2.2 SQL语句分类
1. 数据定义语言DDL(Data Definition Language):用来定义数据库对象、库、表、列等;创建、删除、修改 库,表结构
create table 表名
2. 数据查询语言DQL(Data Query Language):对表中的查询操作
select * from 表名
3. 数据操纵语言DML(Data Manipulation Language):对表中的记录操作增删改
insert、update、delete
4. 数据控制功能DCL(Data Control Language):用户权限的设置
MySQL的语法
1. 命令行中每一条SQL语句都是以分号(英文状态)结束,但是在Navicat中是可以不加分号的;
2. SQL中是不区分大小写,关键字中认为大小写一样;
3. 注释的三种方式
注释语法 说明
--空格 单行注释
/* */ 多行注释
# Navicat特有的注释方法
3.DDL操作数据库
3.1 创建数据库
1. 创建数据库
# 格式
CREATE DATABASE 数据库名;
# demo
create database demo;
2. 判断数据库是否已经存在,不存在则创建数据库
# 格式
CREATE DATABASE IF NOT EXISTS 数据库名;
# demo
create database if not exists demo;
3. 创建数据库并指定字符集
# 格式
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
# demo
create database demo character set utf8 collate utf8_general_ci;
3.2 查看数据库
1. 查看所有数据库
show databases;
2. 查看某一个数据库
show create database demo;
3.3 修改数据库
修改数据库默认的字符集
# 格式
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
# demo
alter database demo default character set utf8;
3.4 删除数据库
1. 直接删除数据库
# 格式
DROP DATABASE 数据库名;
# demo
drop database demo;
2. 判断数据库存在,再删除
# 格式
DROP DATABASE IF EXISTS 数据库名;
# demo
drop database if exists demo;
3.5 使用数据库
1. 查看正在使用的数据库
SELECT DATABASE();
2. 使用和切换数据库
# 格式
use 数据库名;
# demo
use demo;
4.DDL操作表结构
4.1 MySQL中数据类型
mysql没有boolean类型,一般使用tinyint用0,1表示,或者使用字符型以'true'、'false'或者'Y'、'N'表示
4.2 创建表
1. 创建表结构
# 格式
CREATE TABLE 表名(
字段名1 字段类型1,
字段名2 字段类型2
);
注意:
- 创建表,必须先选择要使用数据库;
- CREATE,TABLE是两个关键字;
- 字段类型要给大小。
#使用user数据库
use user;
#创建employee表包含 id,name,birthday 字段
CREATE TABLE employee(
id int(11),
name VARCHAR(22),
birthday date
);
#birthday为date,插入时间会自动插入年月日,时分秒被过滤掉
#同样如果为time,插入时间会自动插入时分秒,年月日被过滤掉
insert into employee values(1,'张三',now());
alter table employee add column b_time time;
update employee set b_time= now() where id=1;
2. 判断是否存在再创建
#创建employee表包含 id,name,birthday 字段
CREATE TABLE IF NOT EXISTS employee(
id int(11),
name VARCHAR(22) comment '名称',
birthday date
);
3. 快速创建一个表结构相同的表,只复制表结构,不复制数据
# 格式
CREATE TABLE 新表名 LIKE 旧表名;
# demo
CREATE TABLE newEmployee LIKE employee;
4.3 查看表
1. 查看某个数据库中的所有表
SHOW TABLES;
1. 查看表的结构
# 格式
DESC 表名
# demo
DESC employee;
2. 查看创建表的SQL语句
# 格式
SHOW CREATE TABLE 表名;
# demo
SHOW CREATE TABLE employee;
4.4 删除表
# 直接删除
# 格式
DROP TABLE 表名;
# demo
drop table newEmployee;
# 判断是否存在再删除
# 格式
DROP TABLE IF EXISTS 表名;
# demo
drop table if exists employee;
4.5 修改表的结构
1. 添加表中的字段
# 格式
ALTER TABLE 表名 ADD 列名 类型;
# demo
ALTER TABLE employee ADD age int(3);
2. 修改列类型
# 格式 更改列名及字段类型
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;
# demo
ALTER TABLE employee CHANGE age new_age int(4);
#格式 更改类名的字段类型
ALTER TABLE 表名 MODIFY 列名 新类型;
#demo
alter table employee modify birthday datetime;
3. 删除列 DROP
# 格式
ALTER TABLE 表名 DROP 列名;
# demo
ALTER TABLE employee DROP new_age;
4. 修改表名
# 格式
RENAME TABLE 表名 TO 新表名;
# demo
rename table employee to employee1;
5. 修改数据表字符集
# 格式
ALTER TABLE 表名 character set 字符集;
# demo
ALTER TABLE employee character set utf8;
6. 修改字段的字符集
#格式
ALTER TABLE 表名 modify 字段名 字段类型 character set 字符集;
#demo
alter table employee modify name varchar(32) character set utf8;
5.DML操作表中数据
DML操作是用于对表中的记录进行增删改操作。
5.1 插入操作
# 格式
INSERT [INTO] 表名 (字段名) VALUES (字段值);
解析:
insert into 表名:表示往哪张表中添加数据
(字段名 1, 字段名 2, …):要给哪些字段设置值
values (值 1, 值 2, …):设置具体的值
1. 插入全部字段--方法一(所有的字段名都写出来)
# 格式
INSERT INTO 表名 (字段名 1, 字段名 2, 字段名 3…) VALUES (值 1, 值 2, 值 3);
# demo
insert into employee (id,name,birthday) values (1, '孙悟空', '19991209');
2. 插入全部字段--方法二(不写字段名)
# 格式
INSERT INTO 表名 VALUES (值 1, 值 2, 值 3);
# demo
insert into employee values (2, '猪八戒', '19991210');
3. 插入部分数据
# 格式
INSERT INTO 表名 (字段名 1, 字段名 2, ...) VALUES (值 1, 值 2, ...);
# demo
insert into employee (id,name) values (1, '孙悟空');
注意:
1. 没有添加数据的字段会使用 NULL,前提是字段设置为允许为NULL;
2. 插入的数据应与字段的数据类型相同;
3. 数据的大小应在列的规定范围内,例如:不能将一个长度为 80 的字符串加入到长度为 40 的列中;
4. 在 values 中列出的数据位置必须与被加入的列的排列位置相对应。在 mysql 中可以使用 value,但不建议使 用,功能与 values 相同;
5. 字符和日期型数据应包含在单引号中,MySQL 中也可以使用双引号;
6. 不指定列或使用 null,表示插入空值。
5.2 蠕虫复制(了解)
概念:将一张已经存在的表中的数据复制到另一张表中,一般用来做测试。
首先创建一张表employee1:
create table employee1 like employee;
1. 将表employee中的所有列内容复制到employee1中:
# 格式
INSERT INTO 表名 1 SELECT * FROM 表名 2;
# demo
insert into employee1 select * from employee;
2. 将表employee中的部分列内容复制到employee2中:
# 格式
INSERT INTO 表名 1(列 1, 列 2) SELECT 列 1, 列 2 FROM student;
# demo
insert into employee1(name,age) select name,age from employee;
5.3 更新表中的数据
# 格式
UPDATE 表名 SET 列名=值 [WHERE 条件表达式]
解析:
UPDATE 表名:需要更新的表名
SET:修改的列值
WHERE:符合条件的记录才更新
1. 不带条件修改(会修改所有字段的值)
# 格式
UPDATE 表名 SET 字段名=值;
# demo
update employee set name ='小明';
2. 带条件修改
# 格式
UPDATE 表名 SET 字段名=值 WHERE 字段名=值;
# demo
update employee set name ='john' where id=2;
5.4 删除表中的数据
# 格式
DELETE FROM 表名 [WHERE 条件表达式]
解析:
DELETE from 表名:从哪个表中删除记录
WHERE: 符合条件的记录才删除
1. 不带条件删除数据(会删除所有记录)
# 格式
DELETE FROM 表名;
# demo
delete from employee;
2. 带条件删除数据
# 格式
DELETE FROM 表名 WHERE 字段名=值;
# demo
delete from employee where name ='小明';
注意:
如果使用truncate进行删除记录,不删除表的结构,释放空间
# 格式
TRUNCATE TABLE 表名;
truncate和delete的区别:
1. truncate删除数据后重新写数据会从1开始,而delete删除数据后只会从删除前的最后一行续写;
2. 内存空间上,truncate释放空间;delete不释放空间;
3. truncate删除速度比delete快;
4. delete属于DML语句,而truncate属于DDL语句,这造成了它们在事务中的不同现象:
delete在事务中,因为属于DML语句,所以可以进行回滚和提交操作(由操作者) truncate属于DDL语句, 在事务中,执行后会自动commit,所以不可以回滚;
5. delete可以在后续加上where进行针对行的删除;truncate后面只能加上表名,直接删除表数据,无法使用 where筛选条件。
6.where条件运算符
6.1按条件表达式筛选
> : 大于
=:等于
!=:不等于
<> :不等于
> =:大于等于
例如:
delete FROM stu WHERE age > 22;
is null:判断字段为空
例如:
delete FROM stu WHERE money IS NULL;
注意:解决了money = NULL查询不出来的问题
is not null: 判断字段不为空
例如:
delete FROM stu WHERE money IS NOT NULL;
用来查询字段不为空的数据记录
6.2按逻辑表达式筛选
and or not (建议使用)
&& || !
例如:
delete stu WHERE age <> 22 AND `name` != '小红';
6.3模糊查询(条件查询的一种)
like,between and,in
Like:
例如:
delete FROM stu WHERE `name` LIKE '%红%';
delete FROM stu WHERE `name` LIKE '红%';
delete FROM stu WHERE `name` LIKE '%红';
注意:
like一般和通配符一起使用,常用通配符
%:代表0到多个字符,包括0
_ :代表任意单个字符 SELECT * FROM stu WHERE name LIKE '小_';
特殊情况:查询带有_的人名,需要转义
delete FROM stu WHERE `name` LIKE '\_%';
between and:等价于大于等于第一个值,小于等于第二个值
例如:
delete FROM stu WHERE age between 22 AND 23;
注意:
可以提高语句的简洁度;包含临界点;临界值不能颠倒;
如果时间字段使用between and,需要注意右边界的时间格式,如:
delete from user where create_time between '20220413' and '20220414';
有边界的时间没有明确时分秒,mysql会将时间默认为2022-04-14 00:00:00,返回的结果集可能会不包含2022- 04-14的数据
in判断某个字段的值是否属于in列表中的某一项,可以满足列表中的一项或多项,如果不满足则返回空
例如:
delete FROM stu WHERE stu_number in(003,002);
delete FROM stu WHERE (age,name) in ((22,'小红'),(22,'小明'));
注意:可以提高语句的简洁度;in列表的值类型必须统一或兼容;不支持通配符