数据库概念
数据库(DataBase),简称DB,按照某一特定数据结构来组织,存储数据的仓库。
数据库管理系统(DataBase Management System),简称DBMS.是为了建立,操作和维护数据库而设计的一个程序。
介于用户和数据库之间。
PS: 使用SQL语言,通过DBMS来管理DB。
早期比较流行的数据库模型有三种,分别为层次式数据库、网络式数据库和关系型数据库。而在当今的互联网中,最常用的数据库模型主要是两种,即关系型数据库和非关系型数据库。
关系型数据库
(1)关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。
所谓的关系,指的就是表,或者表与表之间。关系模型,就是表的行与列。
(2)常用的关系型数据库:
大型:Oracle--甲骨文(Oracle)公司的产品
SqlServer--Microsoft旗下的产品
DB2--IBM旗下的产品
小型:Access--MicroSoft旗下的产品
Mysql--目前是甲骨文旗下的产品
非关系型数据库
1、NOSQL不是否定关系数据库,而是作为关系数据库的一个重要补充
2、NOSQL为了高性能、高并发而生,忽略影响高性能,高并发的功能
3、NOSQL典型产品memcached (纯内存),redis(持久化缓存),mongodb(文档的数据库)非关系型数据库分类主要有:
1、键值(Key-Value)存储数据库
典型产品:Memcached、Redis、MemcacheDB、BerkeleyDB
2、列存储(Column-oriedted)数据库
这部分数据库通常用来分布式存储的海量数据,键仍然存在,但是他们的特点是指向了多个列。
典型产品:Cassandra,HBase3、面向文档(Document-Oriented)数据库
面向文档数据库会将以文档的形式存储。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关系对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储
典型产品:MorgoDB、CouchDB
4、图形(Graph)数据库
Mysql
Mysql是一个关系型数据库,最开始是瑞典的MysqlAB公司的产品,后来被Sun公司收购,在2009年4月20号Sun公司被Oracle收购。
Mysql特点
--mysql是开源的,不会产生额外的费用。
--mysql支持大型数据库,比如可以管理上千万条记录的数据库。
--mysql支持多操作系统,支持多语言连接:C,C++,java,PHP....
--mysql成本比较小,相比较Oracle和DB2。
Mysql的连接和使用
连接方式:
(1)使用命令提示符界面(保证环境变量配置成功)
第一步:输入命令+参数,发送请求连接
mysql -u username -p 回车
enter password: ......
第二步:创建数据库
create database bd1802 default character set utf8;
第三步:选择数据库
use bd1802
(2)使用客户端连接:(选择sqldeveloper).
第一步:配置第三方jdbc驱动程序
工具->首选项->数据库->第三方驱动程序->添加条目->选中你的jar包->确定
第二步:新建连接
连接名:随便起,就是一个连接昵称而已
用户名:使用什么用户进行连接
密码:.....
主机名: 数据库所在的主机IP
端口号:3306
选择数据库:如 bd1802
表(Table)
表是关系型数据库的基本存储结构。
1)表是二维数据结构,有行和列
2)行(Row)是横排数据,也叫记录(Recond)
3)列(Column)是竖排数据,也叫字段(Field)
4)行与列的交叉点是 字段值
5)表与表之间也存在关系
数据库支持的数据类型
MySQL支持多种类型,大致可以分为三类:
数值、日期/时间和字符串(字符)类型
数值类型:
类型
大小
范围(有符号)
用途
TINYINT
1 字节
(-128,127)
小整数值
SMALLINT
2 字节
(-32 768,32 767)
大整数值
MEDIUMINT
3 字节
(-8 388 608,8 388 607)
大整数值
INT或INTEGER
4 字节
(-2 147 483 648,2 147 483 647)
大整数值
BIGINT
8 字节
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)
极大整数值
FLOAT
4 字节
单精度
浮点数值
DOUBLE
8 字节
双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值
日期和时间类型:
类型
大小(字节)范围
格式
用途
DATE
3
1000-01-01/9999-12-31YYYY-MM-DD
日期值
TIME
3
'-838:59:59'/'838:59:59' HH:MM:SS
时间值或持续时间
YEAR
1
1901/2155
YYYY 年份值
DATETIME
8
1000-01-01 00:00:00/9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
混合日期和时间值
TIMESTAMP
8
1970-01-01 00:00:00/2037
YYYYMMDD HHMMSS
混合日期和时间值,时间戳
字符串类型:
类型
大小
用途
CHAR
0-255字节
定长字符串char(10)
VARCHAR
0-65535字节
变长字符串
TINYBLOB
0-255字节
不超过 255 个字符的二进制字符串
TINYTEXT
0-255字节
短文本字符串
BLOB
0-65535字节
二进制形式的长文本数据
TEXT
0-65535字节
长文本数据
MEDIUMBLOB
0-16777215字节
二进制形式的中等长度文本数据
MEDIUMTEXT
0-16777215字节
中等长度文本数据
LONGBLOB
0-4294967295字节
二进制形式的极大文本数据
LONGTEXT
0-4294967295字节
极大文本数据
结构化查询语言(SQL)
结构化查询语言(Structured Query Language),简称SQL,是数据库的标准查询语言。可以通过DBMS对数据库进行定义数据,操纵数据查询数据,数据控制等
SQL可以分为:
1)数据定义语言(DDL):Data dafinitaon Language
创建表 create 删除表 drop 修改表 alter 清空表 truncate彻底清空,无法找回 2)数据操纵语言(DML):Data Manipulation Language
插入数据 insert 删除数据 delete 修改数据 update 3)事务控制语言(TCL):Transation Control Language
4)数据查询语言(DQL):Data Query Language
select: select * from tableName
5)数据控制语言(DCL):Data Control Language
SQL语言之DDL:数据定义语言
建表语句 | create table tableName(colName Type1,colName Type2......); |
显示表结构 | desc tableName |
追加新字段 | alter table tableName add (colName Type); |
删除表字段 | alter table tableName drop colName; |
修改表字段类型 | alter table tableName modify colName newType; |
修改表字段名称 | alter table tableName change oldColName newColName newType; |
修改表名 | alter table tableName change oldColName newColName newType; |
清空表结构 | truncate table tableName; |
删除表对象 | drop table tableName |
删除数据库 | drop database databaseName; |
创建数据库 | create database databaseName default character set character |
SQL语言之DML:数据操纵语言
插入数据 | insert into tableName values(value1,value2,...);必须按照建表字段顺序赋值 |
insert into tableName(colName1,colName2,....) values(value1,value2,...);给指定字段赋值 | |
删除表中的数据 | delete from tableName [where 条件] |
修改表中的数据 | update tableName set colName1 = value1[,colName2=value2] [where 条件] |
DDL语言都有关键字 table, DML语言直接写表名,没有table关键字。 |
SQL语言之DQL:数据查询语言
基本查询
|
select:选择 | 可以指定字段进行查询:select colName[,colName.....] from tableName |
查询整张表:select * from tableName 通配符*:如果是在select字句中,代替的是所有的字段 |
||
给查询显示的列起别名 | select ename [as] "员工姓名"[,colName as nickName....] from tableName tableNickName | |
条件控制 |
条件查询 where子句:Select colName from tableName where 条件 |
|
模糊查询 like关键字:colName like value; 通常与通配符%连用 %:0或0个以上的字符 _:匹配一个字符 |
||
排序 |
升序 | ASC升序,默认不写时是ASC |
降序 | DESC降序 | |
使用多列作为排序条件 |
使用order by子句 | |
去重 |
distinct 位置:紧跟着select关键字,必须写在select后 |
|
聚合函数 |
count(Field):统计指定字段的记录数 sum(Field):统计指定字段的和 avg(Field):统计指定字段的平均值 max(Field):返回指定字段中的最大值 min(Field):返回指定字段中的最小值 PS:聚合函数不对null值进行处理,会直接忽略。 因此有时候需要使用函数:ifnull() 函数ifnull(field,value) 逻辑:如果field字段对应的值不是null,就使用field值,如果是null,就使用value |
|
分组查询 |
group by Field1[,Field2] select..from talbeName [where 条件][group by 子句][order by 子句] 注意:在分组查询时,select子句中的字段,除了聚合函数外,只能写分组字段。 多字段分组时: field1,field2 10 500 20 600 30 700 注意:多字段分组时,最多分组的数目为Field1*Field2*[Field3……] |
|
分组查询的再次过滤 | having子句 在分组查询时,有的时候可能需要再次使用条件进行过滤,这个时候不能使用where子句,应该使用 having子句,having子句后可以使用聚合函数。 位置:位于group by 子句后 如果有分组,排序,having格式:group by..having..order by |
select
练习1:查询员工表emp中的 员工姓名,员工职位,员工入职日期和员工所在部门。
select ename,job,hiredate,deptno from emp;
练习2:查询部门表中的所有信息
select * from dept;
select deptno,dname,loc from dept;
- where子句
练习1:查询员工表中部门号为10和20的员工的编号,姓名,职位,工资
select empno,ename,job,sal from emp where deptno=10 or deptno =20;
练习2:查询员工表中部门号不是10和20的员工的所有信息。
select * from emp where deptno<>10 and deptno<>20;
- --集合作为条件写法:in|not in (集合元素,使用逗号分开);
-- 注意:同一个字段有多个值的情况下使用。
-- in 相当于 or
-- not in 相当于 and
select empno,ename,job,sal from emp where deptno in(10,20);
select * from emp where deptno not in (10,20);
模糊查询
--练习1:查询员工姓名第二个字母为a或A的员工信息。
insert into emp (empno,ename,deptno) values(9000,'james',40);
select ename,job,sal,comm,deptno from emp where ename like '_A%';
--练习2:查询员工姓名中有a和s的员工信息。
select ename,job,sal,comm,deptno from emp where ename like '%a%' and ename like '%s%';
select ename,job,sal,comm,deptno from emp where ename like '%a%s%' or ename like '%s%a%'
--范围查询:colName between val1 and val2
--练习1:查询工资大于等于1500并且小于等于2500的员工的所有信息。
select * from emp where sal>=1500 and sal<=2500;
--练习2:查询工资小于2000和工资大于2500的所有员工信息。
select * from emp where sal<2000 or sal>2500;
--修改上述两个练习
select * from emp where sal between 1500 and 2500;
select * from emp where sal not between 1500 and 2500;
--mysql排序
--练习1:查询员工表中的所有信息,按照部门号升序排序
--练习2:查询员工的编号,姓名,工资,奖金,部门号,按照部门号降序排序,员工编号升序.
select * from emp;
select * from emp order by deptno ASC;
select empno,ename,sal,comn,deptno from emp order by deptno DESC,empno ASC;
--练习3:查询30号部门的员工的姓名,工资,部门号,按照工资降序排序
select ename ,sal,deptno from emp where deptno = 30 order by sal DESC;
--去重:
--练习:查看员工表中有哪些部门号;
select job from emp;
select distinct job from emp;
--练习:查看员工表中有几种奖金
select distinct comn from ;
select distinct job,comn from emp;
--having子句:
--练习:查询部门的平均工资大于2000的部门的部门号,平均工资,最高工资,最低工资和工资之和
select deptno, avg(ifnull(sal,0)),max(sal),min(sal),sum(sal) from emp
group by deptno having avg(ifnull(sal,0))>2000 order by deptno ASC;
子句总结
一个基本的查询语句包含的子句有:
select子句
from 子句
where子句
group by 子句
having 子句
order by 子句
一个完整的查询语句:
select..from..[where ..][group by..][having..][order by..]
执行顺序:
先执行from子句
再执行where子句
然后group by子句
再次having子句
之后select子句
最后order by子句
SQL语言之TCL:事务控制语言
有时我们可能需要使用DML进行批量数据的删除,修改,增加。比如在一个员工系统中,我们想删除一个人的信息,除了删除这个人的基本信息外,还应该删除与此人有关的其他信息,如公司的邮箱,地址等等。那么从开始执行到结束就会构成一个事务。
对于事务,我们要保证事务的完整性。要么成功,要么撤回。
一般情况下事务要符合四个条件(ACID):
原子性(Atomicity):事务要么成功,要么撤回,不可切割性。
一致性(Consistency): 事务开始前和结束后,要保证数据的一致性。
隔离性(Isolation):当涉及到多用户操作同一张表时,数据库会为每一个用户开启一个事务。那么当其中一个事务正在
进行时,其他事务应该处于等待状态。保证事务之间不会受影响。
持久性(Durability):当一个事务被提交后,我们要保证数据库里的数据是永久改变的,即使数据库崩溃了,我们也要保证
事务的完整性。
commit:提交
rollback:撤回,回滚。
savepoint:保存点
事务:只有DML操作会触发一个事务
存储引擎[ENGINE]:就是指表类型。
当存储引擎为innodb时,才支持事务。
--一般安装的是使用innodb引擎
有一个默认的存储引擎为Myisam,不支持事务。
事务的验证:
第一步:start transaction
第二步:savepoint 保存点名称。
第三步:DML
第四步:commit/rollback
SQL之DCL:数据控制语言
作用是用来创建用户,给用户授权,撤销权限,删除用户
create user
great
revoke
drop user
格式:
1:创建用户
create user username@ip identified by newpassword
2:显示用户的权限
show grants for username@ip;
3:授权
grant 权限1,权限2...on 用户名.* to username@ip
DML权限:insert,delete,update
DQL权限:select
DDL权限:create,alter,drop...
4:撤销权限
revoke 权限1,权限2..on 数据库名.* from username@ip
5:删除用户
drop user username;
使权限立即生效:
flush privileges;
===============================================================================
--DCL:数据控制语言
--练习1:创建一个用户 scott,密码 tiger
create user scott@localhost identified by '123456';
grant create,drop,alter,select on mysql.* to scott@localhost;
create table emp;