目录

1.数据库概念

1.1什么是数据库

1.2关系型和非关系型数据库的关系

1.3 Mysql数据库

1.3.1 MySQL数据存放位置

1.3.2客户端打开方式

MySQL客户端2:可视化工具

2. sql语句

2.1 sql简介

2.2  分类

2.3 常见操作语句

2.3.1 数据库的常见操作

2.3.2 表的常见操作

2.3.3 表里的记录的常见操作

2.4 字段约束

2.5 条件查询

2.6 模糊查询

2.7 分页排序

null

between and

limit

order by

2.8 其他关键字

count

max / min

sum / avg

group by 和 Having 

3.数据库特性

3.1 事务 transaction

3.2  隔离级别

3.3  索引 index

3.3.1 定义

3.3.2 分类

3.3.3 相关命令

3.4  多表联查 join

inner join、left join、right join的区别?


1.数据库概念

1.1什么是数据库

简而言之,就是存储数据,管理数据的仓库。

常见的数据库分为:

  • 关系型数据库, Oracle、MySQL、SQLServer、Access
  • 非关系型数据库, MongoDB、Redis、Solr、ElasticSearch、Hive、HBase

1.2关系型和非关系型数据库的关系

早期发展的数据库建立在数据的紧密关系基础之上(如:父子关系、师生关系),我们称其为关系型数据库,也称为传统数据库;现今数据库建立在数据的松散关系基础之上(如:中国人和美国人、中国人和印度人、视频、音频),我们称其为非关系型数据库nosql(not only sql)。业界总在争论nosql能否干掉传统数据库,很多初学者也有这个困惑。以我来看,两者没有矛盾,它们各有特点,根据业务情况互补才是真谛。

1.3 Mysql数据库

  1. mysql服务端,它来处理具体数据维护,保存磁盘
  2. mysql客户端,CRUD新增,修改,删除,查询


1.3.1 MySQL数据存放位置

在MySQL的配置文件my.ini中会进行默认配置

1.3.2客户端打开方式

MySQL客户端1:DOS窗口

语法: mysql -uroot -proot   实质:mysql.exe执行文件

代表参数 -u 用户名,紧接着写的 -p 密码,紧接着写的



MySQL客户端2:可视化工具

2. sql语句

2.1 sql简介

结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

SQL 是1986年10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了SQL正式国际标准。

2.2  分类

DML(Data Manipulation Language)数据操纵语言
如:insert,delete,update,select(插入、删除、修改、检索)简称CRUD操新增Create、查询Retrieve、修改Update、删除Delete

DDL(Data Definition Language)数据库定义语言
如:create table之类

DCL(Data Control Language)数据库控制语言
如:grant、deny、revoke等,只有管理员才有相应的权限

DQL(Data Query Language)数据库查询语言
如: select 语法

2.3 常见操作语句

2.3.1 数据库的常见操作

–1,查询:show databases

–2,新增:create database 库名

–3,删除:drop database 库名

2.3.2 表的常见操作

–1,创建表 :create table 表名(字段名 字段类型(字段长度),字段2,字段3…)

String -> varchar   int -> int  Boolean—inttny

double -> double

–2,删除表 : drop table 表名

–3,修改表 :alter table tb_door add column addr varchar(100);

–4,查看表:show tables;

–5,描述表:desc tb_door ;

2.3.3 表里的记录的常见操作

–1,新增:insert into 表名 values(‘字段1的值’ , “字段2的值” , …)

mysql> insert into tb_door values(10000,'first',"010-666888",'bj');

–2,删除:delete from 表名

mysql> delete from tb_door;

mysql> select * from tb_door;

–3,修改:update 表名 set 字段名=字段的新值

mysql> update tb_door set addr='shanghai';

–4,查询:select 字段名 from 表名

select id from tb_door; --只查id列的值

select id,addr from tb_door; --查id和addr列的值

select * from tb_door; --查所有列的值 -- 低效

2.4 字段约束

#没有约束,id的值可以重复,可以是null

create table a(id int)

#主键约束,id的值不能重复,不能是null

create table b(id int PRIMARY key)

#主键约束自动递增,id的值不能重复,不能是null,而且自动递增

create table c(id int PRIMARY key auto_increment)

#没有非空约束:字段的值可以为空

create table d( name varchar(10) )

#非空约束:字段的值不能为空

create table e( name varchar(10) not null )

#不用唯一约束:字段的值可以重复

create table f( name varchar(10) )

#唯一约束:字段的值不能重复

create table g( name varchar(10) unique )

2.5 条件查询

distinct:使用distinct关键字,去除重复的记录行

SELECT loc FROM dept;

SELECT DISTINCT loc FROM dept;

where:where中不能使用列别名!!

select * from emp
select * from emp where 1=1 --类似没条件
select * from emp where 1=0 --条件不成立
select * from emp where empno=100 --唯一条件

select * from emp where ename='tony' and deptno=2 --相当于两个条件的&关系
select * from emp where ename='tony' or deptno=1 --相当于两个条件的|关系

select name, sal from emp where sal=1400 or sal=1600 or sal=1800;
-- 或select name, sal from emp where sal in(1400,1600,1800);

select name, sal from emp where sal not in(1400,1600,1800);

2.6 模糊查询

like:通配符%代表0到n个字符,通配符下划线_代表1个字符

select * from emp where ename like 'l%' --以l开头的
select * from emp where ename like '%a' --以a结束的
select * from emp where ename like '%a%' --中间包含a的
select * from emp where ename like 'l__' --l后面有两个字符的 _代表一个字符位置

2.7 分页排序

null

select * from emp where mgr is null --过滤字段值为空的

select * from emp where mgr is not null --过滤字段值不为空的

between and

select * from emp where sal<=3000 and sal>=10000--等效

select * from emp where sal between 3000 and 10000--等效

limit

分数最高的记录:按分数排序后,limit n,返回前n条。Oracle做的很笨,实现繁琐,后期有介绍,而mysql做的很棒,语法简洁高效。在mysql中,通过limit进行分页查询:

select * from emp limit 2 --列出前两条
select * from emp limit 1,2 --从第二条开始,展示2条记录
select * from emp limit 0,3 --从第一条开始,展示3条记录--前三条

order by

SELECT * FROM emp order by sal #默认升序
SELECT * FROM emp order by sal desc #降序

2.8 其他关键字

count

select count(*) from emp --底层优化了
select count(1) from emp --效果和*一样
select count(comm) from emp --慢,只统计非NULL的

max / min

select max(sal) from emp --求字段的最大值
select min(sal) min from emp --获取最小值

select min(sal) min,max(sal) max from emp --最小值最大值
SELECT ename,MAX(sal) FROM emp group by ename --分组

sum / avg

select count(*) from emp --总记录数
select sum(sal) from emp --求和
select avg(sal) from emp --平均数

group by 和 Having 

select deptno, AVG(sal) from emp
group by deptno #按部门分组
having AVG(sal)<8000 #查询条件,类似where,但是group by只能配合having

3.数据库特性

3.1 事务 transaction

事务4个特性ACID

一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中如果发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。


3.2  隔离级别

事务隔离分为不同级别,包括

读未提交(Read uncommitted) 安全性最差,可能发生并发数据问题,性能最好
读提交(read committed) Oracle默认的隔离级别
可重复读(repeatable read)MySQL默认的隔离级别,安全性较好,性能一般
串行化(Serializable) 表级锁,读写都加锁,效率低下,安全性高,不能并发

3.3  索引 index

3.3.1 定义

索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(额外的存储空间),这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高效的查找算法。这种数据结构就叫做索引。

一般来说索引本身也很大,不可能全部存储在内存中,因此往往以索引文件的形式存放在磁盘中。目前大多数索引都采用BTree树方式构建。

3.3.2 分类

单值索引:一个索引只包括一个列,一个表可以有多个列
唯一索引:索引列的值必须唯一,但允许有空值;主键会自动创建唯一索引
复合索引:一个索引同时包括多列

3.3.3 相关命令

查看索引,主键会自动创建索引:show index from dept;

创建普通索引: create index 索引名字 on 表名(字段名); 

创建唯一索引:CREATE UNIQUE INDEX 索引名 ON 表名(字段名)

创建复合索引:CREATE INDEX 索引名 ON 表名 (字段1, 字段2)

删除索引:alter table dept drop index fuhe_index

3.4  多表联查 join

inner join、left join、right join的区别?

  • INNER JOIN两边都对应有记录的才展示,其他去掉
  • LEFT JOIN左边表中的数据都出现,右边没有数据以NULL填充
  • RIGHT JOIN右边表中的数据都出现,左边没有数据以NULL填充

举例: 左连接就是以from左边为主,拿上面两个例子来说,第一种是以学生(students)为主,假如学生成绩为空,也能查询到学生信息,只不过成绩为空。而第二种则是以成绩为主(sc)所以先查学生成绩,如果成绩为空就算学生存在,也查不到记录。

 

更多推荐

java基础——数据库