数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,
修改,删除及查询操作。
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。
数据库中以表为组织单位存储数据。
表类似我们的Java类,每个字段都有对应的数据类型
MYSQL :开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。Oracle :收费的大型数据库,Oracle公司的产品。Oracle收购
SUN公司,收购MYSQL。
DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中.
SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
SyBase :已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
SQLite : 嵌入式的小型数据库,应用在手机端。
当然我们最常用的数据库是:mysql、oracle
关系型数据库(RDBMS),关系型数据库绝对是 DBMS 的主流,其中使用最多的 RDBMS 分别是 Oracle、MySQL 和 SQL Server ,这些都是关系型数据库(RDBMS)。
关系型数据库以行(row)和列(column)的形式存储数据,以便于用户理解。这一系列的行和列被称为表(table),一组表组成了一个库(database) 。
表和表之间的数据记录是有关系的(relationship)。现实世界中的各种实体和实体之间的各种联系均可以使用关系模型来表示。关系型数据库,就是建立在关系模型基础上的数据库。
SQL 就是关系型数据库的查询语言。
非关系型数据库(非 RDBMS),可以看做是传统关系型数据库的功能的阉割版本,基于键值对的存储数据,不需要经过 SQL 层的解析,性能非常高。同时,通过减少不常用的功能,进一步挺高性能。
相比于 SQL,NoSQL 泛指非关系型数据库,包括了榜单上的键值性数据库、文档型数据库、搜索引擎和列存储等,除此之外还包括
图形数据库,也只有 NoSQL 一词才可以将这些技术囊括进去。
数据库是不认识JAVA语言的,但是我们同样要与数据库交互,这时需要使用到数据库认识的语言SQL语句,它是数据库的代码。
结构化查询语言(Structured Query Language)简称SQL,是关系型数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容
SQL分类:数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:INSERT,DELETE,UPDATE等
数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。主要的语句关键字包括GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT 等。
数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,WHERE等。
事务控制语言:简称 TCL(Transaction Control Language),COMMIT提交事务、ROLLBACK 回滚事务。
SQL通用语法:
例如:
#:单行注释
标点符号:
命名规则:
# 表名错误,因为表名有空格
create table student info(…);
# 起别名时,as 都可以省略,如果字段别名中没有空格,那么可以省
略""
select id as "编号", `name` as "姓名" from t_stu;
\# 错误,如果字段别名中有空格,那么不能省略""
select id as 编 号, `name` as 姓 名 from t_stu;
E-R(entity-relationship,实体-联系)模型中有三个主要的概念:实体集、属性和联系集。
一个实体集(class)对应数据库中的一个表(table);一个实体(instance)则对应数据库表中的一行(row),也称为一条
记录(record);一个属性(attribute)对应于数据库表中的一列(column),也称为一个字段(field)。
格式:
create database 数据库名;
create database 数据库名 character SET 字符集; # 可以
设置数据库的字符编码
例如:
CREATE DATABASE java1;
CREATE DATABASE myDatabase character SET gbk;
SHOW DATABASES;
SHOW CREATE DATABASE 数据库名;
例如:
SHOW CREATE DATABASE java1;
格式:
DROP DATABASE 数据库名称;
例如:
DROP DATABASE java1;
select database();
use 数据库名;
###数据库操作
# 创建数据库 (默认字符集: UTF-8 , 此编码为安装时设置)
CREATE DATABASE java2;
#显示所有数据库
SHOW DATABASES;
#显示数据库的创建信息
SHOW DATABASE JAVA2;
#删除数据库
DROP DATABASE JAVA2;
格式:
create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
...
);
类型:
varchar(n) 字符串
int 整形
double 浮点
date 日期
timestamp 时间戳
datetime 日期时间
约束:
Primary key 主键,被主键修饰字段中的数据,不能重复、不能为
null。
Not null 非空约束
Unique 唯一约束
Default 默认约束
格式:
SHOW tables;
格式:
SHOW CREATE tables 表名;
格式:
DESC 表名;
格式
drop table 表名;
alter table 表名 add 字段名 类型(长度) [约束];
作用:新增表添加列
例如:
ALTER TABLE t_student ADD classname varchar(50) ;
alter table 表名 modify 列名 类型(长度) [约束];
作用:修改表修改列的类型长度及约束
例如:
ALTER TABLE t_student modify classname int;
alter table 表名 change 旧列名 新列名 类型(长度) [约束];
作用:修改表修改列名
例如:
ALTER TABLE t_student change classname classname2 int ;
alter table 表名 drop 列名;
作用:修改表删除列.
例如:
ALTER TABLE t_student drop classname2;
alter table 表名 character SET 字符集;
作用:修改表的字符集
例如:
#6, 将学生表 t_students 的编码表进行修改,修改成 gbk
ALTER TABLE t_student character set gbk;
rename table 旧表名 to 新表名;
作用:修改表名
例如:把t_student表名改成student
rename table t_student to student;
#######表 table
# 创建表--t_user
## 有主键 字段id,username,password,phone,remark
create table t_user(
id int primary key,
username char(30) ,
password char(30) ,
phone int ,
remark char(20)
);
## 创建表之后,可以查询创建表语句 (数据在可视化视图中显示不
全)
show create tables t_user;
##查看表结构
desc t_user;
#删除表
drop table t_user;
#修改表结构 -- 如果SQL语句中使用到关键字,建议使用重音符括住
##添加字段 -- address
alter table t_user add address int;
##修改字段类型
alter table t_user modify address char(255);
##修改整个字段
alter table t_user change address address2 char(10);
##删除字段
alter table t_user drop address2;
##修改表名 -- 修改成user
rename table t_user to tuser;
##修改字符集 -- 修改成gbk
alter table tuser character set gbk;
语法
-- 向表中插入某些字段
INSERT INTO 表名 (字段1,字段2,字段3) VALUES (值1,值2,值
3);
--向表中插入所有字段,字段的顺序为创建表时的顺序
INSERT INTO 表 VALUES (值1,值2,值3..); # 简写
注意:
create table student(
sid int(20) primary key,
sname varchar(60) not null,
email varchar(60),
isdel varchar(10) default '1'
);
insert into
student(sid,sname,email,isdel)values(1001,'张
三','[email protected]','1');
insert into student(sid,sname,email,isdel)
values(1001,'李四','[email protected]','0');
insert into student values(1003,'王
五','[email protected]','0');
用来修改指定条件的数据,将满足条件的记录指定列修改为指定值
--更新所有记录的指定字段
UPDATE 表名 SET 字段名1=值1,字段名2=值2,...;
--更新符号条件记录的指定字段
UPDATE 表名 SET 字段名1=值1,字段名2=值2,... WHERE 条件;
注意:
#把王五改成王小五
update student set sname='王小五';
#加筛选条件
update student set sname='王小五' where sid = 1003;
update student set sname='王五
五',isdel='1',email='[email protected]' where sid =
1003;
语法:
DELETE from 表名 [WHERE 条件];
或者
truncate table 表名
注意:删除数据时要小心
#删除数据
delete from student where sid=1003;
delete from student;
truncate table student;
truncate与delete有什么区别?
DELETE 一条一条删除,不清空auto_increment记录数。
truncate 直接将表删除,重新建表,auto_increment将置为零,
从新开始。
create table student(
sid int(20) primary key auto_increment,
sname varchar(60) not null,
email varchar(60),
isdel varchar(10) default '1'
);
#auto_increment设置sid自动增长,默认从1开始
## 删除所有,不清空自动增长列记录数。
DELETE FROM student;
## 删除所有,将清空自动增长列记录数。
TRUNCATE TABLE student;
准备数据:
#创建商品表:
create table d_product(
pid int primary key,
pname varchar(20),
price double,
category_id varchar(32)
);
#插入数据
INSERT INTO d_product VALUES ('1', '苹果', '5000',
'c001');
INSERT INTO d_product VALUES ('2', 'vivo', '3000',
'c001');
INSERT INTO d_product VALUES ('3', '华为', '5000',
'c001');
INSERT INTO d_product VALUES ('4', 'oppo', '1000',
'c001');
INSERT INTO d_product VALUES ('5', '真维斯', '200',
'c002');
INSERT INTO d_product VALUES ('6', 'only', '440',
'c002');
INSERT INTO d_product VALUES ('7', '圣迪奥', '800',
'c002');
INSERT INTO d_product VALUES ('8', 'vero moda',
'800', 'c003');
INSERT INTO d_product VALUES ('9', '相宜本草', '200',
'c003');
INSERT INTO d_product VALUES ('10', '卫龙辣条', '5',
NULL);
INSERT INTO d_product VALUES ('11', '好想你枣', '56',
NULL);
INSERT INTO d_product VALUES ('12', '香飘飘奶茶',
'3', NULL);
INSERT INTO d_product VALUES ('13', '小浣熊干脆面',
'1', NULL);
INSERT INTO d_product VALUES('14','aop','300',NULL);
INSERT INTO d_product
VALUES('15','p_aop','500',NULL);
INSERT INTO d_product VALUES ('16', 'sda', '53',
NULL);
#创建商品表: COMMENT表示注释
CREATE TABLE emp(
EMPNO int(11) PRIMARY KEY COMMENT '员工编号',
ENAME varchar(10) COMMENT '员工姓名',
JOB varchar(9) COMMENT '工作',
MGR int(11) COMMENT '经理编号',
HIREDATE date COMMENT '入职日期',
SAL double COMMENT '工资',
COMM double COMMENT '奖金',
DEPTNO int(11) COMMENT '部门号'
);
#插入数据
INSERT INTO emp VALUES (7369, 'SMITH', 'CLERK',
7902, '1980-12-17', 1002, NULL, 20);
INSERT INTO emp VALUES (7499, 'ALLEN', 'SALESMAN',
7698, '1981-02-20', 1600, 300, 30);
INSERT INTO emp VALUES (7521, 'WARD', 'SALESMAN',
7698, '1981-02-22', 1250, 500, 30);
INSERT INTO emp VALUES (7566, 'JONES', 'MANAGER',
7839, '1981-04-02', 2975, 0, 20);
INSERT INTO emp VALUES (7654, 'MARTIN', 'SALESMAN',
7698, '1981-09-28', 1250, 1400, 30);
INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER',
7839, '1981-05-01', 2850, NULL, 30);
INSERT INTO emp VALUES (7782, 'CLARK', 'MANAGER',
7839, '1981-06-09', 2450, NULL, 10);
INSERT INTO emp VALUES (7788, 'scott3', 'ANALYST',
7566, '1987-07-03', 3000, NULL, 20);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT',
NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO emp VALUES (7844, 'TURNER', 'SALESMAN',
7698, '1981-09-08', 1500, 0, 30);
INSERT INTO emp VALUES (7876, 'ADAMS', 'CLERK',
7788, '1987-07-13', 1100, NULL, 20);
INSERT INTO emp VALUES (7900, 'JAMES', 'CLERK',
7698, '1981-12-03', 950, NULL, 30);
INSERT INTO emp VALUES (7902, 'FORD', 'ANALYST',
7566, '1981-12-03', 3000, NULL, 20);
INSERT INTO emp VALUES (7934, 'MILLER', 'CLERK',
7782, '1981-01-23', 1300, NULL, 10);
查询语法
select 字段名1 , 字段名2 ,.......
from 表名
[where 筛选条件]
或
select *
from 表名
[where 筛选条件]
解释: * 通配符,表示所有字段(所有列名)
● 一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配
符 * 。使用通配符虽然可以节省输入查询语句的时间,但是获取不需
要的列数据通常会降低查询和所使用的应用程序的效率。通配符的优势
是,当不知道所需要的列的名称时,可以通过它获取它们。
● 在生产环境下,不推荐直接使用 SELECT * 进行查询
#1.查询所有
select * from d_product;
#2.查询pname和price
select pname,price from d_product;
#3.别名查询.使用的关键字是as(as可以省略的).
#3.1表别名:
select d.pname,d.price from d_product as
d,t_product as t;
#3.2列别名:
select avg(price) as avgPrice from d_product;
select category_id cid from d_product;
#4.去掉重复值.
select distinct price from d_product;
#5.查询结果是表达式(运算查询):将所有商品的价格打九折进行显
示.
select price*0.8 as newPrice from d_product;
#6.空值参与运算(空值就是 null,所有运算符或列值遇到 null值,
运算的结果都是 null)
注意:
● 在 MySQL 中,null 不等于空字符串或 0 。一个空字符串的
长度是 0 ,而空值的长度是空。
● 在 MySQL 中,null 是占用空间的。
#7.查询员工 id、月薪、奖金率、年薪
SELECT
empno,
sal as "月薪",
comm as "奖金率",
sal * ( 1 + IFNULL( comm, 0 )) * 12 as "年薪"
FROM
emp;
#8.着重号(我们需要保证表中的字段、表名等没有和保留字、数据库系
统或常用方法冲突,如果真的相同,请在 SQL 语句中使用一对 ``(着
重号)引起来。)
SELECT * FROM `order` ;
#9.查询常数
● 一般来说,我们只从一个表中查询数据,通常是不需要增加一
个固定的常数列了;但是,如果我们想要整合不同的数据源,用常数列
作为这个表的标记,就需要查询常数了。
● 示例:给员工表增加列字段 company ,这个固定列的值为
"家里蹲大学"
SELECT
'家里蹲大学' company,
ename,
job
FROM
emp;
#1.查询emp表中员工 12 个月的工资总和,并取名为ANNUAL_SALARY
#2.查询emp表中去除重复的 job 以后的数据
由于互联网产品中提供的信息通常比较多,用户在使用互联网产品的过程中,可能会遇到查找信息时路径长,甚至无法找到合适的信息和内容的问题。通过筛选功能可以让用户通过设置筛选条件的方式,从产品中大量的信息中迅速找到符合筛选条件的内容。从而大大降低用户的查找成本,减少用户查找时间,提升用户体验。从上面的描述中可以看到, 筛选功能的目的是让用户在面对互联网产品中海量的信息和内容时,通过让用户设置筛选条件进行快速的查找和搜索,缩短用户查找路径。帮助用户快速找到符合条件的内容和信息,节省用户查找信息时间,提升用户体验
例如:
#查询价格是为偶数的商品信息
select * from d_product where price%2 =0;
select * from d_product where MOD(price,2) =0;
#查询价格为800商品
select * from d_product where price=800;
select * from d_product where not (price>800 or
price <800);
#查询价格不是800的所有商品
select * from d_product where price!=800;
select * from d_product where price>800 or price
<800;
select * from d_product where not(price=800);
select * from d_product where price <> 800;
#查询商品价格大于800元的所有商品信息
select * from d_product where price>800;
#查询商品价格在800到2000之间所有商品
select * from d_product where price>=800 and price
<=2000;
select * from d_product where price between 800 and
2000;
#查询商品价格是200或800的所有商品
select * from d_product where price=800 or
price=200;
select * from d_product where price in (200 ,800);
#查询含有'o'字的所有商品
select * from d_product where pname like '%o%';
#查询pname中第一个字符含有'o'字的所有商品
select * from d_product where pname like 'o%';
#查询pname中第二个字符含有'o'字的所有商品
select * from d_product where pname like '_o%';
#查询pname中第四个字符含有'o'字的所有商品
select * from d_product where pname like '___o%';
#商品没有分类的商品
select * from d_product where category_id is null;
#查询有分类的商品
select * from d_product where category_id is not
null;
1.商品名称以o结尾
select * from d_product where pname like '%o';
2.筛选价格大于等于800同时小于等于3000的商品
select * from d_product where price>=800 and price
<=3000;
3.筛选价格不等于800的商品
select * from d_product where price!=800
4.筛选出价格在800以上,同时包含o字符的商品id和名称、价格
select pid,pname,price from d_product where
price>800 and pname like '%o%';
5.筛选出价格高于oppo价格的商品
select * from d_product where price>(select price
from d_product where pname='oppo');
值。
SELECT
LEAST ( 1, 0, 2 ), # 整数 返回0
LEAST( 'b', 'a', 'c' ), # 字符串 返回a
LEAST( 1, NULL, 2 ) # 有null 返回null
FROM
DUAL;
语法格式为:GREATEST(值1,值2,…,值n)。其中,n 表示参数列表中有 n 个值。当有两个或多个参数时,返回值为最大值。假如任意一个自变量为 NULL ,则 GREATEST() 的返回值为NULL 。
当参数中是整数或者浮点数时,GREATEST 将返回其中最大的值;当参数为字符串时,返回字母表中顺序最靠后的字符;当比较值列表中有 NULL 时,不能判断大小,返回值为 NULL 。
SELECT
GREATEST( 1, 0, 2 ), # 整数 返回2
GREATEST( 'b', 'a', 'c' ), # 字符串 返回c
GREATEST( 1, NULL, 2 ) # 有null 返回null
FROM
DUAL;
#查询 pname 中第二个字符是 '_' 且第三个字符是 'a' 的商品信
息
SELECT
*
FROM
d_product
WHERE
pname LIKE '_\_a%' ;
或
SELECT
*
FROM
d_product
WHERE
pname LIKE '_$_a%' ESCAPE '$';
REGEXP 运算符用来匹配字符串,语法格式为: expr REGEXP匹配条件 。
如果 expr 满足匹配条件,返回 1 ;如果不满足,则返回 0 。若expr 或匹配条件任意一个为 NULL ,则结果为 NULL 。
REGEXP 运算符在进行匹配时,常用的有下面几种通配符:
‘^’ 匹配以该字符后面的字符开头的字符串。
‘$’匹配以该字符前面的字符结尾的字符串。
‘.‘匹配任何一个单字符。
“[...]” 匹配在方括号内的任何字符。例如,“[abc]” 匹配 “a”
或 “b” 或 “c” 。为了命名字符的范围,使用一个 ‘-’ 。“[a-z]”
匹配任何字母,而 “[0-9]” 匹配任何数字。
‘*’ 匹配零个或多个在它前面的字符。例如,“x*” 匹配任何数量的
‘x’ 字符,“[0-9]*” 匹配任何数量的数字, 而 “*” 匹配任何数量
的任何字符
SELECT
'hcj' REGEXP '^h',
'hcj' REGEXP 'j$',
'huangchuanjian' REGEXP 'jian'
FROM
DUAL;
xpr REGEXP匹配条件 。
- 如果 expr 满足匹配条件,返回 1 ;如果不满足,则返回 0 。若expr 或匹配条件任意一个为 NULL ,则结果为 NULL 。
- REGEXP 运算符在进行匹配时,常用的有下面几种通配符:
‘^’ 匹配以该字符后面的字符开头的字符串。
‘$’匹配以该字符前面的字符结尾的字符串。
‘.‘匹配任何一个单字符。
“[…]” 匹配在方括号内的任何字符。例如,“[abc]” 匹配 “a”
或 “b” 或 “c” 。为了命名字符的范围,使用一个 ‘-’ 。“[a-z]”
匹配任何字母,而 “[0-9]” 匹配任何数字。
‘’ 匹配零个或多个在它前面的字符。例如,“x” 匹配任何数量的
‘x’ 字符,“[0-9]” 匹配任何数量的数字, 而 “” 匹配任何数量
的任何字符
###### 示例:
```sql
SELECT
'hcj' REGEXP '^h',
'hcj' REGEXP 'j$',
'huangchuanjian' REGEXP 'jian'
FROM
DUAL;
#一、将 DDL--表结构操作(重点) 全部重写一遍
#二、根据上述数据完成下面的查询作业
#1.查询商品名称为“卫龙辣条”的商品所有信息:
#2.查询价格为800商品
#3.查询价格不是800的所有商品
#4.查询商品价格大于60元的所有商品信息
#5.查询商品价格在200到1000之间所有商品
#6.查询商品价格是200或800的所有商品
#7.查询含有'霸'字的所有商品
#8.查询以'香'开头的所有商品
#9.查询第二个字为'想'的所有商品
#10.商品没有分类的商品
#11.查询有分类的商品
#12.把商品名为苹果改为苹果14
#13.插入华为手机,价格5999,分类为c001
#14.找到名字长度为6个字符的商品信息
#15.找出oppo同分类的商品信息
#16.删除华为手机信息