数据库的基本概念
数据库(DataBase):简称DB,用于存储和管理数据的仓库,我们使用了统一的方式操作数据库------SQL
MySQL的安装、卸载、配置
1、安装…
2、卸载:注意卸载完了看一下C/ProgramData目录下MySQL文件夹,这个也要删去。//这个文件夹可能隐藏起来,需要将隐藏目录显示
3、配置:服务启动 :两种方法 ① cmd—>services.msc打开服务窗口,找到MySQL启动
② 使用管理员权限打开cmd :启动MySQL就输入net start mysql
关闭就输入net stop mysql
环境变量的配置......(省略)
MySQL的登录 :mysql -uroot -p密码 // 这里的密码是自己设置的链接目标的密码
MySQL的退出: 输入exit或quit都可以。
SQL
1、什么是sql? Structured Query Language(结构化查询语言)
就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
2、通用语法:以分号结尾,不区分大小写,关键字建议使用大写表示。
单行注释:以“-- ”开头或者‘#’开头,--后面有个空格,#号后面可有可无空格。
多行注释:/* */和Java一样。
3、SQL的分类:
DDL (操作数据库和表) 关键字:create,drop,alter等。
DML (对数据进行增删改) 关键字:insert,delete,update等。
DQL (查询数据的记录) 关键字:select,where等。
DCL (定义权限) 关键字:GRANT,REVOKE等。
DDL:操作数据库,表
1、操作数据库:CRUD
① C (create) :创建
1、创建一个数据库:create database 数据库名称;
2、创建一个数据库,如果存在就不创建,不存在就创建:create database if exists 数据库名称;
3、创建数据库并指定字符集:create database 数据库名称 character set 字符集名;
4、练习一下:创建数据库db2,判断是否存在,并将字符集设置为gbk;
create database if exists db2 character set gbk;
② R(retrieve):查询
查询所有数据库的名称:show databases;
查询某个数据库的字符集:其实是查询某个数据库的创建语句:show create database 数据库名称;
③U(Update ):修改
修改数据库字符集:alter database 数据库名称 character set 字符集名称;
④D(Delete) :删除
删除数据库:drop database 数据库名称;
判断是否存在,存在就删除,不存在就不删除:Drop Database if exists 数据库名称;
⑤使用数据库:查询当前使用的数据库:select database();
使用数据库:use 数据库名称;
2、操作表:CRUD
① C (create) :创建
1、语法:create table 表名(
列名1 数据类型1,
列名2 数据类型2,
......
列名n 数据类型n //注意最后一列数据不要逗号;
);
数据类型:int: 整数类型
double:小数类型
data:日期,只包含年月日 yyyy-MM-dd
datatime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
timestamp:时间错类型,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
datatime和timestamp的区别在哪里呢?
当某一天我们又对某一条数据进行修改,那么timestamp的时间就会自动更新为当时的时间。
varchar:字符串
name varchar(10) 10的含义是姓名最大为10个字符串。
复制表:create table 表名 like 被复制的表名;
② R(retrieve):查询
查询某个数据库中所有表的名称:show tables;
查询表的结构:desc 表名; //desc(description的缩写,描述的意思)
③U(Update ):修改
1、修改表名
alter table 表名 rename to 新表名;
2、修改表的字符集
alter table 表名 character set 新字符类型;
3、添加一列
alter table 表名 add 列名 列的类型;
4、修改列名称、类型
alter table 表名 change 旧列名 新列名 新数据类型;
直接修改类型:alter table 表名 modify 列名 新数据类型;
5、删除列
alter table 表名 drop 列名;
④D(Delete) :删除
drop table 表名;
drop table if exists 表名;
客户端图形化工具:SQLyog下载
https://www.jianshu.com/p/46ea86e099d2
如果连接时遇到 错误码2058,请看:https://jingyan.baidu.com/article/7908e85cda0de1af481ad22c.html
DML:增删改表中数据
1、添加数据:
语法:insert into 表名(列名1,列名2...列名n) values(值1,值2,值n);
注意:列名和值要一一对应,如果不定义列名,则默认给所有列添加值。
除了数字,其他类型的值都要用引号引起来(单引号或者双引号都可以)。
如果有不想赋值的就赋null。
2、删除数据:
语法:delete from 表名 where 某一个自定义的条件;
注意:如果不加条件,就把表中所有记录都删除。(不建议使用,效率低)。
如果要删除所有数据,可以使用truncate table 表名;(建议使用,效率高)。
3、修改数据:
语法:update 表名 set 列名1 = 值1 , 列名2 = 值2 , 列名3 = 值3 , ......where 某个条件;
注意:如果不加where条件,会把表中的所有数据全部修改。
DQL:查询语句
现在有这么一个表,方便举例:
1、 语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的字段
oder by
排序
limit
分页限定
2、基础查询
查询所有字段:可以用 * 号,也可以一个一个打出来
select * from 表名;
查询某几个字段:
select name,age from 表名;
去除重复的字段:distinct
select distinct 列名 from 表名; //这儿如果有多个字段,那么只有当这些字段全部相等的时候才去重。
将两列的结果相加:如果有一个值为null,那么所加的结果就为null,这时候就需要用ifnull语句
ifnull(列名,被替换的值) 。如果某个字段的名称有点长了,或者不适合了,我们可以起别名,用as来起,也可以用空格。
math + ifnull(english,0) as 总分 或者math + ifnull(english,0) 总分
3、条件查询:
1、where子句后跟条件
2、运算符
>、<、>=、<=、=、<>、!= //在SQL中等于用一个等号表示,不等号可以用!=或<>都可以。
between and; 例:where age between 20 and 30;
&&可以写为and
||可以写成or where age = 18 or age = 19 or age = 20; 也可以写为where age in (18,19,20);
注意null值不能用等号不等号之类来判断用is null来判断,如果判断不是null可以写为is not null;
like 模糊查询
占位符:_ 占一个字符,% 任意多个字符。
例如:查询姓马的 :select * from 表名 where name like '马%';
查询包含马的:select * from 表名 where name like '%马%';
查询第二个字为化的:select * from 表名 where name = '_化%';
1、排序查询:
① 语法:order by 子句
select * from 表名 order by 排序字段1 排序方式1,排序字段2 排序方式2......;
② 排序方式:
ASC:升序(默认)
DESC: 降序
注意 :如果有多个排序条件,那么当前面的排序条件值一样时才会判断第二个排序条件。
2、聚合函数:将一列数据作为一个整体,进行纵向的计算。
① count 计算个数
举个例子:select count(要计算的那列名称) from 所在的表;
注意:聚合函数的计算,排除null值。
这里如果让它不排除null值,可以有下面这几种写法:
1、select count(ifnull(要查找的那列名称,0)) from 所在的表;
意思是将某一列的null换成0来计算那列的个数,但是被计算的那列的本身null值不变。
2、select count(*) from 所在的表;
这个意思是这个表中的所有列,只要有一行不为空,就按不为空计算。
3、使用主键那一列来查找。
② max 计算最大值
select max(要计算的那一列) from 所在的表;
③ min 计算最小值
select min(要计算的那一列) from 所在的表;
④ sum 计算和
select sum(要计算的那一列) from 所在的表;
⑤ avg 计算平均值
select avg(要计算的那一列) from 所在的表;
3、分组查询:
1、语法:group by 分组字段;
用上图举例:select sex ,avg(math),count(id) from 表名 group by sex;
如果想在分组之前进行一次筛选操作,可以增加一些条件where 例如:
select sex ,avg(math),count(id) from 表名 where math > 70 group by sex;
如果对于显示出的数据,再做某些删选,比如分组之后只显示人数大于2的,可以添加having 例如:
select sex ,avg(math),count(id) from 表名 where math > 70 group by sex having count(id) > 2;
where和having的区别:
where:在分组前进行限定
having:在分组之后进行限定,如果不满足结果,就不会被查询出来。
where后不能跟聚合函数,having可以跟聚合函数
4、分页查询:
1、语法:limit 开始的索引,每页查询的条数:
开始的索引 = (当前页码 - 1) * 每页显示的条数;
举个例子:select * from 表名 limit 0,3; -- 第一页
2、limit是MySQL的方言,用来分页的。
约束:
概念:对表中的数据进行限制,保证数据的正确性,有效性和完整性。
分类:
1、主键约束:primary key
2、非空约束:not null
3、唯一约束:unique
4、外键约束:foreign key
非空约束:not null
创建表时添加约束:
create table student(
id int,
name varchar(20) not null//后面加了一句 not null,这时候如果再添加数据name的时候就不可以添加为null了。
);
删除非空约束:就是修改所要修改的数据的字段,alter table student modify name varchar(20);
创建表后添加非空约束:修改索要修改的数据字段,alter table student modify name varchar(20) not null;
唯一约束:unique:
创建唯一约束
create table student(
id int,
name varchar(20) unique //添加唯一约束,注意null值可以有多个
);
删除唯一约束: //注意不能像非空那样来删除唯一约束。而是按照下面这个方式。
alter table student drop index name;
在创建表后添加唯一约束:
alter table student modify name varchar(20) unique;
主键约束:primary key
1、注意:
① 非空且唯一
② 一张表只有一个字段为主键
③ 主键是表中记录的唯一标识
2、创建表时添加主键约束
create table student(
id int primary key , //设为主键
name varchar(20)
);
3、删除主键: //主键的删除也不能像非空那样来删,应按照下面这个方式来删。
alter table student drop primary key;
4、创建完表后添加主键
alter table student modify id int primary key;
5、自动增长
概念:如果某一列是数值类型,使用auto_increment 可以来完成值自动增长
create table student(
id int primary key auto_increment, //设为主键,并使其自动增值。注意auto后的值只与上一次值有关,下一 //次的值为上一次值+1
name varchar(20)
);
6、删除自动增长
alter table student modify id int;
7、增加自动增长
alter table student modify id int auto_increment;
外键约束:foreign key,让表与表产生关系,从而保证数据的正确性。
1、在创建表时添加约束
create table 表名(
......
外键列,
constraint 外键名称(这个名称是自己起的) foreign key 外键列名称 references 主表名称(主表列名称)
);
2、删除外键
alter table 表名 drop foreign key
3、创建表后添加外键
alter table 表名 add constraint 外键名称(名称自起) foreign key 外键列名称 references 主表名称(主表列名称)
4、级联操作
如果某列被添加了外键,那么这两列数据就被关联,对其中一个表的操作会反映到另一个表中。
1、添加级联操作:
alter table 表名 add constraint 外键名称(名称自起) foreign key 外键列名称
references 主表名称(主表列名称) on update cascade on delete casecade;
2、分类:
级联的更新:on update cascade
级联的删除:on delete casecade
数据库的设计:
1、多表之间的关系
① 分类
一对一关系:一一对应
一对多(多对一) :
如部门和员工,一个部门可以有多个员工,一个员工只能对应一个部门
多对多:
一个学生可以选择多门课程,一个课程也可以被多个学生选择
② 实现方式
一对多:在多的一方建立外键来指向一的地方的主键
多对多:需要借助第三张中间表
新建一个中间表,最少有两个字段,这两个字段分别是其他两个表的主键,并且这两个字段作为中间表的外键,分 别指向两张表的主键。primary key(id1,id2)
一对一:在任意一方添加外键,指向另一方的主键,但要让这个外键唯一,加一个唯一约束。正常情况不会有一对一,直 接放在后面就好了,不需要麻烦。
2、数据库设计的范式
概念:设计数据库时需要遵循的规范
分类:
第一范式:
第二范式:在第一范式的基础上,让所有的非主属性完全依赖于主码
1、函数依赖:A-->B 如果通过A属性(属性组)的值可以唯一确定B属性的值,则称B依赖于A
比如学号-->姓名 (学号,课程名称)-->分数
2、完全函数依赖:A-->B
如果A是一个属性组,则B属性值的确定需要依赖于A属性中的所有属性值
例如:(学号,课程名称)-->分数
3、部分函数依赖: 如果A是一个属性组,则B属性值的确定需要依赖于A属性中的某些个属性值
例如:(学号,课程名称)-->姓名
4、传递函数依赖:若A-->B , B-->C 则A-->C
5、码:一个属性(属性组)在该表中被其他属性完全依赖
主属性:码属性组中的所有属性
非主属性:除了主属性中的属性
第三范式:在第二范式的基础上 任何非主属性不依赖于其他非主属性(消除传递依赖)
补充:sql的select语句执行顺序
SELECT 语句的执行顺序
1. from语句
2. where语句(结合条件)
3. start with语句
4. connect by语句
5. where语句
6. group by语句
7. having语句
8. model语句
9. select语句
10. union、minus、intersect等集合演算演算
11. order by语句