数据库简介
- IO流数据存储弊端
- 效率低
- 存取都麻烦
- 一般只能保存小量数据
- 只能保存文本数据
什么是DB
- Database:数据库
- 数据库本质上就是一个文件集合 数据库就是存储数据的仓库,本质上是一个文件系统,数据会按照特定的格式保存到文件中,用户可以对数据库中的数据进行增删改查操作
什么是DBMS
- Database Management System: 数据库管理系统
- DBMS就是管理数据库文件的软件
- 常见的DBMS有: MySQL、oracle、sqlserver、DB2、Sqlite
DBMS是指一种管理数据库的大型软件,用于创建、管理、维护数据库文件,对数据库文件进行统一的管理和控制,用户通过数据库管理系统
访问数据库中的数据
数据库软件的分类
- 关系型数据库: 经过数学理论验证,可以将现实生活中任意关系保存关系型数据库中,关系型数据库中以表为存储单位
- 非关系型数据库: 用来解决一些特定场景,比如解决缓存问题,解决高并发问题 Redis数据库(以键值对的形式保存数据)
主流关系型数据库介绍
- MySQL: 08年被Sun收购 09年Sun被Oracle收购,开源 ,由于被Oracle收购后性能大幅提升导致MySQL用户量大增,Oracle用户减少,公司计划把MySQL闭源,原MySQL程序员离开Oracle公司,创建了MariaDB数据库(Maria是公司老板的女儿名字) 市场排占有率第一
- Oracle: Oracle公司,最贵,性能最高,市场占有率排第二,闭源,拉里艾莉森32
- SQLServer:微软公司,闭源,市场占有率第三,主要应用在.net开发的网站中
- DB2:IBM公司产品,闭源
- sqlite:轻量级数据库 只有几十k,应用在嵌入式设备中(包括移动设备)
开源和闭源
- 开源:开放源代码 免费,盈利方式靠卖服务 用户多,有大牛程序员会无偿的维护和升级
- 闭源:源代码私有 盈利方式靠卖软件+服务 来钱快,会有大牛们攻击,但是公司内部会花钱雇人维护升级
安装数据库软件
- 端口号使用默认的3306
- 字符编码选择utf8
什么是SQL
- Structured(结构化) Query(查询) Language(语言):结构化查询语言
- 用于用户和数据库软件(DBMS)交流的语言,不管是增删还是改查都需要使用SQL语言和DBMS交流
- SQL是写在客户端中或Java代码中,发送给DBMS,由DBMS解析执行
数据库服务器
- 服务器是高配置的电脑
- 数据库服务器就是在电脑上安装了DBMS
- DBMS(mysql) 具备网络访问能力
如何连接MySQL数据库 Linux下打开终端 Windows里面打开命令行
- 在终端或命令行中输入 mysql -uroot -p 然后回车 ,有密码的写密码 如果没有密码的直接敲回车
- 退出命令 exit
SQL规范
- 以;结尾
- 关键字之间要有空格 可以有多个空格
- SQL语句中可以1个或多个换行
- 关键字不区分大小写
show databases;
create database db1;
drop database db1;
show create database db1;
create database db1 character set utf8/gbk;
use db1;
create table t1(id int,name varchar(10));
show tables;
drop table t1;
show create table t1;
create table t1(id int) engine=myisam/innodb charset=utf8/gbk;
desc t1;
修改表名 rename table t1 to t2;
alter table t1 engine=myisam/innodb charset=utf8/gbk;
alter table t1 add age int first/(after xxx)
alter table t1 drop age;
alter table t1 change age abc int;
alter table t1 modify age int first/(after xxx);
insert into t1 values(值1,值2),(值1,值2),(值1,值2)
insert into t1 (字段名1,字段名2) values (值1,值2),(值1,值2);
select * from t1; select name from t1;
select name,age from t1 where id<100;
update t1 set age=100 where id=10;
delete from t1 where id<10;
什么是主键:表示表中数据唯一性的字段称之为主键(主键只有一个)
什么是约束: 约束就是创建表的时候给表中字段添加的限制条件
主键约束:添加了主键约束的字段,保存的数值必须唯一而且非空
create table t1(id int primary key,name varchar(10));
insert into t1 values(1,'刘备');
insert into t1 values(1,'张飞');
insert into t1 values(null,'关羽');
create table t2(id int primary key auto_increment,name varchar(10));
insert into t2 values(null,'关羽');
insert into t2 values(null,'悟空');
insert into t2 values(10,'八戒');
insert into t2 values(null,'沙僧');
delete from t2 where id>5;
insert into t2 values(null,'二郎神');
- 自增的特点:
- 值为null时会自动赋值
- 以表中曾出现的最大值基础上+1;
- 删除数据自增值不减
- delete清空表 自增数值不变
drop+create truncate table t2;
由于表设计不够合理,出现大量的重复数据,称为数据冗余。可以通过拆分表的形式,把可能重复的数据保存到一张新的表中,在原表中只需要通过一个id建立关系即可。这种建立关系的字段称之为外键。
create table item(id int primary key auto_increment,name varchar(10),price int,num int,category_id int);
create table category(id int primary key auto_increment,name varchar(10), parent_id int);
- 以上表中插入数据:
一、电器分类下的电视机分类下的康佳电视价格4480,库存38
二、第二条数据 鞋分类下的男鞋分类下的男运动鞋分类下的耐克运动鞋价格380,库存99
insert into category values(null,'电器',null);
insert into category values(null,'电视机',1);
insert into item values(null,'康佳电视',4480,38,2);
insert into category values(null,'鞋',null);
insert into category values(null,'男鞋',3);
insert into category values(null,'男运动鞋',4);
insert into item values(null,'耐克运动鞋',380,99,5);
create table dept(id int primary key auto_increment,name varchar(10),parent_id int);
insert into dept values(null,'集团总部',null);
insert into dept values(null,'教学部',1);
insert into dept values(null,'Java教研部',2);
insert into dept values(null,'销售部',1);
insert into dept values(null,'销售A部',4);
create table emp(id int primary key auto_increment,name varchar(10),sal int,age int,dept_id int);
insert into emp values(null,'苍老师',200,18,3),(null,'李白',50,28,5);
什么是事务:事务是数据库中执行sql语句的最小工作单元,把多条sql语句放在事务中可以保证多条sql要么全部成功,要么全部失败。
create table person(id int primary key auto_increment,name varchar(10),money int);
insert into person values(null,'超人',200),(null,'钢铁侠',1000);
show variables like '%autocommit%';
set autocommit=0;
set autocommit=0;
update person set money=500 where id=1;
use db2;
查询数据select * from person;
(数据库中的数据此时并没有修改)300 update person set money=700 where id=2;
(当前窗口查询数据时因为查询的是内存中的数据,所以数据变了,但是此时去第二个窗口查看数据库中的数据并没有发生改变)commit;
此时会把内存中的多次SQL在内存中的执行结果 同时提交到数据库中(此时两个终端全部发生改变)select * from emp where comm is null;
select * from emp where mgr is null;
select * from emp where comm is not null;
select ename as '姓名' from emp;
select ename '姓名' from emp;
select ename 姓名 from emp;
select distinct job from emp;
emp
:comm奖金、job工作职位、sal工资、mgr领导编号、deptno部门编号t_item
:price单价、num库存select ename,sal from emp where sal<=1600;
select ename,job,deptno from emp where deptno=20;
select ename,job from emp where job='manager';
select ename,deptno from emp where deptno!=10;
select ename,deptno from emp where deptno<>10;
select title,price from t_item where price=23;
select * from t_item where price!=8443;
and
和java中的&&效果一样or
和java中的||效果一样select * from emp where deptno!=10 and sal<3000;
select ename,job,mgr,deptno from emp where deptno=30 or mgr=7698;
select * from emp where sal=5000 or sal=1500 or sal=3000;
select * from emp where sal in (5000,1500,3000);
select * from emp where sal>=2000 and sal<=4000;
select * from emp where sal between 2000 and 4000;
- 举例
- 包含字符a:%a%
- 以a开头:a%
- 以a结尾:%a
- 第二个字符是a:_a%
- 倒数第三个字符是a:%a__
- 第二个字符是a 最后一个字符是b:_a%b
select title from t_item where title like '%笔记本%';
select * from t_item where price between 50 and 200 and title like '%得力%';
select * from t_item
where image is not null and title like '%得力%';
select * from t_item
where title not like '%得力%';
select * from t_item
where sell_point like '%赠%';
select name,money from person where money>5000 order by money asc/desc;
limit x,y
x代表跳过的条数 y代表查询的条数(每页的条数)
limit,写在最后
举例1:查询第一页的10条数据limit 0,10
举例2:查询第五页的8条数据limit 32,8
举例3:查询第三页每页3条数据limit (3-1)*3,3
查询所有商品的价格,价格升序,显示第二页,每页7条数据
select price from t_item order by price limit 7,7;
select * from emp order by sal desc limit 0,3;
select * from emp where deptno=20 order by sal desc limit 0,1;
select title,price from t_item where title like '%dell%' order by price limit 0,1;
select 'helloworld';
select now();
select curdate();
select curtime();
select date(now());
select time(now());
select extract(year from now());
select extract(month from now());
select extract(day from now());
select extract(hour from now());
select extract(minute from now());
select extract(second from now());