数据库基本概念
- 数据库(DataBase):数据库就是存储数据的仓库
- 数据库管理系统(DBMS):可以独立运行的软件,维护磁盘上的数据,用统一的方式维护不同种类的数据,做到通用且高效。
- 常见的DBMS:
- mysql
- oracle
- db2
- sqlserver
- 数据库实例可以被视为数据库管理系统的一个运行实体。
数据库与表的概念
- 在DBMS中,一个项目中用到的所有数据都可以以一个数据库形式保存在一起。每种不同的数据都是以表的形式保存。
数据库中表的概念
- 表用来保存数据,一张表是由行和列构成
- 列被称为字段:保存一组数据中各个属性
- 行被称为记录:保存具体的一条信息。
如下是一张用户表
如何操作数据库系统
所有的DBMS都支持一种结构化查询语句进行对应的操作。我们以客户端的角度与DBMS进行连接,并发送对应的语句进行操作。
结构化查询语言:Structured Query Language简称为SQL
SQL是有标准的:SQL92已经SQL99,所有数据库都支持SQL92标准
数据库连接方式
数据库连接有:命令行
、图形化界面软件
、JDBC连接
- 命令行形式
- 图形化界面
- 使用JDBC连接以及数据库连接池的形式
- 在集成开发环境中使用(ECLIPSE,IDEA)
- 我们编写的JAVA程序也是通过JDBC连接
SQL
SQL主要分为以下几种类:DDL
、DML
、DQL
、TCL
、DCL
,接下来我们会一一的详细介绍这几种语言
DDL
DDL语言详细名称为data definition language,是数据定义语言,用来进行数据库对象操作的。
数据库对象包括不限于:数据库,表,视图,索引等
主要需要认识的关键字如下:CREATE
、ALTER
、DROP
操作数据库
查看当前DBMS中已有的数据库:SHOW DATABASES
新建一个数据库
sql
-- 基本语法
CREATE DATABASE 数据库名 [charset=字符集名称]
-- 例子1 创建一个名为mydb的数据库
CREATE DATABASE mydb;
-- 例子2 创建数据库时指定字符集
CREATE DATABASE mydb1 CHARSET=UTF8;
CREATE DATABASE mydb2 CHARSET=GBK;
查看数据库信息
sql
-- 语法
SHOW CREATE DATABASE 数据库名
-- 例子 查看到曾经创建mydb库时的SQL,查看指定的字符集信息。
SHOW CREATE DATABASE mydb
删除数据库
删库是一个危险操作,需谨慎,最好备份,skr
sql
-- 语法
DROP DATABASE 数据库名
-- 例子 删除数据库mydb1
DROP DATABASE mydb1;
-- 查询时发现mydb1已经被删除了
SHOW DATABASES;
使用数据库(切换到另一个数据库)
要保存数据都是要将数据保存在表中,而数据库相当于是表的集合。我们为不同的项目创建不同的数据库,在DBMS上要为不同的数据库的表进行操作时要先切换到对应的数据库上再进行相关操作。
语法:
sql
-- 语法
USE 数据库名
-- 例子切换到一个名为mydb的数据库上
USE mydb;
操作表
查看一个数据库中创建了多少张表
sql
SHOW TABLES
创建表
sql
-- 语法
CREATE TABLE 表名(
字段名1 类型[(长度)][默认值] [约束],
字段名2 ...
)
-- 例子 切换到mydb数据库上,将userinfo表创建在该库中
USE mydb;
-- 创建userinfo表
CREATE TABLE userinfo(
id INT primary key, -- 一张表第一个字段通常为ID(主键,唯一标识)
username VARCHAR(30), -- VARCHAR在数据库中是字符串类型
password VARCHAR(30), -- VARCHAR后面指定的长度为最多占用的字节数
nickname VARCHAR(30), -- 若使用UTF8编码,意味着最多保存10个汉字(每个汉字3字节)
age INT(3), -- 在MySQL中整数使用INT类型 注:不同数据库不同
sex TINYINT(1) DEFAULT 0 -- 创建TINYINT,如果新增值时为空,则默认为0
)
查看表结构和已创建表的信息
sql
-- 语法 查看表结构
DESC 表名
-- 例子 查看userinfo表的结构
DESC userinfo;
-- 语法 查看已创建的表的创建语句
SHOW CREATE TABLE 表名
-- 例子 查看创建userinfo表的信息
SHOW CREATE TABLE userinfo;
删除表
sql
-- 语法
DROP TABLE 表名
-- 例子 删除userinfo表
DROP TABLE userinfo;
修改表
修改表名
sql
-- 语法
RENAME TABLE 原表名 TO 新表名
-- 例子 将userinfo表改名为user
RENAME TABLE userinfo TO user
修改表结构
sql
-- 准备一张表
CREATE TABLE hero(
name VARCHAR(30),
age INT(3)
)
添加字段
sql
-- 语法
-- 添加新字段到表的第一行
ALTER TABLE 表名 ADD 字段名 类型 FIRST
-- 向表的末尾追加一个新的字段
ALTER TABLE 表名 ADD 字段名 类型
-- 将新字段添加到表中现有某个字段之后
ALTER TABLE 表名 ADD 字段名 类型 AFTER 表中现有某字段
-- -----------------------------------------------
-- 例子
-- 添加地址字段到hero表第一行
ALTER TABLE hero ADD address varchar(20) FIRST
-- 向hero表的末尾追加一个地址字段
ALTER TABLE hero ADD address varchar(20)
-- 将新字段地址添加到hero表中name字段之后
ALTER TABLE 表名 ADD address varchar(20) AFTER name
删除字段
sql
-- 语法
ALTER TABLE 表名 DROP 字段名
-- 例子 删除hero表中地址字段
ALTER TABLE hero DROP address
修改字段
sql
-- 语法
ALTER TABLE 表名 CHANGE 原字段名 新字段名 类型
-- 例子1 将hero表中的age字段长度改为5
ALTER TABLE hero CHANGE age age INT(5)
-- 例子2 将hero表中的age字段类型改为VARCHAR(10)
ALTER TABLE hero CHANGE age age VARCHAR(10)
-- 例子3 将hero表中的gender字段改为phonenumber
ALTER TABLE hero CHANGE gender phonenumber INT(11)
-- 例子4 将hero表中phonenumber字段添加非空约束
ALTER TABLE hero CHANGE phonenumber phonenumber INT(11) NOT NULL
修改表结构应当在表中还没有数据时进行,否则可能出现因修改与表中现有数据冲突导致修改失败
- 修改字段类型时,如果表中该字段原数据类型与新类型不匹配时,会导致原数据无法转换为新类型
- 性别字段,原类型VARCHAR,记录的值为"男"或"女"。现希望将性别字段改为INT型。会发生类型冲突
- 修改字段长度,长度减少可能导致失败
- 手机号字段,原有长度11位。现在想将其改为5位,会因为现有数据该字段值长度都为11不能缩短导致修改失败。
- 为现有字段添加约束,可能导致表中该现有记录该字段值存在不满足约束要求,导致修改失败。
- 性别字段开始没有非空约束,表中部分记录该字段值为NULL,此时若修改该字段并追加非空约束,会导致现有该字段为NULL值的记录不满足该约束,导致约束无法修改。
索引操作
创建索引
- 创建表的同时创建索引.(例如 create table tablename(...,index 索引名 (字段名)))
sql
drop table if exists student;
create table if not exists student
(
id bigint auto_increment,
first_name varchar(50) not null comment '学生名字',
last_name varchar(20) not null comment '学生姓',
phone varchar(15) not null comment '手机号',
email varchar(50) default '' comment '邮箱',
birthday date comment '出生日期',
create_time datetime default current_timestamp comment '注册日期',
primary key (id),
unique key (phone),
index h_index (email)
)engine = InnoDB character set utf8mb4;
- 创建表后通过create语句创建索引(例如 create index 索引名 on 表名(字段名))
- 创建表后通过alter语句创建索引(例如 alter table add index 索引名(字段名))
- 创建普通索引例子
sql
create index index_first_name on student(first_name);
alter table student add index index_last_name (last_name);
- 创建唯一索引例子
sql
create unique index index_first_name on student(first_name);
alter student add unique index index_email (email)
- 创建组合(联合)索引例子
sql
create index index_first_last on student(first_name,last_name);
alter table student add index index_first_last (first_name,last_name);
查看索引
sql
-- 语法,查看某张表上的索引
show index from 表名
删除索引
sql
-- 语法
drop index 索引名 on 表名;
-- 例子 删除student表中的index_first_last索引
drop index index_first_last on student;
DML
DML语言详细名称为data manipulation language,是数据操作语言,用来对表中的数据进行操作的。
主要需要认识的关键字如下:INSERT
、UPDATE
、DELETE
sql
-- 准备一张表:
CREATE TABLE person(
name VARCHAR(30),
age INT(3)
)
INSERT 插入数据
sql
-- 语法 注:在语法定义上[]中的内容是可写可不写的。
INSERT INTO 表名 [(字段1,字段2,字段3...)] VALUES (值1,值2,值3...)
-- 例子
INSERT INTO person (name,age) VALUES ('张三',22);
INSERT INTO person (age,name) VALUES (33,'李四');
注:
- 在SQL中字符串的字面量使用**单引号('')**括起来。
- VALUES后面指定的值的类型,顺序,个数要与前面指定的字段完全一致,且一一对应
插入默认值
当插入一条记录时,表中某字段没有指定时,则是插入该字段的默认值。若该字段没有明确指定过默认值时,默认值为NULL。
sql
-- 例如
INSERT INTO person (name) VALUES ('王五')
-- 上述SQL中没有指定age字段,此时该条记录插入后,age使用该字段的默认值NULL。
可以在创建表或后期修改表结构时,使用DEFAULT关键字为某个字段指定默认值
sql
-- 为person表中的age字段添加默认值:20
ALTER TABLE person CHANGE age age INT(3) DEFAULT 20;
-- 在创建表时为字段指定默认值:
CREATE TABLE person(
name VARCHAR(30) DEFAULT '无名氏',
age INT(3) DEFAULT 20
)
修改表为age添加默认值20
sql
-- 此时插入后的赵六记录中age应当已经采取了指定的默认值:20
INSERT INTO person(name) VALUES('赵六');
全列插入
在INSERT语句中没有指定字段名时就是全列插入,此时需要注意VALUES子句中指定的值的个数,顺序,类型必须与表中定义时指定的字段一致。
例
sql
INSERT INTO person VALUES('钱七',38)
-- 若想使用某个字段的默认值,可以使用DEFAULT关键字表达
INSERT INTO person VALUES('钱七',DEFAULT)
-- 若希望插入NULL值,可以使用NULL表达
INSERT INTO person VALUES('钱七',NULL)
-- 下面是错误的情况:
INSERT INTO person VALUES('钱七') 列的个数不匹配
INSERT INTO person VALUES(22,'钱七') 列的类型不匹配
查询插入
查询另一张表的数据插入到person表
sql
INSERT INTO person SELECT name,age FROM user
UPDATE 修改数据
sql
-- 语法
UPDATE 表名 SET 字段1=新值1[,字段2=新值2,...] [WHERE 过滤条件]
-- 例子 当缺少WHERE子句时,数据库会将person表中每条记录的age字段都改为15
UPDATE person SET age=15
修改指定的记录
仅将满足WHERE条件的记录进行修改。
sql
-- 将张三的年龄修改为22岁
UPDATE person SET age=22 WHERE name='张三'
-- 只要满足WHERE条件的记录都会被修改。
UPDATE person
SET age=36
WHERE age=15
WHERE子句常用的条件
=,>,>= >,<,<=,<>(不等于:<>。实际上!=也可以用。)
sql
-- 例子1 将年龄大于35岁的人年龄修改为30
UPDATE person
SET age=30
WHERE age>35
-- 例子2 将person表中每个人的年龄涨一岁
UPDATE person
SET age=age+1
修改多个字段的值
sql
-- 例子 将'李四'的名字改为'李老四'并且年龄改为50
UPDATE person
SET name='李老四',age=50
WHERE name='李四'
DELETE 删除数据
sql
-- 语法
DELETE FROM 表名 [WHERE 过滤条件]
注:DELETE语句中通常都要添加WHERE条件,否则是清空表操作!
sql
--例子1 删除'李老四'
DELETE FROM person
WHERE name='李老四'
-- 例子2 删除年龄大于30的人
DELETE FROM person
WHERE age>30
清空表操作
sql
DELETE FROM person
处理DELETE可以删除表的数据,还有一个TRUNCATE
也可以清空表,但是并不常用,如果要使用最好查询这个关键字的用法和使用后果
DQL
DQL语言详细名称为data query language,是数据查询语言,用来查询表中数据的。
主要需要认识的关键字如下:SELECT
sql
-- 基本语法
SELECT 字段1, 字段2
FROM 表名
WHERE 条件表达式;
-- 例子 查询person表中年龄为16的数据,且只展示name、sex、age字段
SELECT name, sex, age
FROM person
WHERE age = 16;
本章只是做介绍,所以并不会深入讲解DQL的其他关键字,例如:DISTINCT
、GROUP BY、HAVING、ORDER BY、LIMIT
TCL
TCL语言详细名称为transaction control lauguage,是事务控制语言,用来保证一些列数据库操作具有原子性,隔离性,一致性,持久性
主要需要认识的关键字如下:COMMIT
、ROLLBACK
事务需要在对数据库有一定了解后再去深入了解。
DCL
DCL语言详细名称为data control language,数据控制语言,进行数据库管理操作的,比如用户创建,权限分配等,是DBA经常使用的操作,DCL通常是用来确保使用合适的权限控制来保护数据库的安全性
主要需要认识的关键字如下:GRANT
、REVOKE
授予用户权限
sql
-- 语法
GRANT 权限 ON 数据库名[.表名] TO '用户名'@'主机名';
其中权限可以有:ALL PRIVILEGES
或具体的权限如 SELECT
, INSERT
, UPDATE
等
sql
-- 例子
GRANT SELECT,INSERT ON mydatabase.mytable TO 'pp'@'localhost';
撤销用户权限
sql
-- 语法
REVOKE 权限 ON 数据库名[.表名] TO '用户名'@'主机名';
其中权限可以有:ALL PRIVILEGES
或具体的权限如 SELECT
, INSERT
, UPDATE
等
sql
-- 例子
REVOKE SELECT,INSERT ON mydatabase.mytable TO 'pp'@'localhost';