什么是数据库
- 数据库(DataBase) 就是存储和管理数据的仓库
- 其本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上
为什么使用数据库
数据存储方式的比较
存储方式 | 优点 | 缺点 |
---|---|---|
内存 | 速度快 | 不能够永久保存,数据是临时状态的 |
文件 | 数据是可以永久保存的 | 使用IO流操作文件, 不方便 |
数据库 | 1.数据可以永久保存 2.方便存储和管理数据 3.使用统一的方式操作数据库 (SQL) | 占用资源,有些数据库需要付费(比如Oracle数据库) |
通过上面的比较,我们可以看出,使用数据库存储数据, 用户可以非常方便对数据库中的数据进行增加, 删 除, 修改及查询操作。
SQL的概念
什么是SQL ?
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL 的作用
是所有关系型数据库的统一查询规范,不同的关系型数据库都支持SQL
所有的关系型数据库都可以使用SQL
不同数据库之间的SQL 有一些区别 方言
SQL通用语法
-
SQL语句可以单行 或者 多行书写,以分号 结尾 ; (Sqlyog中可以不用写分号)
-
可以使用空格和缩进来增加语句的可读性。
-
MySql中使用SQL不区分大小写,一般关键字大写,数据库名 表名列名 小写。
-
注释方式
注释语法 | 说明 |
---|---|
-- 空格 | 单行注释 |
/* */ | 多行注释 |
# | MySql特有的单行注释x |
# show databases; 单行注释
-- show databases; 单行注释
/*
多行注释
show databases;
*/
SQL的分类
分类 | 说明 |
---|---|
数据定义语言 | 简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。 |
数据操作语言 | 简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。 |
数据查询语言 | 简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。 |
数据控制语言 | 简称DCL(Date Control Language),用来定义数据库的访问权限和安全级别,及创建用户。 |
DDL操作 数据库(CRUD)
人们经常说的CRUD是什么意思?
对数据库操作的分类包含
C create 创建
R retrieve 查询
U update 修改
D delete 删除
创建数据库
命令 | 说明 |
---|---|
create database 数据库名; | 创建指定名称的数据库。 |
create database 数据库名 character set 字符集; | 创建指定名称的数据库,并且指定字符集(一般都指定utf-8) |
代码示例
/*
方式1 直接指定数据库名进行创建
默认数据库字符集为:latin1
*/
CREATE DATABASE db1;
/*
方式2 指定数据库名称,指定数据库的字符集
一般都指定为 utf8,与Java中的编码保持一致
*/
CREATE DATABASE db1_1 CHARACTER SET utf8;
查看/选择数据库
命令 | 说明 |
---|---|
use 数据库 | 切换数据库 |
select database(); | 查看当前正在使用的数据库 |
show databases; | 查看Mysql中 都有哪些数据库 |
show create database 数据库名; | 查看一个数据库的定义信息 |
代码示例
-- 切换数据库 从db1 切换到 db1_1
USE db1_1;
-- 查看当前正在使用的数据库
SELECT DATABASE();
-- 查看Mysql中有哪些数据库
SHOW DATABASES;
-- 查看一个数据库的定义信息
SHOW CREATE DATABASE db1_1;
修改数据库
命令 | 说明 |
---|---|
alter database 数据库名 character set 字符集; | 数据库的字符集修改操作 |
代码示例
-- 将数据库db1 的字符集 修改为 utf8
ALTER DATABASE db1 CHARACTER SET utf8;
-- 查看当前数据库的基本信息,发现编码已更改
SHOW CREATE DATABASE db1;
删除数据库
命令 | 说明 |
---|---|
drop database 数据库名 | 从MySql中永久的删除某个数据库 |
代码示例
-- 删除某个数据库
-- 语法格式 drop database 数据库名称 将数据库从MySql中永久删除
DROP DATABASE db1_1; -- 慎用
DDL操作 数据表
MySQL常见的数据类型
常用的数据类型:
类型 | 描述 |
---|---|
int | 整型 |
double | 浮点型 |
varchar | 字符串 |
date | 日期类型 年月日 没有时分秒 yyyy-MM-dd |
datetime | 日期时间类型 yyyy-MM-dd HH:mm:ss |
详细的数据类型
注意:MySQL中的 char类型与 varchar类型,都对应了 Java中的字符串类型,区别在于: - char类型是固定长度的: 根据定义的字符串长度分配足够的空间。 - varchar类型是可变长度的: 只使用字符串长度所需的空间
// 比如:保存字符串 "abc"
x char(10) 占用10个字节
y varchar(10) 占用3个字节
适用场景:
- char类型适合存储 固定长度的字符串,比如 密码 ,性别一类
- varchar类型适合存储 在一定范围内,有长度变化的字符串
创建表
语法格式
创建表的语法格式
create table 表名(
字段名称1 字段类型(长度),
字段名称2 字段类型,
字段名称3 字段类型 最后一个列不要添加逗号
);
SQL实现
-- 切换到数据库 db1
USE db1;
-- 创建表
CREATE TABLE category(
cid INT,
cname VARCHAR(20)
);
快速创建一个表结构相同的表(复制表结构)
-- 创建一个表结构与 test1 相同的 test2表
CREATE TABLE test2 LIKE test1;
-- 查看表结构
DESC test2;
查看表
命令 | 说明 |
---|---|
show tables; | 查看当前数据库中的所有表名 |
desc 表名; | 查看数据表的结构 |
代码示例
-- 查看当前数据库中的所有表名
SHOW TABLES;
-- 显示当前数据表的结构
DESC category;
-- 查看创建表的SQL语句
SHOW CREATE TABLE category;
删除表
命令 | 说明 |
---|---|
drop table 表名; | 删除表(从数据库中永久删除某一张表) |
drop table if exists 表名; | 判断表是否存在, 存在的话就删除,不存在就不执行删除 |
代码示例
-- 直接删除 test1 表
DROP TABLE test1;
-- 先判断 再删除test2表
DROP TABLE IF EXISTS test2;
修改表
修改表名
语法格式
rename table 旧表名 to 新表名
代码示例
-- 修改表名称 语法格式: rename table 旧表名 to 新表名
RENAME TABLE category TO category1;
修改表的字符集
语法格式
alter table 表名 character set 字符集
代码示例
-- 修改表的字符集为 gbk
-- 语法格式: alter table 表名 character set 字符集
ALTER TABLE category1 CHARACTER SET gbk;
向表中添加列, 关键字 ADD
语法格式
alert table 表名 add 字段名称 字段类型
代码示例
-- 语法格式: alter table 表名 add 字段名称 字段类型(长度)
-- 添加分类描述字段
ALTER TABLE category1 ADD cdesc VARCHAR(20);
修改表中列的 数据类型或长度 , 关键字 MODIFY
语法格式
alter table 表名 modify 字段名称 字段类型
代码示例
-- 修改cdesc 字段的长度为 50
ALTER TABLE category1 MODIFY cdesc VARCHAR(50); -- 修改字段长度
ALTER TABLE category1 MODIFY cdesc CHAR(20); -- 修改字段类型
修改列名称 , 关键字 CHANGE
语法格式
alter table 表名 change 旧列名 新列名 类型(长度);
代码示例
-- 语法格式: alter table 表名 change 旧列名 新列名 类型(长度)
-- 修改cdesc字段 名称改为 description varchar(30)
ALTER TABLE category1 CHANGE cdesc description VARCHAR(30);
删除列 ,关键字 DROP
语法格式
alter table 表名 drop 列名;
代码示例
-- 语法格式: alter table 表名 drop 列名
ALTER TABLE category1 DROP description;
DML 操作表中数据
SQL中的DML 用于对表中的数据进行增删改操作
插入数据
语法格式
insert into 表名 (字段名1,字段名2...) values(字段值1,字段值2...);
代码示例
1) 创建一个学生表:
/*
表名:student
表中字段:
学员ID, sid int
姓名, sname varchar(20)
年龄, age int
性别, sex char(1)
地址, address varchar(40)
*/
# 创建学生表
CREATE TABLE student(
sid INT,
sname VARCHAR(20),
age INT,
sex CHAR(1),
address VARCHAR(40)
);
2) 向 学生表中添加数据,3种方式:
- 方式1: 插入全部字段, 将所有字段名都写出来
INSERT INTO student (sid,sname,age,sex,address) VALUES(1,'孙悟空',18,'男','花果山');
- 方式2 插入全部字段 不写字段名
INSERT INTO student VALUES(2,'孙悟饭',5,'男','地球');
- 方式3 插入指定字段
INSERT INTO student (sid,sname) VALUES(3,'蜘蛛精');
3) 注意事项
-- 1.值与字段必须对应 个数&数据类型&长度 都必须一致
INSERT INTO student (sid,sname,age,sex,address) VALUES(4,'孙悟空',18,'男','花果山');
-- 2.在插入 varchar char date 类型的时候,必须要使用 单引号 或者双引号进行包裹
INSERT INTO student (sid,sname,age,sex,address) VALUES(4,'孙悟空',18,'男','花果山');
-- 3.如果插入空值 可以忽略不写 或者写 null
INSERT INTO student (sid,sname) VALUES(5,'唐僧');
INSERT INTO student (sid,sname,age,sex,address) VALUES(6,'八戒',NULL,NULL,NULL);
更改数据
语法格式1: 不带条件的修改
update 表名 set 列名 = 值
语法格式2: 带条件的修改
update 表名 set 列名 = 值 [where 条件表达式:字段名 = 值 ]
1)不带条件修改,将所有的性别改为女(慎用!!)
UPDATE student SET sex = '女';
2)带条件的修改,将sid 为3的学生,性别改为男
UPDATE student SET sex = '男' WHERE sid = 1;
3)一次修改多个列, 将sid为 2 的学员,年龄改为 20,地址改为 北京
UPDATE student SET age = 20 , address = '大唐' WHERE sid = 5;
删除数据(慎用!!!)
语法格式1: 删除所有数据
delete from 表名
语法格式2: 指定条件 删除数据
delete from 表名 [where 字段名 = 值]
1)删除 sid 为 1 的数据
DELETE FROM student WHERE sid = 1;
2) 删除所有数据
DELETE FROM student;
3) 如果要删除表中的所有数据,有两种做法
- delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作. 效率低
- truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高
TRUNCATE TABLE student;
DQL 查询表中数据
查询不会对数据库中的数据进行修改.只是一种显示数据的方式 SELECT
简单查询
语法格式
select 列名 from 表名
查询emp中的 所有数据
SELECT * FROM emp; -- 使用 * 表示所有列
查询emp表中的所有记录,仅显示id和name字段
SELECT eid,ename FROM emp;
将所有的员工信息查询出来,并将列名改为中文
- 别名查询,使用关键字 as
// 使用 AS关键字,为列起别名
SELECT
eid AS '编号',
ename AS '姓名' ,
sex AS '性别',
salary AS '薪资',
hire_date '入职时间', -- AS 可以省略
dept_name '部门名称'
FROM emp;
查询一共有几个部门
SELECT dept_name FROM emp;
去重操作 关键字 distinct
SELECT DISTINCT dept_name FROM emp;
将我们的员工薪资数据 +1000 进行展示
SELECT ename, salary+1000 AS salary FROM emp;
注意: 查询操作 不会对数据表中的数据进行修改,只是一种显示的方式.
条件查询
如果查询语句中没有设置条件,就会查询所有的行信息,在实际应用中,一定要指定查询条件,对记录进行过滤
运算符
1) 比较运算符
运算符 | 说明 |
---|---|
> < <= >= = <> != | 大于、小于、大于(小于)等于、不等于 |
BETWEEN ...AND... | 显示在某一区间的值 例如: 2000-10000之间: Between 2000 and 10000 |
IN(集合) | 集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒) in中的每个数据都会作为一次条件,只要满足条件就会显示 |
LIKE '%张%' | 模糊查询 |
IS NULL | 查询某一列为NULL的值, 注: 不能写 = NULL |
2) 逻辑运算符
运算符 | 说明 | ||
---|---|---|---|
-------- | |||
And && | 多个条件同时成立 | ||
Or | 多个条件任一成立 | ||
Not | 不成立,取反。 |
查询格式思维
1.查哪张表 2.查哪些字段 3.查询条件
查询员工姓名为黄蓉的员工信息
SELECT * FROM emp WHERE ename = '黄蓉'
查询薪水价格为5000的员工信息
SELECT * FROM emp WHERE salary = 5000;
查询薪水价格不是5000的所有员工信息
SELECT * FROM emp WHERE salary != 5000;
SELECT * FROM emp WHERE salary <> 5000;
查询薪水价格大于6000元的所有员工信息
SELECT * FROM emp WHERE salary > 6000;
查询薪水价格在5000到10000之间所有员工信息
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 10000;
SELECT * FROM emp WHERE salary >= 5000 AND salary <= 10000;
查询薪水价格是3600或7200或者20000的所有员工信息
-- 方式1 使用 or
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
-- 方式2 使用 in() 匹配括号中的参数
SELECT * FROM emp WHERE salary IN(3600,7200,20000);
模糊查询 通配符
2) 逻辑运算符
通配符 | 说明 |
---|---|
% | 表示匹配任意多个字符串 |
_ | 表示匹配 一个字符 |
查询含有'精'字的所有员工信息
SELECT * FROM emp WHERE ename LIKE '%精%';
查询以'孙'开头的所有员工信息
SELECT * FROM emp WHERE ename LIKE '孙%';
查询第二个字为'兔'的所有员工信息
SELECT * FROM emp WHERE ename LIKE '_兔%';
查询没有部门的员工信息
-- select * from emp where dept_name = null; 错误方式
SELECT * FROM emp WHERE dept_name IS NULL;
查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;
-- 条件查询 先取出表中的每条数据,满足条件的就返回,不满足的就过滤.