文章目录
一、数据库概述
数据库其实就是存放数据的仓库
使用数据库的原因就是为了方便对数据的增删查改,如果存放在文件中的话,文件太大会很影响读取效率。
数据库的目录结构:
目录 | 内容 |
---|---|
bin | 存放MySQL相关的可执行文件,MySQLInstanceConfig.exe 启动配置导向 |
data | 存放MySQL默认自带数据库 |
include | 存放MySQL运行需要的c语言头文件 |
lib | 存放c++动态链接库 |
数据库的类型:
关系型数据库:MySQL、Oracle。。。(数据存储在一张二维表中)
非关系型数据库:Redis。。。
数据库服务器一对多个数据库,数据库一对多张表
二、SQL
1.sql简介
概述:
Structrue Query Language 结构化查询语言
作用:
对数据库进行操作(创建数据库、删除数据库,创建表、删除表,增删查改表数据)
SQL语句分类:
分类 | 说明 |
---|---|
DDL | Data Define Language 数据库定义语言 用于创建数据库、数据表等操作 关键字:create、drop。。。 |
DML | Data manipulation Language 数据操作语言 用于对数据表数据进行增删改查操作 关键字:insert、update、delete |
DQL | Data Query Language 数据查询语言 用于对数据进行查询操作 关键字:select、show |
DCL | Data ControlLanguage 数据控制语言 用于创建用户、删除用户、给用户分配权限等操作 关键字:grant、remove |
SQL语法:
每条sql语句以英文分号结尾
关键字不区分大小写,官方推荐大写
SQL注释的分类:
单行注释:
# 注释内容:mysql特有的注释
-- 注释内容(所有数据库库共有的注释)
多行注释:
/*
注释内容
*/
2.操作数据库和数据表
DDL数据库操作语句:
DDL语句操作数据库 | 语法 |
---|---|
创建数据库 | create database 数据库名; |
查看所有数据库 | show databases; |
查看某个数据的定义信息 | show create database 数据库名; |
修改数据库的字符集 | alter database 数据库名 default character set 码表; |
删除数据库 | drop 数据库名; |
查看正在使用的数据库 | select datbase(); |
使用数据库 | use 数据库名; |
DDL语句操作数据表:
DDL语句操作数据表 | 语法 |
---|---|
创建数据表 | create table 表名(字段名1 数据类型,…); |
查看数据库所有表 | show tables; |
查看表结构 | desc 表名; |
查看创表语句 | show create table 表名; |
复制表(只复制结构,不复制数据) | create table 新表名 like 旧表名; |
删除表 | drop table 表名; |
判断表是否存在,存在则删除 | drop table if exists 表名; |
DDL语句修改表结构:
DDL语句修改表结构 | 语法 |
---|---|
添加表列 | alter table 表名 add 字段名 数据类型; |
修改列类型 | alter table 表名 modify 字段名 数据类型; |
修改列名和类型 | alter table 表名 change 旧字段名 新字段名 数据类型; |
删除列 | alter table 表名 drop 字段名; |
修改表名 | rename table 旧表名 to 新表名; |
修改表字符集 | alter table 表名 default character set 码表; |
3.操作数据
MySQL常用数据类型:
int:整型
double:小数
varchar:变长字符串
data:日期,格式:yyyy-mm-dd,没有数据
插入数据:
DML语句插入数据 | 语法 |
---|---|
插入全部字段 | insert into 表名(字段1,…) values(值1,…) insert into 表名 values(值1,…) |
插入部分字段 | insert into 表名(字段1,…) values(值1,…) |
插入多条数据 | insert into 表名(字段1,…) values(值1,…),(值1,…); |
更新数据(也就是对数据的修改):
DML语句更新数据 | 语法 |
---|---|
不带条件更新 | Update 表名 set 字段名1=值1,字段名2=值2,…; |
带条件更新 | Update 表名 set 字段名1=值1,字段名2=值2,… where 条件; |
删除数据:
DML语句删除数据 | 语法 |
---|---|
删除满足条件的数据 | delete from 表名 where 条件; |
删除所有数据 | delete from 表名;这种删除方式不会影响表的自增长 |
删除所有数据 | truncate 表名;这种方式会充值表的自增长 |
查询数据:
DQL语句查询数据 | 语法 |
---|---|
查询所有数据 | select * from 表名; |
查询满足条件的数据 | select * from 表名 where 条件; |
查询数据指定别名 | select 字段名 别名,… from 表名 where 条件; |
4.条件查询
4.1 in和like关键字查询
通配符:
%:匹配任意和字符
_:匹配任意一个字符
关键字 | 作用 | 格式 |
---|---|---|
in | 限定查询数据的范围 | select * from 数据表 where 表字段 not in (1,3,5); |
like | 模糊查询,满足条件的查询出来 | select * from 数据表 where 表字段 like ‘马%’; |
4.2 排序查询
排序查询分类 | 语法 |
---|---|
单列排序 | select * from 表名 order by 字段名 asc或desc asc:升序,默认值 desc:降序 |
组合排序 | select * from 表名 order by 字段名1 asc或desc, 字段名2 asc或desc 这种方式会先根据1排序,遇到相同才会使用2排序 |
4.3 聚合函数查询
MySQL常用聚合函数 | 说明 | 格式 |
---|---|---|
count | 求数量 | select count(english) from student; |
sum | 求和 | select sum(math) 数学总分 from student; |
max | 求最大值 | select max(math) 数学最高分 from student; |
min | 求最小值 | select min(math) 数学最低分 from student; |
avg | 求平均值 | select avg(math) 数学成绩平均分 from student; |
4.4 分组查询
分组查询的语法: group by 字段名 having 条件
注意事项:
1.分组之后,聚合函数操作的不是行数据,而是组数据
2.对于分组之后的条件筛选需要使用having语句
3.having语句使用的字段名必须是出现在select语句中的
having和where的区别:
where:是一行一行的过滤数,横向查询,不能在聚合后使用
having:用于分组之后过滤数据,用在聚合函数之后
总结:也就是说,除非是聚合函数后面,否则全部使用where
4.5 分页查询
分页查询的语法: limit int(要跳过的行数),int(要查询的记录数)
可以理解为 limit 从那里开始拿,拿多少数据
作用:
分页查询分页查询,就是用来分页的,就像淘宝的商品分页展示那样
注意:
如果分页要和排序一起使用时,要把排序放到前面,这是规定
5.数据库约束
约束的作用:对表中的数据限制,保证数据的正确、有效
种类:
约束名 | 约束关键字 |
---|---|
主键约束 | primary key |
非空约束 | not null |
唯一约束 | unique |
默认约束 | default 默认值 |
外键约束 | constraint foregin key(外键列名) references 主表(主键) |
检查约束 | mysql 不支持 |
5.1 主键
添加主键:
在创建表的时候:在表字段后面加上primary key即可
创建好之后再添加主键:
alter table 数据表 add primary key(表字段);
删除主键:
alter table 数据表 drop primary key;
主键的作用:
记录的唯一标识
主键的特点:
非空且唯一,就相当于 not null + unique
5.2 唯一约束、非空约束和默认约束
其实这三个没什么好说的,需要记住就是单词,至于作用,他都告诉你了。
约束 | 格式 |
---|---|
唯一约束 | 创建数据库的时候,在表字段的后面添加unique(注意,null是无值,所以不存在重复) |
非空约束 | 创建数据库的时候,在表字段的后面添加 not null |
默认约束 | 创建数据库的时候,在表字段的后面添加 default 要设定的默认值 |
5.3 外键约束
没有外键存在的问题:
员工表内有部门和地区信息,由于人数众多,数据信息冗余;
解决方案:
将重复数据抽取到一张部门表中;但还是有问题,因为两张表中的部门id没有关系,所有员工表中有可能出现无意义不存在的数值,所以需要引入外键;
什么是外键约束:
一张表的某一列引用另一张表的主键列的值
主表:约束其他的表
副表(从表):被其他表约束的表
约束语法:
constraint foreign key(外键列名) references (主键列名);
外键相关语法:
作用 | 语法 |
---|---|
查询外键名字 | show create table 表名; |
在表存在的时候添加外键 | CONSTRAINT 外键名 FOREIGN KEY (副表字段) REFERENCES 主表(字段名) |
删除外键 | alter table 表名 drop foreign key 外键名; |
创建表的时候添加外键 | alter table 表名 add constraint foreign key (副表字段) references 主表(字段名); |
外键的级联操作:
由于创建外键之后,主表主键的更新、修改、删除操作都不被允许,所以需要添加级联操作来解放一些操作。
级联操作就是让主表发生变化之后,副表根据规则发生改变。
而一般也是修改副表的级联操作即可,主表不需要修改。
级联操作分类 | 语法 |
---|---|
删除时 | on delete casede |
修改时 | on update casede |
拓展:自增长和零填充
这两个都是只能用于整数类型的字段上的;
自增长:
在表字段后面添加 aotu_increment即可,添加数据的时候可以指定这个数据也可以不指定,不指定就自增。
要注意,使用delete删除之后,不会重置自增长的数值,而truncate会重置自增长,自增长默认第一个数是1;
零填充:
其实就对于限定长度的数据的空白处填充0,为了数据格式更好看
只需要在表字段的后面添加zerofill即可;