目录
10.2.5 带LIKE关键字查询
10.3.1.3 AVG (求出某个字段所有值的平均值)
10.3.1.4 MAX(最大值) MIN(最小值)
10.5.1 GROUP BY 和聚合函数一起使用
1.数据库
1.1 概述
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库
什么是数据库?
数据库是用于存储和管理数据的仓库
数据库特点
持久化
方便存储和管理数据
使用了统一的操作方式
1.2 数据库分类
关系型数据库
关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。
简单理解:保存的实体与实体之间的关系。(用户、商品、订单)
非关系型数据库
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSql数据库在特定的场景下可以发挥出难以想象的高效率和高性能,它是作为对传统关系型数据库的一个有效的补充。
NoSQL( NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
1.3 常见数据库
- Oracle 公司Oracle(甲骨文)数据产品,收费的大型的数据库。
- MySQL 开源的,被Oracle收购了,小型的数据库。5.x版本免费,6.x收费了
- SQLServer 微软的,收费的中型的数据库。
- DB2 IBM公司收费的大型的数据库。
- SyBASE PowerDigener软件(非常牛)
2.Navicat工具
使用教程请看官方文档:
3.数据库常见操作
3.1 启动和关闭
启动:net start mysql;(在命令提示符中启动(需要以管理员的身份进行))
注意:
mysql为服务名成,需要查看Windows中mysql服务器的名称,否则报“服务名无效”错误。
关闭:net stop mysql;
注意:
在启动mysql服务后,打开windows任务管理器,会有一个名为mysqld.exe的进程运行,所以mysqld.exe才是MySQL服务器程序。
查看服务名称截图如下
我的电脑右键》管理》服务和应用程序》服务(也可直接对其右键开启或关闭)
3.2 登陆和退出
在启动MySQL服务器后,我们需要使用管理员用户登录MySQL服务器,然后来对服务器进行操作。登录MySQL需要使用MySQL的客户端程序:mysql.exe
本地登陆
- mysql -uroot -p123 -h localhost
- -h:后面给出的localhost是服务器主机名,它是可以省略的,例如:
- -p:后面的123是密码,这是在安装MySQL时就已经指定的密码
- -u:后面的root是用户名,这里使用的是超级管理员root
mysql -uroot -p123 (不提示输入密码)
mysql -u root -p //root是用户名,输入这条命令按回车键后系统会提示你输入密码
默认都是登陆本机
退出
quit 或 exit
4. SQL
4.1 SQL简介
- SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL、Oracle、SQL Server等。
- SQL标准(ANSI/ISO)有自己标准,这些标准就与JDK的版本一样,在新的版本中总要有一些语法的变化。不同时期的数据库对不同标准做了实现。
- 虽然SQL可以用在所有关系型数据库中,但很多数据库还都有标准之后的一些语法,我们可以称之为"方言"。
- 例如MySQL中的LIMIT语句就是MySQL独有的方言,其它数据库都不支持!当然,Oracle或SQL Server都有自己的"方言".
4.2 sql通用语法
1.可以多行或单行书写,以分号结束
2.可以使用空格或者制表符来格式化,优化代码结构
3.sql不区分大小写,关键字建议大写
4.注释
1.单行--注释的内容 或者 #注释的内容2.多行/*注释*/
4.3 SQL 语言分类
DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
create、drop、alter等
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
insert、delete、update等
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
select、where等
4.4 数据库和表的关系
- 一个数据库的服务器中有多个数据库
- 一个数据库中有多张表,每个表有多个字段,字段和Java中类的属性是一一对应的。
- 表中每一条记录对应的是一个Java实例对象
5.数据库的基本操作
5.1 创建和查看数据库
5.1.1 创建数据库
创建一个数据库语法(默认字符为utf-8)
CREATE DATABASE 数据库名称;
创建一个使用utf8字符集的mydb1数据库
CREATE DATABASE mydb1 CHARACTER SET 'UTF8';
5.1.2 查看数r据库
查询所有数据库
语法:SHOW DATABASES;
查询数据库的定义(创建)语句
语法:SHOW CREATE DATABASE 数据库名称;
前四个数据库为系统默认数据库;后两个则为新建数据库。
5.2 修改数据库编码
语法:
ALTER DATABASE 数据库名称 CHARACTER SET 编码;
5.3 删除数据库
删除数据库是将数据库系统中已经存在的数据库删除。
语法:DROP DATABASE 数据库名称;
5.4 切换数据库
语法: use 数据库名;
6.MySQL数据类型
使用 MySQL数据库存储数据时,不同的数据类型决定了 MySQL存储数据方式的不同。为此, MySQL数据库提供了多种数据类型,其中包括整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型和二进制类型。Java数据类型与MySql数据类型对照表
- 数据类型介绍
- int:整型
- double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99
- decimal:泛型型,在表示钱方面使用该类型,因为不会出现精度缺失问题
- char:固定长度字符串类型
- varchar:可变长度字符串类型
- text:字符串类型
- blob:字节类型
- date:日期类型,格式为:yyyy-MM-dd
- time:时间类型,格式为:hh:mm:ss
- timestamp:时间戳类型
Java数据类型与MySql数据类型对照表
类型名称
显示长度
数据库类型
JAVA类型
JDBC类型索引(int)
VARCHAR
L+N
VARCHAR
java.lang.String
12
CHAR
N
CHAR
java.lang.String
1
BLOB
L+N
BLOB
java.lang.byte[]
-4
TEXT
65535
VARCHAR
java.lang.String
-1
INTEGER
4
INTEGER UNSIGNED
java.lang.Long
4
TINYINT
3
TINYINT UNSIGNED
java.lang.Integer
-6
SMALLINT
5
SMALLINT UNSIGNED
java.lang.Integer
5
MEDIUMINT
8
MEDIUMINT UNSIGNED
java.lang.Integer
4
BIT
1
BIT
java.lang.Boolean
-7
BIGINT
20
BIGINT UNSIGNED
java.math.BigInteger
-5
FLOAT
4+8
FLOAT
java.lang.Float
7
DOUBLE
22
DOUBLE
java.lang.Double
8
DECIMAL
11
DECIMAL
java.math.BigDecimal
3
BOOLEAN
1
同TINYINT
ID
11
PK(INTEGER UNSIGNED)
java.lang.Long
4
DATE
10
DATE
java.sql.Date
91
TIME
8
TIME
java.sql.Time
92
DATETIME
19
DATETIME
java.sql.Timestamp
93
TIMESTAMP
19
TIMESTAMP
java.sql.Timestamp
93
YEAR
4
YEAR
java.sql.Date
91
对于bolb,一般用于对图片的数据库存储,原理是把图片打成二进制,然后进行的一种存储方式,在java中对应byte[]数组。
对于boolen类型,在mysql数据库中,一般用int类型代替较好,对bit操作不是很方便,尤其是在具有web页面开发的项目中,表示0/1,对应java类型的Integer较好。
7.表的基本操作
数据库创建成功后,就需要创建数据表。所谓创建数据表指的是在已存在的数据库中建立新表
注意:在操作数据表之前,应该使用“USE 数据库名”指定操作是在哪个数据库中进行的,否则会抛出“No database selected”错误。
7.1创建表
语法:
CREATE TABLE 表名(
字段名称 类型(长度) 约束,
字段名称 类型(长度) 约束,
字段名称 类型(长度) 约束,
....
);
注意事项:
- 表名后跟着一对小括号,并有分号结束。
- 每一行字段后面要有逗号分隔,但是最后一行没有逗号。
- 数据的类型后面有长度,如果是字符型,长度必须加。如果是其他类型,可以不加。因为有默认长度。int 默认长度11
- 长度表示数据类型在定义下的最长值
案例演示:
7.2 查看表
7.2.1 查看所有表
语法:SHOW TABLES;
7.2.2 查看指定表
使用SQL创建好数据表后,可以通过查看数据表结构的定义,以确认数据表的定义是否正确。
1. SHOW CREATE TABLE 表名;
该语句可以查看数据库表的定义信息,还可以查看表的字符集。
2. DESCRIBE 表名(简化写法为:DESC 表名;)
该语句可以查看表的字段名、字段类型等信息。
案例演示:
7.3 修改表
有时候,希望对表中的某些信息进行修改,这时就需要修改数据表。所谓修改数据表指的是修改数据库中已经存在的数据表结构。
比如,修改表名、修改字段名、修改字段的数据类型等。在 MySQL中,修改数据表的操作都是使用 ALTER TABLE语句来完成的。
7.3.1 修改表名
语法: RENAME TABLE 旧表名 TO 新表名;
将person表名字修改为newPerson;
7.3.2 修改字段名(属性名)
语法:ALTER TABLE 表名 CHANGE 旧字段 新字段 类型(长度) 约束;
注:可修改原字段类型的长度,但不可修改旧字段的类型;
将newperson表中的name字段修改为newname;
7.3.3 添加字段
添加字段
语法: ALTER TABLE 表名 ADD 字段 类型(长度) 约束;
给newperson表添加age字段
7.3.4 删除字段
删除字段
语法: ALTER TABLE 表名 DROP 字段;
删除age字段
7.4 删除表
删除数据表是指删除数据库中已存在的表。在删除数据表的同时,数据表中存储的数据都将被删除。
注意:创建数据表时,表和表之间可能会存在关联,要删除这些被其他表关联的表比较复杂
语法: DROP TABLE 表名;
删除newperson表,并查询:
8.表的约束(必会,会主外键约束)
为了防止数据表中插入错误的数据,在MySQL中,定义了一些维护数据完整性的规则,即表的约束
约束条件
说明
PRIMARY KEY
主键约束,用于唯一标识对应的记录
FOREIGN KEY
外键约束
NOT NULL
非空约束
UNIQUE
唯一性约束
DEFAULT
默认约束,用于设置字段的默认值
注意:
1.主键列的值不能为NULL,也不能重复!
2.指定主键约束使用PRIMARY KEY关键字
8.1 主键约束
在 MySQL中,为了快速查找表中的某条信息,可以通过设置主键来实现。主键约是通过 PRIMARY KEY定义的,它可以唯一标识表中的记录,这就好比身份证可以用标识人的身份一样。
语法:字段名 数据类型 PRIMARY KEY;
id INT PRIMARY KEY,
用法一: 创建表时就添加约束
用法二: 创建完表后,添加非空约束(更新表)
ALTER TABLE 表名 MODIFY name VARCHAR(20) NOT NULL;
删除非空约束
ALTER TABLE 表名 MODIFY name VARCHAR(20);
8.2 非空约束
指定非空约束的列不能没有值,也就是说在插入记录时,对添加了非空约束的列一定要给值;在修改记录时,不能把非空列的值设置为NULL。
语法:字段名 数据类型 NOT NULL;
name varchar(10) not null
注:设置为非空后,列必须有值
8.3 唯一约束
当为字段指定唯一约束后,那么字段的值必须是唯一的。这一点与主键相似!例如给stu表的sname字段指定唯一约束:
语法:字段名 数据类型 UNIQUE
name varchar(20) unique
8.4 设置表字段的值自动增加
在数据库表中,若想为表中插入的新记录自动生成唯一的ID,可以使用AUTO_INCREMENT约束来实现,AUTO_INCREMENT约束的字段可以是任何整数类型,默认情况下,该字段的值是从1开始自增的
语法:字段名 数据类型 AUTO_INCREMENT;
8.4.1 默认从1开始增长
若将第二行删除后为:
再次添加语句:
结果为:
8.4.2 设置默认值开始增长
9.数据库增删改查
想要操作数据表中的数据,首先要保证数据表中存在数据,MySQL使用INSERT语句想数据表中添加数据,并且根据添加方式的不同分为三种,分别是为表中的所有字段添加数据,为表中指定字段添加数据、同时添加多条记录。
9.1 INSERT插入语句
语法1: INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2,...);
注意:列和值必须匹配
示例:
语法2:INSERT INTO 表名 VALUES(值1,值2,…)
注意:1.因为没有指定要插入的列,表示按创建表时列的顺序插入所有列的值
2.数据与字段类型要相同
3.字段长度需要控制
4.所有字符串数据必须使用单引用
示例:
9.2 SELECT查询语句
语法:
查询所有数据:SELECT * FROM 表名;
【*】通配符表示表中所有字段
查询指定字段:SELECT 字段名1,字段名2,字段名3 FROM 表名;
字段1、字段2、字段3表示从表中查询的指定字段
去除重复的数据:SELECT DISTINCT 字段名 FROM 表名;
DISTINCT 是可选参数,用于剔除查询结果中重复的数据
9.3 UPDATE更新语句
9.3.1 UPDATE更新语句语法
UPDATE 更新数据是指对表中存在的记录进行修改,UPDATE语句可以更新表中的部分数据和全部数据
语法:
UPDATE 表名称
SET
列名称1 = 新值1,
列名称2 = 新值2,
...
WHERE 列名称 = 某值(旧值,条件值);
语法解释:
- UPDATE关键字后面指定要更新数据的表名。
- SET子句指定要修改的列和新值。要更新多个列,请使用以逗号分隔的列表
- WHERE是可选的,用于指定更新数据需要满足的条件。如果省略WHERE子句,则将更新表中的所有行。
9.3.2 UPDATE更新语句案例演示
1.更新某个表中id字段值为1的记录,将记录中name字段的值改为"哈哈"
2.更新某个表中id字段小于3的记录,将 age 字段值都更新为100
3.更新表中所有的记录,将name字段值都改为”无名”
9.4 DELETE删除语句
删除是指对表中存在的数据进行删除
9.4.1 删除条件语句
语法: DELETE FROM 表名WHERE 条件;
语法解释
- DELETE FROM 后面跟着删除数据的表
- WHERE 后面是指定条件,如删除 id 为 11 的写法为 id=11
案例演示:
1.删除id为1的数据
2.删除id大于5的数据
9.4.2 删除全部数据
- 删除全部数据方式一
- 语法:DELETE FROM 表名;
- 注意:使用该方式会延用之前的自动增长
- 删除所有记录方式二
- 语法:TRUNCATE TABLE 表名 ;
- 注意:当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小
10.SQL查询
查询是指从数据库中获取所需要的数据,用户可以根据自己的需求来查询不同的数据。
10.1 SELECT语句
MySQL从数据表中查询数据的基本语句是 SELECT 语句。在 SELECT 语句中,可以根据自己对数据的需求,使用不同的查询条件。
语法
SELECT [DISTINCT] * |{字段名1,字段名2,字段名3,…}
FROM表名
[WHERE条件表达式1]
[GROUP BY 字段名 [HAVING 条件表达式2]]
[ORDER BY 字段名[ASC|DESC]]
[LIMIT [OFFSET]记录数]
语法解释:
- SELECT [DISTINCT] * |{字段名1,字段名2,字段名3,…}查询的指定字段
- 星号(*)通配符表示查询表中所有字段,二者为互斥关系,任选其一。
- DISTINCT是可选参数,用于剔除查询结果中重复的数据
- FROM表示从指定的表中查询数据。
- WHERE条件表达式1:WHERE是可选参数,用于指定查询条件
- GROUP BY:用于结合合计函数,根据一个或多个列对结果集进行分组。
- ORDER BY 语句用于根据指定的列对结果集进行排序。
- LIMIT 可以用于强制 SELECT 语句返回指定的记录数
10.2 条件查询
语法:SELECT * FROM 表名 WHERE 条件表达式;
- 条件表达式是指SELECT 语句的查询条件
- 在 MYSQL中,提供了一系列的关系运算符,在 WHERE子句中可以使用关系运算符连接操作数作为查询条件对数据进行过滤
- 运算符
案例演示:
关系运算符
说明
关系运算符
说明
=
等于
<=
小于等于
<>
不等于,等价!=
>
大于
!=
不等于,等价<>
>=
大于等于
<
小于
1. 查询student表中id为4的教师姓名
2.查询姓名为赵六的教师
10.2.1 IN关键字查询
查询指定条件内的所有数据
语法
SELECT *(或列名列表)
FROM 表名
WHERE 字段名 [NOT] IN (元素1,元素2);
(NOT表示非)
案例示例:
1. 查询id值为1、2、3的记录
2. 查询名字是李四、王五的记录
3.查询不在指定范围内的记录,去除id为1、2、3的记录
10.2.2 BETWEEN AND
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
语法
SELECT 字段名
FROM 表名
WHERE 字段名 [NOT] BETWEEN 值1 AND 值2;
(NOT表示非)
- 值 1 表示范围的起始值
- 值 2 表示范围的结束值
案例演示:
1.查询id值在2~5之间的学生姓名
2.查询id值在不在2~5之间的学生姓名,使用NOT
10.2.3 空值查询
使用IS NULL 关键字来判断字段的值是否为空值
语法:
SELECT * FROM 表名
WHERE 字段名 IS [NOT] NULL;
案例演示:
1.查询code为null的记录
2.查询code不为null的记录
10.2.4 带DISTINCT关键字的查询
使用IS NULL 关键字来判断字段的值是否为空值
语法
SELECT DISTINCT 列名称 FROM 表名称
(具体案例如:9.2 SELECT查询语句)
10.2.5 带LIKE关键字查询
LIKE 可以对字符串进行模糊查询,例如查询student表中字段以y开头的记录
语法
SELECT *
FROM 表名
WHERE 字段名 [NOT] LIKE '匹配字符串';
NOT 表示查询与指定字符串不匹配的记录
10.2.5.1 百分号(%)通配符
匹配任意长度的字符串,包括空字符串,例如:字符串"w%"匹配以字符w开始,任意长度的字符串,如"www"、"waa"等。
案例演示:
1.查询Teacher表中name字段以字符"w"的记录
2.查询Teacher表中name字段值以字符串"w"开始"g"结尾的记录
3.查询Teacher表中name字段值包含“g”的记录
10.2.5.2 下划线通配符
下划线通配符值匹配单个字符串,如果需要匹配多个,那么需要多个下划线
案例演示:查询Teacher表中name字段以字符串“we”开始,“ong”结束,并且两个字符串中间只有两个字符串的记录。
注意事项
- 百分号和下划线是通配符,它们在数据库中有特殊含义,因此,如果匹配字符串之后你的百分号和下划线,就需要在通配符中使用右斜线(“\”)对百分号和下划线进行转意。
- 例如查询带百分号的字段
10.2.6 AND关键字多条件查询
进行查询时,有时为了更加精确,可以使用多个查询条件
语法
SELECT * 字段1、字段2
FROM 表名
WHERE 条件表达式1 AND 条件表达式2...;
案例演示:查询Teacher表中id字段值小于5,并且 age 字段值为 25 的学生信息
10.2.7 带OR关键字的多条件查询
和AND的区别是:只要记录满足一个条件即可被查询出来
语法
SELECT * 字段名1、字段2
FROM 表名
WHERE 条件表达式1 OR 条件表达式2...;
案例演示:查询Teacher表中id字段值小于5,或者 age 字段值为 25 的学生信息
10.3 高级查询
10.3.1 聚合函数
实际开发中,经常需要对某些数据进行统计、取最大值、最小值、平均值等,因此,MySql中提供了一些函数来实现这些功能。
函数名称
作用
COUNT()
返回某列的行数
SUM()
返回某列值的和
AVG()
返回某列的平均值
MAX()
返回某列最大值
MIN()
返回某列最小值
10.3.1.1.COUNT()函数:总计记录的行数
语法:SELECT COUNT(*) FROM 表名;
案例演示:
1.统计所有老师的总数
2.统计成绩大于60的教师有多少个?
3.统计score+age小于等于100的人数有多少?
10.3.1.2 SUM:求和(某列)
语法:SELECT SUM(字段名) FROM 表名
案例演示:
1.统计所有老师成绩之和
2.统计所有老师年龄、成绩之和
3.统计所有老师的平均年龄
10.3.1.3 AVG (求出某个字段所有值的平均值)
语法: SELECT AVG(字段名) FROM 表名;
示例代码:
求所有老师的平均年龄
10.3.1.4 MAX(最大值) MIN(最小值)
语法:SELECT MAX(字段名) FROM 表名;
语法:SELECT MIN(字段名) FROM 表名;
案例演示:
1.求最高分
2.求最低分
10.4 排序查询
从表中查询出来的数据可能是无序的,或者其排列顺序不是用户期望的。为了使查询结果满足用户的要求,可以使用 ORDER BY对查询结果进行排序
语法
SELECT 字段名1
FROM 表明
ORDER BY 字段名1 ASC| DESC;
默认的排序是升序的
ASC 升序
DESC 降序
案例演示:
1.按照年龄升序排序数据
2.按照成绩降序排序数据
10.5 分组操作(了解)
在对表数据进行统计时,可能需要按照一定的类别进行统计,比如分别统计25岁的学生成绩之和 。这时可以使用GROUP BY 按照某个字段或者多个字段中的值进行分组,字段值相同为一组
语法
SELECT 字段名1,字段名2
FROM 表名
GROUP BY 字段名1,字段名2;
注意:该查询只显示分组的第一条数据
案例演示:
对age进行分组
10.5.1 GROUP BY 和聚合函数一起使用
配合使用可以统计出某个或者某些字段在一个分组中的最大值、最小值、平均值等。
案例演示:
查询各个年龄段的教师个数:
10.5.2 GROUP BY 和 HAVING 关键字一起使用
HAVING 关键字和 WHERE 关键字作用相同,区别在于HAVING 关键字后可以跟聚合函数,WHERE关键字不能
案例演示:按照score字段进行分组查询,查询出score字段值之和大于70的分组
10.6 LIMIT限制查询结果的数量
查询数据时,可能会返回很多条记录,而用户需要的记录可能只是其中的一条或者几条,比如实现分页功能,每页显示10条信息,每次查询就只需要查出10条记录。为此, MySQL中提供了一个关键字 LIMIT,可以指定查询结果从哪一条记录开始以及一共查询多少条信息
Limit子句可以被用于强制 SELECT 语句返回指定的记录数。Limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
语法
SELECT 字段名
FROM 表名
LIMIT 记录数;
1.初始记录行的偏移量是 0(而不是 1):
mysql> SELECT * FROM table LIMIT 5,10; //检索记录行6-15
2.为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last
3.如果只给定一个参数,它表示返回最大的记录行数目。
换句话说,LIMIT n 等价于 LIMIT 0,n:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
案例演示:查询前4条记录数