注:以下所有内容供本人学习使用,请理智看待,欢迎评论
1.什么是数据库(DataBase : DB):
- 数据库是按照数据结构来组织、存储和管理数据的仓库
- 说白了数据库还是一些文件,只是这些文件采用了一些数据结构来组织数据
2.为什么使用数据库:
- 首先,在我们学习数据库之前,我们已知的存储数据的方式有哪些? 变量、数组、集合?这些数据存储在内存里,然后是文本文件?xml文件 这些文件存在磁盘里,那么我们此处需要的一定是将数据存在磁盘里,因为数据在磁盘里可以永久保存。其次,我们需要对数据进行操作,这意味着我们需要追求效率,java提供了对文件的操作,可以通过I/O读取文件的数据,但这样效率太低了,假设有一百万条数据,我们都将其存在文件里,我们要查找一条数据就需要线性查找一条一条去找,很慢。而使用MySQL就能很好解决这个问题,MySQL对数据做了很多的优化,毕竟人家是专业的。
3.数据库技术的发展历程:
- 1.层次数据库和网状数据库阶段:使用指针来表示数据之间的联系
- 2.关系数据库技术阶段(数据之间使用表结构组织起来):代表:Oracle、DB2、MySQL、SQL Server等
- 3.非关系型数据库阶段:解决关系型数据库在数据模型、性能、拓展伸缩性上面的缺点,所以非关系型数据库现在及其热门(Redis(键值存储数据库)、MongoDB(图形数据库))
4.SQL语句-如何操作数据库呢:
- SQL是操作数据库的一种语言,包含六个部分,只需了解三个DQL、DML、DDL
- 1.数据查询语言(DQL)
- 2.数据操作语言(DML)
- 3.事务处理语言(TPL)
- 4.数据控制语言(DCL)
- 5.数据定义语言(DDL)
- 6.指针控制语言(CCL)
5.表(table)概述:
- MySQL是关系型数据库,而关系型数据库就是通过表结构来组织数据的,类似:
id | name | age |
10 | 张三 | 20 |
10 | 李四 | 22 |
- 上图就是一个表,每一列表示属性(即字段Filed),每一行就是一条记录
- ORM思想(对象表的映射):即与java的对应关系, 一个数据库对应一个项目、一行对应java一个对象、一张表对应java一个类(做java开发的时候,类名和表名一致)
6.数据库的操作以及存储引擎:
-
(1):数据库操作
-
- a:SHOW DATABASES:查看数据库服务器里有哪些数据库
- b:USE database_name:使用指定的数据库
- c:SHOW TABLES:查看指定数据库里有哪些表
- d:CREATE DATABASE database_name:创建指定名称的数据库
- e:DROP DATABASE database_name:删除指定的数据库
-
-
(2):MySQL常见的存储引擎:
-
- MyISAM:插入、查询速度快,但不支持事务、不支持外键
- InnoDB:支持事务、外键、支持行级锁定、但性能低
- 性能和安全总需要舍弃一个,只能选择折中取最优解,事务常用在涉及经济的领域
-
7.MySQL的数据类型(与java的对比):
备注 | MySQL | JAVA |
int可以不指定位宽,一般也不指定位宽 | INT | int |
BIGINT | long | |
处理小数时精度高(钱相关) | DECIMAL | bigDecimal |
相当于java中date、Calendar | DATE/DATETIME | date |
变长字符(可不指定长度) | VARCHAR | String |
定长字符 | CHAR | |
变长字符:存储大量字符串(文本类型) | TEXT | |
FLOAT | float | |
score double(5,2) 一共5位,小数占两位 | DOUBLE | double |
存储0 或 1 也可以存储M位二进制位 | BIT(M) | boolean |
8.对表的操作的语句:
-
1.创建表:
-- 最后一个字段不用加逗号
CREATE TABLE student(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
age INT
)
-- 若表名使用MySQL关键字,需加上反引号
-- PRIMARY KEY表示主键,自增且不为空
-- AUTO_INCREMENT表示自增
-- UNIQUE表示唯一
-- NOT NULL表示不为空
-- DEFAULT 18 默认值为18
-
2.删除表:
DROP TABLE IF EXISTS `student`;
DROP TABLE `student`;
9:DML操作(数据操作语言(增删改)):
-- 删除表
DROP TABLE `order`
-- 插入数据
INSERT INTO student(id,name,age) VALUES(1,'kai',20)
-- 简写
INSERT INTO student VALUES(2,'kk',22)
-- mysql特有
INSERT INTO student(name,age) VALUES('q',22),('w',22),('r',33)
-- 修改
UPDATE student SET name='cc' WHERE id=1
UPDATE student SET name='王麻子' WHERE name='cc'
-- 删除
DELETE FROM student WHERE id = 1
DELETE FROM student WHERE name='r'
-- SQL里关键字最好大写(增强可读性),虽然SQL不区分大小写
10:DQL查询操作:
-
(1):语法
-- 语法 SELECT * FROM 表名 [WHERE]... -- * 可以替换为自定义列名,想查询多少列的数据就填几列 SELECT 列1,列2,列3... FROM 表名 [WHERE] ...
-
(2):查询操作:emp表
-
-
a:消除重复数据查询:
-
-- 语法 SELECT DISTINCT 列名1,列名2... FROM 表名... SELECT DISTINCT JOB FROM emp
-
-
b:算数运算符:
- 在SQL中,summer型数据可使用+-*/创建表达式,对于date型数据可以使用+-操作
- 运算符优先级跟java一致并可以使用括号去强制改变优先级运算顺序
-
-- 需求:查询emp表里的员工姓名,工资,并将翻倍 SELECT ENAME,SAL * 2 FROM emp
-
-
c:设置别名:
-
-- 语法 ... AS 别名 ...
SELECT ENAME,SAL * 2 AS TOTALSAL FROM emp
-- 别名可以省略AS
SELECT ENAME,SAL * 2 TOTALSAL FROM emp
-- 别名命名不规范虚加反引号,但加上引号会影响后面排序功能,需避命名不规范免
SELECT ENAME,SAL * 2 AS `TOTAL SAL` FROM emp
-
-
d:按格式输出:
- 查询到的数据进行字符串拼接,使用CONCAT(字符串1,字符串2,...)
-
-- 需求:查询mp表里员工的姓名和工资,输出格式为某某工资为多少 SELECT
CONCAT(ENAME,'工资是',SAL) AS S FROM emp
-
-
e:过滤查询:
- 使用WHERE限定查询条件:
-
-- 语法 SELECT 列名1,列名2,... FROM 表名 WHERE 条件
-
-
f:比较运算符:
- =,>,=.
-
-- 查询基本工资高于2000的全部雇员信息。
SELECT * FROM emp WHERE SAL > 2000
-- 查询出smith的信息。
SELECT * FROM emp WHERE ENAME = 'smith'
-
-
g:逻辑运算符:
- AND OR NOT
-
-- 07.查询出所有销售人员(SALESMAN)的基本信息,并且要求销售人员的工资高于1300。
SELECT * FROM emp WHERE JOB = 'SALESMAN' AND SAL > 1300
-- 09.查询出所有经理或者是销售人员的信息,并且要求这些人的基本工资高于1500。
SELECT * FROM emp WHERE JOB = 'MANAGER' OR JOB = 'SALESMAN' AND SAL > 1500
-
-
h:范围运算符:
- IN(值1,值2,...)
- BETWEEN 小值 AND 大值
-
-- 08.查询出工资范围在1500~3000之间的全部雇员信息(包含1500和3000)。
SELECT * FROM emp WHERE SAL BETWEEN 1500 AND 3000
-- 12.查询出雇员编号是7369、7566、9999的雇员信息。
SELECT * FROM emp WHERE EMPNO IN (7369,7566,9999)
-
-
i:判空
- IS NULL
-
-- 10.查询所有领取奖金的雇员信息(comm不为空)。
SELECT * FROM emp WHERE COMM IS NOT NULL AND COMM != 0
-
-
j:模糊匹配查询
- LIKE
-
-- 13.查询出所有雇员姓名是以A开头的全部雇员信息。
SELECT * FROM emp WHERE ENAME LIKE 'A%'
-- 14.查询出雇员姓名第二个字母是M的全部雇员信息。
SELECT * FROM emp WHERE ENAME LIKE '_A%'
-- 15.查询出雇员姓名任意位置上包含字母A的全部雇员信息。 SELECT EMPNO,ENAME,JOB,MGR,SAL,HIREDATE,COMM,DEPTNO FROM emp WHERE ENAME LIKE '%A%'
-
-
k:结果排序:
- DESC降序
- ASC升序,不写默认升序
- 多个排序条件通过逗号隔开
-
l:分页查询
- LIMIT 起始索引,查多少条数据
- 起始索引从0开始
-
SELECT * FROM emp LIMIT 0,3
-- 开发时用curretPage表示当前页,pageSize表示当前页最大条数,
SELECT * FROM emp LIMIT (curretPage - 1) * pageSize,pageSize
-- 16.查询出所有雇员的信息,要求按照工资排序。
SELECT EMPNO,ENAME,JOB,MGR,SAL,HIREDATE,COMM,DEPTNO FROM emp ORDER BY SAL DESC
-- 17.要求查询所有雇员的信息,按照雇佣日期由先后排序。
SELECT EMPNO,ENAME,JOB,MGR,SAL,HIREDATE,COMM,DEPTNO FROM emp ORDER BY HIREDATE ASC
-- 18.查询全部雇员信息,按照工资由高到低排序,如果工资相同,则按照雇佣日期由先后排序。
SELECT EMPNO,ENAME,JOB,MGR,SAL,HIREDATE,COMM,DEPTNO FROM emp ORDER BY SAL DESC , HIREDATE ASC
注意事项:1。SQL执行顺序:FROM子句 -> WHERE子句 -> SELECT子句
-
-
m:统计函数:
- COUNT(*):统计表中各有多少记录
- SUM(列):汇总列的总和
- MAX(列):获取某一列最大值
- MIN(列):获取某一列最小值
- AVG(列):获取列的平均值
-
SELECT COUNT(*) FROM emp SELECT SUM(SAL) FROM emp
SELECT MAX(SAL) FROM emp SELECT MIN(SAL) FROM emp SELECT AVG(SAL) FROM emp