虽然现在已经大三了,但还是小白一枚,希望通过这种方式督促自己学习。以后会坚持整理自己学习的东西,如果有不正确的地方,还望大佬指正。
一、数据库简介
数据库本质是文件,用于实现数据的永久保存。可分为关系型数据库(如SQL)与非关系型数据库(如NOSQL)。
数据库的发展经历了如下过程:
- 1970年,IBM公司的一个研究室发表了一种研究存储数据与数据之间的关系的方式,可将数据存储在表格中,表格之间的联系记录着某种关系。
- 1974年,IBM公司的一个研究室研制出一套规范语言:SEQUEL(Structured English QUEry Language)
- 1976年,SEQUEL/2发布新版本
- 1980年,SQL(Structured Query Language)
- 1989年,国际标准化组织(ISO)颁布SQL标准(SQL89标准),现在很多数据库厂商仍在遵循这套规范
比较有名的数据库厂商及其产品:
- IBM公司:DB2数据库
- 微软公司:SQLServer数据库、Access数据库(Office办公软件)
- Oracle公司:Oracle数据库
二、MySQL
全称Structured Query Language(结构化查询语言),关键字不区分大小写。
分类:
- DDL(Data Definition Language)数据定义语言,用来创建、删除、修改数据库中的对象。
- DML(Data Manipulation Language)数据库操作语言,用来操作数据库表格中的具体数据。包括读(select)与写(insert、delete、update)。其中又包含DQL(Data Query Language)数据查询语言,包括条件查询(where),分组(group by),条件(having),排序(order by)
- DCL(Data Control Language)数据控制语言,控制用户权限,SYSDBA是数据库管理员,授权grant 权限 to 用户,回收revoke 权限 from 用户
- TPL(Transcation Process Language)事务处理语言,用来解决多线程访问同一个资源时带来的安全问题,包括begin trancastion,commit(提交),rollback(回滚),save point(保存还原点)。
三、DDL(数据定义语言)
1、创建数据库
create database 数据库名;
create database study;
2、创建数据表
create table 表格名(
列名 数据类型(长度),
……
);
use study; //选择使用的数据库
create table student(
id int primary key auto_increment, //主键是int型在sql里可设置主键自增
name varchar(10),
no varchar(10)
)CHARACTER set=utf8; //设置编码为utf-8
数据库中的数据类型(按照存储数据的方式)
- 数值型:整型(tinyint、smallint、mediumint、int、bogint),浮点型(float 、double、decimal、numeric)
- 字符串:char、varchar、variable
- 日期/时间:date、time、datetime(日期&时间)、timestamp(时间戳)
3、修改表格
- 修改表名
alter table 原表名 rename [to] 新表名;
//将原表名student改为newStudent
alter table student rename to newStudent;
- 修改原有列(列名、数据类型、长度等)
alter table 原表名 change 原列名 新列名 新类型 新长度;
//修改表中no列列名为sno,数据类型为int,长度为8个字节
alter table student change no sno int(8);
- 新增一个列
alter table 原表名 add 新列名 新类型 新长度;
//新增一列type,数据类型为varchar,长度为10个字节
alter table student add type varchar(10);
- 删除一个列
alter table 原表名 drop 原列名;
//删除表中type列
alter table student drop type;
4、删除数据表、数据库
drop table 表格名字;
drop database 数据库名字;
//删除student表
drop table student;
//删除study数据库
drop database study;
四、DML(数据操作语言)
1、新增记录
insert into 表名 (列名,列名,列名) values(值,值,值);
//设置了主键自增可以不给主键那一项赋值
insert into student(name,no) values ('光颜','0001');
//如果表格每一列都赋值,可以简写为
insert into student values('光颜','0001');
2、删除记录
delete from 表名 [where....];
//删除id为1的一列
delete from student where id=1;
3、修改记录
update 表名 set 列=值,列=值 [where...];
//修改id为1的一列name值为gy
update student set name = 'gy' where id = 1;
4、查询记录
select 列名,列名,列名 from 表名 [where ...];
//查询id为1的列的name值
select name from student where id=1;
//查询整张表
select * from student;
注意:
查询所有列可以用*代替,但这样会影响查询性能,所以还是写上列比较好!
五、DQL(数据查询语言)
1、where(条件查询)
除insert之外,delete、update、update、select都可以做条件筛选
具体用法:
- 后面跟比较运算符(> >= < <= != =)
//查询student表中no大于2的所有列
select * form student where no > 2;
- 后面跟算术运算符(+ - * /)
//将student表中no都+2
select * form student where no + 2;
- 后面跟逻辑运算符号(and or not,如果and和or同时出现 and优先级别更高)
//查询student表中name='光颜'并且no=1的列
select * form student where name='光颜' and no=1;
//查询student表中name='光颜'或者no》1的列
select * form student where name='光颜' or no>1;
//查询student表中name='光颜',no=1的列
select * form student where name='光颜' and no=1;
- 后面跟[not ] between and
//查询student表中no在1,10之间的列
select * form student where no between 1 and 10;
- 后面跟[not] in
//查询student表中no不在1,10之间的列
select * form student where no not in(1,10);
- 后面跟like(% 用来代替0-n个字符;_ 用来代替1个字符)
//模糊查询student表中name为'光_'
select * form student where name like '光%';
//模糊查询student表中name为'_颜_'
select * form student where name like '_颜%';
2、排序
order by 列
升序排列 asc 默认就是升序 可以省略不写
降序排列 desc
//按学号升序排列
select * form student order by no (asc);
//按学号降序排列
select * form student order by no desc;
3、MySQL函数
按函数功能分类:
- 比较类函数
isnull(值); 是空值反1 不是空值返回0
- 数学函数(数值函数)
abs绝对值 floor向下取整 mod(5,2)取余数 pow求次方 round()
- 日期和时间
now(); year(date); month() day week
- 控制流程函数(转换函数)
if(条件,值1,值2);
ifnull(值,v);
- 字符串函数
length(str)、concat()、substr()、instr(str,'a')、replace()、upper()、lower()、ltrim()、 rtrim()、lpad() 、rpad()、reverse()
4、分组函数
- distinct(去重复)
如果有一样的列信息, 将一样的信息合并,这样行数会减少 ,查询的每一个列,行数个数需要一致;
如果有两个以上的列,将两个或多个列的组合当做整体, 如果整体有一样的信息,则才会去重复 否则就全部显示。
- 分组函数
count() max() min() avg() sum()
- 分组条件
group by 列
//按学号分组查询每个学号对应的学生人数
select no,count(id) form student group by no;
注意:
如果SQL语句中一旦搭配了分组条件,能展示的信息只有两种:分组条件、分组函数