数据库:
今天学了数据库,感觉很新颖,而且作为SE部分和Web的过渡段,也不是很累,那么就来写一写这两天的感想(特别是数据库的安装部分,很多问题都是我安装时候出现的问题,希望在以后我看到的时候我会想起当时在这块出现了问题)
##1. 什么是数据库
简单的来说,数据库是一种专门用于存储数据的软件。在数据存储方面具有很多优点。在以前的程序中,数据的存储通常会选择文本文件,下面列举了一些数据库与文本文件之间的优劣对比,让我们对数据库软件有一个初步的认识:
* 文件系统不适合存储数据量比较大的信息
* 文本文件中存储的数据都是字符串类型
* 没有考虑并发访问问题
* 文件系统不会对数据的有效性和完整性作出检查
* 没有任何安全保护
对于现代企业应用而言,数据本身具有非常重要的价值,甚至可以说数据比应用更
加重要。应用瘫痪了可以恢复,甚至可以重新开发,而数据丢失了,就会对企业造成重要的损失。比如,一个金融如果应用丢失了客户信息,对企业来讲就无法确认哪些用户在企业中有存款,存款金额是多少,这对企业来将将会是致命的损失。
所以,为了保证数据的安全,几乎所有的企业应用都会选择数据库软件作为数据存
储的方式,同时数据库还可以在数据处理,检索等方面为应用程序提供帮助。
目前市场上主流的数据软件有 :
* Oracle(甲骨文)公司出品的 Oracle 数据库
* IBM 公司出品的 DB2 数据库
* 微软公司出品的 MS SQLServer 数据库。
* 以及开源的 MySQL 数据库(被Oracle 公司收购)
除此之外,还有许多其他厂商的产品,如 sybase,postgreSQL 等等。
##2. 什么是关系型数据库
数据库里是以`表`为单位存储数据的,例如存储部门信息的表:
```sql
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
```
再比如员工表:
```sql
+-------+--------+---------+--------+
| empno | ename | sal | deptno |
+-------+--------+---------+--------+
| 7369 | SMITH | 800.00 | 20 |
| 7499 | ALLEN | 1600.00 | 30 |
| 7521 | WARD | 1250.00 | 30 |
| 7566 | JONES | 2975.00 | 20 |
| 7654 | MARTIN | 1250.00 | 30 |
| 7698 | BLAKE | 2850.00 | 30 |
| 7782 | CLARK | 2450.00 | 10 |
| 7788 | SCOTT | 3000.00 | 20 |
| 7839 | KING | 5000.00 | 10 |
| 7844 | TURNER | 1500.00 | 30 |
| 7876 | ADAMS | 1100.00 | 20 |
| 7900 | JAMES | 950.00 | 30 |
| 7902 | FORD | 3000.00 | 20 |
| 7934 | MILLER | 1300.00 | 10 |
+-------+--------+---------+--------+
```
其中员工表中没有存储全部的部门信息,仅仅存储了部门编号,通过部门编号(关系)可以找到部门表中部门的详细信息。这种两个表中的数据关联就称之为`关系`
好,现在我们就来一起看一下数据库的安装(反正我当时安装的时候问题很多,可能就是动手能力比较差,所以来记录一下):
1. 到mysql官网:https://www.mysql.com/downloads/
![Alt text](./1533468694252.png)
找到社区版的下载连接(在最下面)推荐下载目前最新版本是8.0.12
2. 在接下来的页面里,点击`DOWNLOAD`超链接:
![Alt text](./1533468803391.png)
3. 选择版本,windows建议选择zip版本,这篇教程也以zip版本为例
![Alt text](./1533468966474.png)
点击`DOWNLOAD`按钮
4. 接下来的页面里,不需要登录注册,仅需要点击:
![Alt text](./1533469051774.png)
下载就会开始
5.主要执行一步初始化,打开安装MySQL的文件的bin目录,按住【shift】键的同时点击鼠标右键,选择‘【在此处打开命令窗口(W)】然后输入【mysqld --initialize --console 】-->回车,这时会出现一个临时密码,需要把他记录下来(建议Ctrl +c/v)来完成,手动容易出错。特别注意的是,安装MySQL的目录不要设置成中文路径,不然后边的服务启动不了。
6安装服务:
上一步的临时密码出现后,记录下来,接着输入【mysqld install】-->回车,如果安装成功会提示:Service successfully installedm。
7启动服务:输入【net start mysql】-->回车,如果启动成功的话,下边提示MySQL服务已经启动成功。
8登录:
输入【mysql -u root -p】-->回车,就会弹出“ Enter password:“需要你在这里输入刚才保存的初始密码。如果登录成功,会出现welcome开头的一段英文(如果此时你的初始密码忘记了,也找不到了,不要担心,回到mysql的安装目录,删除date文件夹,重新执行初始话步骤),然后你就可以建库了。以下是我当时的执行步骤,中间有几步打错了,希望不要介意。
当然,你嫌初始密码无规律,记不住你就可以更改密码,过程如下:
最后边的一串数字是我给大家举的例子,前边就相当是一个固定的,最后边的引号里边是你想要改成的密码。(如果看到的朋友
还有疑问,请联系我,我会提供8.0版本安装包:ankouchen@126.com。
既然上边已经安装成功了那么下来就开始练练手,一起来学习下数据库的基本使用以及语法内容:
建库:
语法:
create database 数据库名[character set 字符集];
例如:create database dog;就好了数据库的名称是dog,【注意:】后边要记得带上分号【;】。
查看所有库:
语法:
show databases;
切换库:
语法:
use 数据库名;
例如:use panda;就切换到panda数据库里边了。
创建表:
语法:
create table [if not exists] 表名(
列名1 类型 [约束],
列名2 类型 [约束],
·············
列名n 类型 [约束],
[主键约束],
[外键约束],
[索引],
···
);
例如:
create table if not exists student( //如果说你知道你的库里边没有student这个表,那么可以省略”if not exists“
id int not null auto_increment, //约束: not null 是不为空的意思,auto_increment是自动加1的意思
name varchar(20) not null, //mysql数据库的字符串是varchar,20代表最长为20个字节,
age int not null,
primary key(id), //id就是这个表的主键
index(name)
);
然后这个表就建成了。
当然你想查看下这个表的结果,可以选择:desc 表名;
查看所有表: show tables;
查看索引: show index from 表名;
既然创建了表,就要写入一些东西,不然一张空表没有意义,那么一起来看一下如何插入数据:
insert into 表名 (列1,列1,····列n)values(值1,值2···值n);
例如:insert into student(id,name,age)values(001,’可可‘ 13); 需要注意的是:mysql和Java不一样,这个字符串内容是用【单引号】 ,不是双引号了,而且一个单词与一个单词之间只能留有1个空格,多了会出错(我在做练习的时候,就发现语句没有问题但是偏偏出错了,后来看了下把多余的空格删掉了,就好了所以如果看到的朋友但愿对你们有点帮助);
此时你可以用【select * from student;】来查看你的值有没有添加进去。
如果你在查看你添加的值的时候突然发现,某个数据添加错了,不要担心一起来看一下如何去修改数据:
update 表名 set 列1=值1,列2=值2···列n=值n [where 条件];
就用student这个表来举例:(更改所有数据的年龄)
update student set age=14; 就把所有的数据的年龄变成4了(当然,这个表目前只插入了一行信息,所以只有一个age值,默认有许多····)
那要是要更改某一个年龄呢?
还是用student来举例:(更改某一个数据的年龄)
update student set age=4 where id=001;这里where的条件进来选择主键的内容,唯一,不为空。
如果说你把这个表的信息写多了,要删除呢?不担心一起来看一看:
语法:
delete from 表名 [where 条件];
好举例来看一下:
delete from 表名;(删除表中所有的数据······慎重)
delete from student where id=001;(删除表中id等于001 的数据内容)
快速删除表中的数据:
truncate table student; (无法恢复,delete还是有机会的,这个更要慎重);
查询数据:
语法:
select 列名1,列名2····列名n from 表名;
举例;
select id ,name,age from student;
查看所有的列:
select * from student;
按条件查询
语法:
select 列名1,列名2···列名n from 表名 where 条件;
条件可以是`=`,`>=`,`>`,`<=`,`<`,`!=`,`between ... and ...`,`in`,`like`,并且可以使用`and`和`or`进行条件的与或运算。
举例:要查询年龄大于12岁的学生(上边的student表只有一条数据,默认有很多);
select age from dog where age>12;
例:查询工资大于2000的员工
```sql
select * from emp where sal>2000;
```
例:查询员工编号等于7369的员工
```sql
select * from emp where empno=7369;
```
例:查询员工职位不等于经理的员工
```sql
select * from emp where job!='MANAGER';
```
例:查询10号部门并且工资大于3000的员工
```sql
select * from emp where deptno=10 and sal>3000;
```
例:查询员工编号等于7369或7566的员工
```sql
select * from emp where empno=7369 or empno=7566;
--也可以使用in 求解
select * from emp where empno in(7369,7566);
```
例:查询工资小于等于5000并且大于等于3000的员工
```sql
select * from emp where sal>=3000 and sal<=5000;
--也可以使用between and求解,注意between and 包括等于条件
select * from emp where sal betweeen 3000 and 5000;
```
例:查询姓名以M打头的员工
```sql
select *from emp where ename like 'M%';
函数:
日期函数:
select date_add( now( ) , interval 1 day); //目前日期加一天 interval是间隔的意思
select extract(year from now() ); //提取年份
select extract(year_month from now () ); //提取年月
例:转换类型:
select cast(’11‘ as signed) ; 转为整数
select cast(’11.666‘ as decimal (10,2) 转为小数11.67,10是代表最多为10位有效数字,2代表小数点后边由两位。
select cast(’2018-8-14‘ as datetime); 转为日期2018-08-14 00:00:00
例:字符串函数
select concat(’a','b','c'); //拼接字符串,结果‘abc’
select lower(ename) from emp; //姓名转小写;
例:求长度
select length(‘张三’); //字节长度 【注意:】如果直接求表中name的长度,那么‘张三’的长度是6,如果直接在dos窗口的话,就会显示长度为4,那是因为mysql用的是utf-8编码,dos窗口是Unicode编码,utf-8编码一个汉字(含繁体,含标点)占用3个字节,Unicode编码一个汉字(含繁体,含标点)占用2个字节。所以还是要多注意下。
select char_length(‘张三’); //字符长度
例: case
select sal,case when sal>=3000 then '高' else '低‘ end from emp;
例:组函数:
select max(sal) ”最高工资“,
min(sal)”最低工资“,
avg(sal)”平均工资“,
sum(sal)”总工资“
count(*) ”员工个数“ from emp;
group by····having:
select deptno,count(*) from emp group by deptno; //根据部门分组,求部门的人数。
select deptno,count(*) from emp group by deptno having count(*)>3; //根据部门分组,求部门人数大于3的部门编号和人数。
order····by :排序
select * from emp order by sal asc; 按工资升序排列,此处可以默认省略asc;
select * from emp order by sal desc;按工资降序排列;
limit : 限制
select * from emp limit 3; 查询前3条数据
select * from emp limit 2,3; 偏移量(索引)为2开始,查询前3条数据。
表连接:
连接部门表和员工表,内连接
select d.*, e.* from dept d inner join emp e on d.deptno =e.deptno;
连接部门表和员工表,左外连接
select d.*, e.* from dept d left join emp e on d.deptno=e.deptno;
子查询:
查询工资最高的员工,将子查询看做一个值
select * from emp where sal=(select max(sal) from emp);
查询每个部门工资最高的员工:将子查询看做一个函数
```sql
select * from emp e
where sal = (select max(sal) from emp where deptno=e.deptno);
```
查询工资排名前三的员工:将子查询结果看做临时表
```sql
select * from emp
where sal in (
select sal from (
select distinct sal from emp order by sal desc limit 3
) as t
);
事物处理:
start transaction;
commit;
rollback;
好的今天我先说到这,后边的而我也不是很懂,但是还是要写上,毕竟终有一天我会懂得,先保存着,日后在说。