JavaSE_day21:数据库

数据库:

今天学了数据库,感觉很新颖,而且作为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;

好的今天我先说到这,后边的而我也不是很懂,但是还是要写上,毕竟终有一天我会懂得,先保存着,日后在说。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值