##database
之前使用的流操作把数据存到txt文档中,对于修改插入等,首先代码繁琐,对于查询操作效率极低,另外,如果数据很大,不可能长期保存在文件中。
为了解决上述问题,我们需要使用数据库。



-DB:文件仓库
-DBMS:数据库的管理软件



数据库的分类
--1.关系型数据库
-----用“表”保存数据,相关数据存入一张表中



 



--2.非关系型数据库
-----键值数据库
-----对象数据库




###主流关系型数据库
-Oracle  甲骨文  拉里.艾力森   收费 核 闭源  卖产品
-DB2   IBM,应用于大型系统,主要环境是:UNIX/linux,是Oracle的主要竞争对手
-SQL Server 微软    只能在windows下运行 .net(C#)



-Mysql  免费 开源  卖服务




###SQL基本操作
SQL语言是操作数据库的语言
每一种数据库都有自己的独特方言



--操作数据库
1.显示所有的数据
--show databases;
2.选定要操作的数据库
--use database_name(库名);
3.创建新的数据库
--create database 库名;
4.查看创建数据库的语句
--show create database 库名;
5.设置默认解码的创建库语句
--create database demo1 default character set utf8;
6.删除数据库
--drop database demo1;
7.显示所有表,查询表结构
--show tables;
8.查询表结构
--desc 表名;
9.创建表
--create table 表名(
 列名 数据类型(长度) 约束,
 列名 数据类型(长度) 约束,
 .........
 列名 数据类型(长度) 约束(最后一列的逗号去掉)
);
例如:
create table stu(id int not null,name varchar(10),sex varchar(10));
或者:
create table stu(name varchar(10),age int)engine=innodb charset=gbk;
not null:限制 不能为空




#mysql的引擎有两种
ENGINE=InnoDB  支持数据库高级功能    如:事务(不能被打断,要么成功,要么回滚),外键



ENGINE=myisam  只包含数据存储的基本功能  效率非常高



#修改表名
---rename table 旧表名 to 新表名
---如:rename table user to tb_user;
##修改表属性(引擎,字符编码)
-----alter table 表名
          engine=myisam charset=utf8;
例如: alter table tb_user engine=myisam charset=utf8; 
#添加字段
----alter table 表名 add 新字段  新字段的数据类型  新字段的约束  first;
例如:alter table tb_user add id int first;
或者alter table tb_user add (gender char(5),tel char(11));



#修改字段名称
----alter table tb_user change 旧字段名 新字段名 新字段数据类型;
例如:alter table tb_user change gender sex varchar(10); 



#改数据类型
---删除某一个字段 ,添加一个新的
---使用命令关键字直接修改
-----alter table 表名 modify 字段名 字段新类型
例如:alter table tb_user modify tel varchar(11);       
#修改列的顺序
--alter table 表名 modify 目标列名 目标列数据类型 after 某一列
--例如:alter table tb_user modify tel varchar(11) after age; 
例如:alter table stu modify id varchar(11) first;//直接设置到第一行
#删除列(字段)
--alter table 表名 drop 列名
例如:alter table tb_user drop sex;
#删除表
--drop table 表名
例如:drop table tb_user;




create table emp(  //员工表
 empno int (4) NOT NULL  AUTO_INCREMENT COMMENT '工号',
 ename varchar(10), //姓名
 job varchar(10),  //工种
 mgr int(4), //上级领导工号
 hiredate date, //入职时间
 sal double(7,2), //工资
 comm double(7,2), //奖金
 deptno int(4) ,//所属部门编号



PRIMARY KEY (empno)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;



create table dept( //部门表
 deptno int(4), //部门编号
 dname varchar(14), //部门名称
 loc varchar(13) //部门办公所在地
);
select EMPNO as 工号,ENAME as 姓名,JOB as 工作,MGR as 上级领导编号,  HIREdate as 职时间,SAL as工资,COMM as 金,DEPTNO as 部门编号  from EMP;




###DML语言  对表中数据做操作的语句 增查删改
##INSERT语句
--属于插入语句
----insert into 表名(列名,列名,....) values (值1,值2,...);
例如:insert into emp(empno,ename,job,sal) values (1001,'lily','programmer',5500);
例如:insert into emp(empno,ename,hiredate) values (1002,'simth','18-01-24');
例如:insert into stu values('zhangsan',12),('lisi',24);
例如:insert into stu (id,name,age) values('1003','c',23),('1004','d',34);
##UPDATE语句
----属于更新,修改
--update 表名 set 字段名=值 where 列名=值;
例如:update emp set ename='lucy' where empno=1001;
例如:update book1 set bname='天线宝宝',author='不详',type='少儿' where bno=1005;
例如:update person set name='阿红' where id=4 and age=20;



##DELETE语句
---删除语句
----delete from 表名 where 条件
--------delete from emp where job is null;


## select 语句 
  
--没有条件的简单查询   
  
1.select * from 表名; 查询表中所有数据  会多一步查字段名 
  
2.select 字段名 from 表名;查询该字段名列的数据 
  
 select name as '姓名'  from 表名;  查询name列的数据 as '姓名'  加别名 
  
  select name as '姓名',age from person; 
  
select name as '姓名' from person; 
  
+-----------+ 
  
| 姓名      | 
  
+-----------+ 
  
| 薰儿      | 
  
| 任盈盈    | 
  
select name as 姓名,age as 年龄 from person; 
  
+-----------+--------+ 
  
| 姓名      | 年龄   | 
  
+-----------+--------+ 
  
| 薰儿      |     20 | 
  
| 任盈盈    |     20 | 
  
select ENAME 员工姓名,JOB 工作 from EMP;//省去as 
  
select e.ENAME 员工姓名 from EMP e;//表的别名 
  
select EMPNO,ENAME,JOB,COMM from EMP where COMM is not null and COMM>0; 
  
##去重  distinct 
  
select distinct e.MGR 领导 from EMP e; 
  
##where 
  
-where 子句用于规定选择的标准,如果需要有条件的从表中选取数据 
  
可将where 字句添加在select的后面 
  
-where字句是决定一条查询语句最后显示多少条目数的关键 
  
-在where会有一些运算符,大致与java相同 
  
1.and or   where MGR=7777 and COMM>1000 or DEPTNO=3; 
  
在where子句中把两个或多个条件结合起来,结合的结果与java中的&&和||一致,在不明优先级的情况下,使用() 
  
2.like  模糊查询  操作符 
  
-like用于在where语句中搜索列中的指定模式 
  
-sql中  模式就是--->通配符 
  
----% 代替任意个数的字符   a% 以a开头  %a 以a结尾   a%a以a开头和结尾      
  
--_代替一个字符   a_以a开头两个字符    _a   A_A   _A_ 
  
例如:select * from t_item where title like '%记事本%'\G; 
  
###例如select ENAME from EMP where ENAME not like 'K%'; 
  
select * from t_item where title not like '%得力%'\G; 
  
3.<   >  <=   >=   =   !=      <>也是不等于 
  
4.is null  is not null   in(在...中)in(112,114)两个中的一个   not 
  
select * from t_item where category_id in(238,917); 
  
相当于:select * from t_item where category_id=238 or category_id=917\G 
  
5.between xx and xx   在...之间 
  
select * from t_item where title like '%得力%' and price between 50 and 200\G; 
  
select * from t_item where price not between 50 and 200\G; 
  
select title,price from t_item where (title like "%联想%"   or title like "%戴尔%") and title like "%电脑%"; 
  
###DDL语句--对表本身操作的语句 以上除了DML都是DDL 
  
##TRUNCATE  删除数据 
  
先把整张表删除,然后重新创建一个表结构一模一样的空表 
  
--truncate table 表名 
  
----例如truncate table emp; 
  
#DDL不支持事务,运行后马上执行,不能回滚,DML支持事务 
  
  
  
  
  
##练习 
  
 create table book( 
  
  bid int(4) primary key comment '书id', 
  
  bname varchar(50) comment '书名', 
  
  pub varchar(50) comment '出版署', 
  
  author varchar(50) comment '作者'  //最后一行不加,号 
  
 )engine=myisam charset=utf8; 
  
 所有字段使用``,所有字符串使用''或"" 
  
  
  
#SQL分类 
  
###数据定义语言 DDL  负责数据结构定义、与创建数据库对象的语言   常用:create alter drop 
  
DDL不支持事务,所以执行之后不能回滚。、 
  
 

   ###数据操控语言 DML  增 删 改 
  
对数据库中更改数据操作的语句 
  
常用:select insert update delete -->CRUD 增删改查。   
  
通常把select相关操作拿出来,称之为DQL 
  
DML支持事务,在非自动提交模式时,可以利用rollback回滚操作 
  
####----数据查询语言 DQL  select 查 
  
-筛选 分组 连表查询  ****面试考点 
  
#事务控制语言  TCL 
  
负责实现数据库中事务支持的语言 
  
常用:commit rollback; 
  
###数据库控制语言 DCL 
  
 管理数据库的授权,角色控制等,grant(授权),revoke(取消授权) 
  
  
  
  
  
 create table customer( 
  
     cid int(4) primary key comment '顾客编号', 
  
    cname varchar(50) comment '顾客姓名', 
  
    sex char(5) comment '顾客性别', 
  
    address varchar(50) comment '地址', 
  
    phone varchar(11) comment '手机', 
  
    email varchar(51) comment '邮箱' 
  
    ); 
  
    show create table customer; 
  
  
  
  
  
#数据库数据类型 
  
##整数类型 int    bigint 
  
--tinyint  1字节 
  
--smallint  2字节 
  
--int    4字节 
  
--bigint  8字节 
  
int(6)  里面的数字影响的是查询时的显示长度,不影响数据的保存长度 
  
例子:create table t1(id1 int,id2 int(5));  
  
  括号里不写数字  默认11 
  
  insert into t1 values(111111,111111); 
  
  alter table t1 modify id1 int zerofill; 
  
  alter table t1 modify id2 int(5) zerofill; 
  
##浮点数类型 double  decimal 
  
--float 4字节 
  
--double 8字节 (8,2) 
  
可能会产生精度的缺失 
  
--decimal  不缺失精度 ,但是使用的时候需要指定总长度和小数位数 
  
##字符串类型 char varchar  text 
  
--char(固定长度)  定长字符串  最多255个字节   定多少长度就占多少长度,多了放不进去,少了空格补,不认识内容尾部的空格 
  
--varchar(最大长度) 变长字符串 最大65535  使用的时候一般不超过255;   只要不超过定的长度,都可以放进去,以内容真实长度为准,认识尾部空格 
  
--text  最大65535个字节 
  
--blob  大数据对象,以二进制(字节)方式存储 
  
 

   ##日期类型  date datetime  timestamp time year.. 
  
--date 年月日 
  
--time 时分秒 
  
--datetime  年月日时分秒 最大值到9999年,而且需要手动输入, 
  
如果没有手动输入就显示null。 
  
--timestamp 年月日时分秒 当没有数据插入时,自动填入当前时间 
  
最大值2038 
  
--bigint 1710 -1-1 0:0:0  格林威治时间 
  
create table t ( 
  
 d1 date, 
  
 d2 time, 
  
 d3 datetime, 
  
 d4 timestamp 
  
 ); 
  
 insert into t (d1,d2) values ('1910-01-10','12:32:12'); 
  
  
  
 insert into t values (1,'2018-12-21','15:34:23','1995-02-10 12:08:12','2030-10-10 15:23:34'); 
  
  
  
 insert into t values(2,'3018-01-25','15:12:34','9234-12-31 12:12:12','2048-12-31 12:12:12'); 
  
##其他数据类型  set.... 
  
 

     
  
  
  
  
  
 练习: 
  
 create table person( 
  
  id int(4) primary key, 
  
  bane varchar(50), 
  
  age int(2) 
  
  ); 
  
  insert into person values(1,"没嘲讽",36); 
  
  insert into person values(2,"小龙女",25); 
  
  insert into person values(3,"任盈盈",25); 
  
  insert into person values(4,"周只若",23); 
  
  insert into person values(5,"赵敏",25); 
  
  insert into person values(6,"小昭",26); 
  
  insert into person values(7,"珠儿",27); 
  
  insert into person values(9,"黄蓉",36); 
  
  insert into person values(10,"岳临山",24); 
  
   
  
   
  
  select ENAME as 姓名,MGR as 领导,JOB as 工作,SAL as 工资 from EMP; 
  
   
  
  select EMPNO as 编号,ENAME as 姓名,DEPTNO as 部门编号,SAL as 工资 from EMP; 
  
   
  
   
  
## 
   如果忘了mysql的用户名 密码怎么办? 
  
一、卸载重装 
  
二、不重装: 
  
1.停止mysql服务(任务管理器?)    
  
2.打开中端输入: 
  
mysqld --skip-grant-tables;相当于通过控制台开启了一个mysql服务(窗口不要关)//越过服务修改表 
  
3再开启一个新的cmd:mysql -u root -p;可以不使用密码进入数据库 
  
4.show databases;===mysql存root和密码 
  
5.use mysql; 
  
6.update user set password=password('新密码') where user='root'; 
  
7.关闭mysqld这个服务进程 
  
8.重启mysql服务