1. 什么是数据库?
数据库(Database DB)是按照数据结构来组织、存储和管理数据的仓库(存储数据的仓库)
数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。
存储表结构数据,到现在可以海量数据Hbase。
数据库就是用来存储、查询、管理数据的一个仓库。----订单数据(数据库中可以从数据库中查询订单信息)
2. 数据库的分类?
按照早期的数据库理论,比较流行的数据库模型有三种,分别为层次式数据库、网络式数据库和关系型数据库(前两者已经基本消失)。而当今的互联网中,最常用的数据库模型主要是两种即 关系型数据库 和 非关系型数据库。
关系型数据库它是以行和列的形式存储数据[mysql oracle sqlServer等],非关系数据库则不是以行和列的形式存储【redis】
①关系型数据库:关系型数据库以行和列的形式存储数据,以便于用户理解。这一系列的行和列被称为表,一组表组成了数据库。类似于Excel表格,但是在关系型数据库中,列是固定的 行可以动态添加。常用的关系型数据库: MySQLOracle SQLserver 【.net语言C#】
②非关系型数据库:非关系型数据库也被称为NoSQL数据库,NoSQL的本意是“Not Only SQL”,指的是非关系型数据库,而不是“No SQL”的意思(没有SQL语句?),因此,NoSQL的产生并不是要彻底否定关系型数据库,而是作为传统关系型数据库的一个有效补充。NoSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。
3. 什么是SQL语言?
SQL 语言 多个关系型数据库基本通用
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
我们安装的是MySQL应用服务程序,用来管理 存取数据。SQL是一门编程语言,是用来在MySQL等关系型数据库中进行 数据的管理 存取操作的。
所以说 我们这门课程叫做 MySQL ,其实学习的是 SQL .
1、数据查询语言(DQL: Data Query Language):其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其它类型的SQL语句一起使用。
2、数据操作语言(DML:Data Manipulation Language):其语句包括动词INSERT、UPDATE和DELETE。它们分别用于添加、修改和删除。
3、数据定义语言(DDL):其语句包括动词CREATE,ALTER和DROP。在数据库中创建新表或修改、删除表(CREATE TABLE 或 DROP TABLE);为表加入索引等。
4. 事务控制语言(TCL):它的语句能确保被DML语句影响的表的所有行及时得以更新。包括COMMIT(提交)命令、SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。【mysql高级讲】
学习是SQL语言。 该语言用来操作关系型数据库。【DQL数据查询语言 DML 数据操作语言 DDL数据定义语言】
4. Mysql数据。
连接mysql数据。注意:保证mysql服务开着。 此电脑-->管理--->服务---Mysql正在运行。
连接mysql数据库的方式:
第一种: Mysql自带的客户端连接。
第二种: 使用命令: mysql -uroot -proot
-u:用户名
-p: 密码
第三种: 使用客户端软件 navicat 和sqlyog等
5. DDL语言
DDL通常指的是数据定义语言(Data Definition Language):数据库、表
-- 1. 创建数据库 语法: create database 数据库名;
create database qy174;
-- 2. 删除数据库 语法: drop database 数据库名
drop database qy174;
-- 3. 切换到指定的数据库。use 数据库名
use qy174;
-- 4. 创建表结构 语法: create table 表名(列名 数据类型,列名 数据类型....列名 数据类型);
-- 数据类型: int bigint float double decimal小数 varchar(长度)
-- 字符串类型 最大255 text文本类型 date日期类型
create table student(
id int,-- 学号
name varchar(10),
age int ,
salary decimal(10,2), -- 该数子有10,而小数2位
birthday date
);
-- 5. 删除表
drop table student;
-- ------------修改表的结构-------------
-- 6. 添加新列:alter table 表名 add column 列名 数据类型;
alter table student add column salary decimal(6,2);
-- 7. 删除指定的列:alter table 表名 drop column 列名;
alter table student drop column salary;
-- 8. 修改列的数据类型:alter table 表名 modify column 列名 新数据类型
alter table student modify column age double;
-- 9. 修改列的名字:alter table 表名 change column 原来的列名 新的列名 数据类型
alter table student change column age nianling double;
5.1约束类型
递增 必须为整型类型 auto_increment
是空 is not null
-- select * from t_user where age is not null;
5.2外键约束
一对多的关系:多的为主表
第一种:创建表时添加外键
create table 表名(
字段名 数据类型,
.........................
[constraint][外键名称] foreign key(外键字段名) references 主表(主表列名)
);
第二种:在创建完表之后添加外键
一的表名 自己拟定的 一里面的外键名 多的表名(字段名)
alter table 表名 add constraint 外键名称 foreign key(外键字段) references 主表(主表字段名);
6. DML语言
数据操作语言(DML:Data Manipulation Language):该语言主要用户对数据库表中的记录进行操作的。【增加 删除 修改】
create table t_user(
id int auto_increment primary key,-- auto_increment:递增 必须为整型类型
name varchar(20) not null,
age int,
sex char(2) DEFAULT '男'
);
-- 为表中所有列添加数据:insert into 表名 values(值,值,值.....)
insert into t_user values(1,'关文琪',19,'男');
-- 为指定列添加数据:insert into 表名(列名,列名...) values(值,值....)
insert into t_user(id,name) values(2,'王世琦');
-- 批量添加:insert into 表名(列名,列名...) values(值,值....),(值,值....)
insert into t_user(id,name) values(3,'刘德华'),(4,'张学友');
一定要注意: 值和列要个数匹配---一 一对应
delete from 表名; -- 删除表中所有的记录 [不建议使用]
-- 根据条件删除满足条件的记录:delete from 表名 where 条件;
delete from t_user where id=1;
--条件有哪些:
1. 关系运算符: >,>=,<,<=,=,!=
2. in运算符:
3. between and
4. 逻辑运算符: and(与) or(或)
-- 关系运算符
delete from t_user where age=25
-- in运算符
delete from t_user where age in(12,19,20,26);
-- 非in()
select * from t_user where age not in(18,20,15,99);
-- between and
delete from t_user where age between 19 and 25;
-- 逻辑运算符 and 两个都满足的记录 or 满足其中一个条件的记录
delete from t_user where id=14 and age>20;
delete from t_user where id=14 or age>20;
-- update 表名 set 列名=值,列名=值,列名=值.... where 条件;
注意: 最后一个列名=值不要使用,号
update t_user set age=18 where name='关文琪';
update t_user set name='马德华',age=99,sex='妖' where id=17;
7. DQL语言
数据查询语言(Data Query Language):用于查询数据表中记录。
select [列名...] from 表名 [where 条件]
查询的完整语法:(根据需求来添加相应内容)
select [distinct] [列名 as 别名,列名 别名, 列名][*]
from 表名
[where 条件]
[group by 分组列]
[having 分组后的条件]
[order by 排序的列]
[limit 起始记录,每页的条数]
-- 查询所有列的值语句
select * from t_user;
-- 查询指定列的值
select name,age from t_user;
-- 根据条件查询
select * from t_user where age>20 or sex='男';
select * from t_user where age in(19,20,25,29)
-- 模糊查询 like 通配符 %:统配n个字符 _:统配一个字符
-- 查找名字中含有琪
select * from t_user where name like '%琪%'
-- 查询姓刘
select * from t_user where name like '刘%'
-- 第二个字为琪的
select * from t_user where name like '_琪%'
-- 查找姓刘的且只要两个字
select * from t_user where name like '刘_'
-- 1.select 列名 as 别名,列名 as 别名 from 表名 【where 条件】
select name as 姓名,age as 年龄,sex as 性别 from t_user;
-- 2.select 列名 别名,列名 别名 from 表名 【where 条件】
select name 姓名,age 年龄,sex 性别 from t_user;
-- select distinct 列名,列名 ... from 表名 【where 条件】
select distinct id,name,age from t_user;
-- select * from 表名 order by 列1,列2...[desc降序 asc升序默认]
select * from t_user order by age desc,id desc;-- 先按照年龄升序,年龄相同按照id降序
-- select * from 表名 limit 起始记录,每页显示条数;
-- 规律: select * from t_user limit (current-1)*pageSize,pageSize;
-- 查询第一页的数据 每页显示三条
select * from t_user limit 0,3;
-- 查询第二页的数据 每页显示三条
select * from t_user limit 3,3
-- 查询第三页的数据current 每页显示三条PageSize
select * from t_user limit 6,3
-- 函数就是mysql中自带的函数。 5大聚合函数
sum():求和
count(): 求个数
avg():平均值
max():最大值
min():最小值
select sum(age) 年龄和,max(age) 最大年龄,min(age) 最小年龄,
count(id) 个数,avg(age) from t_user;
select age, age+1 from t_user where age+1>20;
-- select 分组的列...,聚合函数 from 表名 group by 列名... having 分组后的条件
-- 按照性别分组查询 人数大于等于3
select sex,count(id),max(age),name from t_user group by sex,name having count(id)>=2;
-- 注意: select 后只能跟聚合函数或分组的列名
(知道了解)
oracle数据库:
-- 40为pageCurrent * pageSize,30 应为为(pageCurrent - 1) * pageSize
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME
WHERE 1 = 1 -- 条件
ORDER BY CREATETIME DESC -- 排序
) A
WHERE ROWNUM <= 40
)
WHERE RN > 30
sqlServer数据库:
select top @pageSize *
from 表名
where 主键>=
(select max(主键)
from (
select top ((@pageIndex-1)*@pageSize+1) 主键
from 表名
order by 主键 asc) temp_max_ids)
order by 主键;
8. 导入导出sql语句
9. 查询sql执行的原理
sql语法:
select distinct * from 表名
where 条件
group by 分组
having 分组条件
order by 排序
limit 分页。
上面为他得语法结构。顺序不能乱。
--------------------------------------------------------------------------------------------
from 先确定从哪个表中取数据,所以最先执行from tab
where where语句是对条件加以限定,如果没有需要限定的,那就写where 1=1,表示总为true,无附加条件
having
聚合函数
select语句
distinct
order by
limit
eg:
-- 由于where先执行,select后执行,再执行where不知道别名n
select w_name n from workers where n='程西'
-- 因为from先执行--where 执行时指定别名为w,
select w_name n from workers w where w.w_name='程西'
10. 联表查询
什么是多表联合查询?
前面所讲的查询语句都是针对一个表的,但是在关系型数据库中,表与表之间是有联系的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。
为什么需要联表查询?
表和表之间有联系:外键
表与表之间有哪些联系:
多对一:eg:员工表和部门表、学生和班级 外键放置多一方
多对多:eg:学生和课程-----设置一个中间表
一对一:eg:丈夫和妻子表(很少)
联表查询的种类:
- 内连接inner join: 查询两个表中公共部分。
select * from 表名1 inner join 表名2 on 联表条件;
- 外连接:相当于查询左/右表的所有数据,包含公共部分(跟据联表条件相同的内容是公共部分)。
左外连接: 查询左边中所有的内容以及公共内容。
select * from 表名1 left join 表名2 on 联表条件;
右外连接: 查询右边中所有的内容以及公共内容。
select * from 表名1 right join 表名2 on 联表条件;
- 自连接: 自己和自己连接的表
selcet*from表名 [right/left] join 表名 on 联表条件;
内连接:
-- 查询员工信息以及员工对应的部门信息。(我们查询的内容不在一张表中 需要联表查询)
-- select * from 表1 inner join 表2 on 联表条件
select * from tb_emp
inner join tb_dept; -- 如果没有联表条件 则会出现笛卡尔积
-- 如何得到结果不在一张表中,就需要联表查询。
select * from tb_emp
inner join tb_dept
on tb_emp.dept_id=tb_dept.id;
-- 起别名的写法
select e.*,d.name dname
from tb_emp e inner
join tb_dept d
on e.dept_id=d.id;
左连接:
-- 查询员工信息以及对应部门得信息 没有部门的员工也显示。
select * from tb_emp e
left join tb_dept d
on e.dept_id=d.id;
右连接:
-- 查询员工信息以及对应部门得信息 显示没有员工的部门信息
select * from tb_emp e
right join tb_dept d
on e.dept_id=d.id;
自联:
-- 4.查询员工姓名以及对应的领导名字
SELECT yg.name 员工,ld.name 领导
FROM tb_emp yg
JOIN tb_emp ld
ON yg.managerid=ld.id;
-- 5.查询员工姓名以及对应的领导名字 显示没有领导员工信息
SELECT yg.name 员工,ld.name 领导
FROM tb_emp yg
LEFT JOIN tb_emp ld
ON yg.managerid=ld.id;
-- 检索借阅了“C语言程序设计”一书的读者姓名和所在单位
(三级联表:找公共外键最后根据条件查找)
SELECT name 读者的姓名,dept 所在单位
FROM readers r
-- 内联表的内联条件:找和查询表的公共部分(外键)
JOIN borrow_info bor ON r.reader_id=bor.reader_id
JOIN books bs ON bor.book_id=bs.book_id
WHERE book_name='C语言程序设计';
-- 表结构在下面
create table tb_emp(
id int primary key auto_increment COMMENT '员工编号',
name varchar(20) COMMENT '员工姓名',
age int COMMENT '员工年龄',
job varchar(20) COMMENT '岗位',
salary int COMMENT '薪水',
entrydate date COMMENT '员工入职时间',
managerid int COMMENT '员工领导编号',
dept_id int COMMENT '员工所在部门编号'
);
create table tb_dept(
id int primary key auto_increment,
name varchar(20)
);
insert into tb_dept(name) values('研发部'),('市场部'),('财务部'),('销售部'),('总经办');
insert into tb_emp values
(null,'金庸',66,'总裁',20000,'2000-01-01',null,5),
(null,'张无忌',20,'项目经理',12500,'2005-12-01',1,1),
(null,'杨逍',33,'开发',8400,'2000-11-03',2,1),
(null,'韦一笑',48,'开发',11000,'2002-03-05',2,1),
(null,'常豫川',43,'开发',10500,'2004-09-01',2,1),
(null,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1),
(null,'灭绝',60,'财务总监',8500,'2002-09-12',1,3),
(null,'周芷若',60,'会计',48000,'2006-06-01',7,3),
(null,'丁敏君',19,'出纳',4000,'2009-06-01',7,3),
(null,'赵敏',23,'市场总监',14000,'2009-06-01',1,2),
(null,'鹿仗客',56,'职员',3750,'2009-06-01',10,2),
(null,'鹤比翁',19,'职员',3750,'2009-06-01',10,2),
(null,'方东白',19,'职员',3750,'2009-06-01',10,2),
(null,'张三丰',88,'销售总监',14000,'2004-06-01',1,4),
(null,'玉莲舟',38,'销售',4600,'2009-06-01',14,4),
(null,'宋远桥',40,'销售',4600,'2009-06-01',14,4),
(null,'陈友谅',42,null,2000,'2011-06-01',1,null);
11. 嵌套查询
1.把一个sql查询的结果作为另一个sql查询的条件值:
例子: 1.查询研发部的员工信息。
【1】查询研发部的部门号 【2】根据查询的部门号查询对应的员工信息
-- 分析:查询信息:员工信息
查询条件:研发部
查询:id
条件:name是研发部
select * from tb_emp where dept_id=(
select id from tb_dept where name='研发部')
2.查询薪资最高的员工信息。
select * from tb_emp where salary=(
select max(salary) from tb_emp);
2.把查询的结果当作一个临时表:
查询 各个部门中最高薪资的 员工信息。
SELECT * FROM tb_emp INNER JOIN
-- 每个部门最高薪资
(select max(salary) m,dept_id from tb_emp group by dept_id) t
-- 部门号、薪资
ON tb_emp.dept_id=t.dept_id AND tb_emp.salary = t.m;
12. mysql常用的函数。
mysql里面存在了很多函数方法,字符串函数,时间函数,数学函数等。
a. 字符串函数
-- concat()字符串拼接
select name,concat('hello',name,'吃吗',salary) from tb_emp;
-- upper(str)转化为大写字母
select name, upper(name) from tb_emp;
-- lpad左填充
select name,rpad(name,2,'A') from tb_emp;
-- trim()去除左右空格
select name,trim(name) from tb_emp;
-- substring()截取字符串 下标从1开始
select name,substring(name,1,1)from tb_emp;
-- 姓灭
select * from tb_emp where substring(name,1,1)='灭'
-- char_length 求字符串的长度
select name,char_length(name) from tb_emp;
-- 求名字长度为3
select * from tb_emp where char_length(name)=3
b. 日期的函数
-- 查找今天入职的员工信息
select * from tb_emp where entrydate=curdate()
-- 当前日期
select entrydate,curdate(),curtime(),now(),year(entrydate),month(entrydate) from tb_emp;
-- date_add(日期数据,interval 值 单位) : 单位:year month day hour MINUTE second
select entrydate,date_add(entrydate,INTERVAL 1 year) from tb_emp;
-- datediff 两个日期的相差的天数
select entrydate, datediff(now(),entrydate) from tb_emp;
c. 数学函数
-- 查询最近1月的订单
select salary,ceil(salary),floor(salary),RAND()*10 from tb_emp;
13. 总结
1.Mysql数据库(SQL结构化语言)------操作数据库中数据库中数据【增删改查】
2.DDL数据定义语言:(主要对数据库和表定义的操作)
create database 数据库名;//创建数据库
use 数据库名;//要操作的数据库
drop database 数据库名;//删除数据库
create table 表名(
列名 数据类型 约束,
.....
列名 数据类型 约束
);//创建表和表内的字段
2.1数据类型:
int ,bigint, varchar(长度)--可变,char(长度)--固定长度,decimal(长度,小数),text,date
2.2约束:
主键primary key,
唯一约束 unique,
非空约束not null,是空is not null,
默认约束default,检查约束(8.0.14以后)check,
外键约束constraint foreign key references
递增 必须为整型类型(在最前面): auto_increment
2.3添加外键:
第一种:创建表时添加外键
[constraint][外键名称] foreign key(外键字段名) references 主表(主表列名)
第二种:在创建完表之后添加外键(一对多):(外对主)
一的表名 自己拟定的 一里面的外键名 多的表名(字段名)
alter table 表名 add constraint 外键名称 foreign key(外键字段) references 主表(主表字段名);
2.4条件:
1. 关系运算符: >,>=,<,<=,=,!=
2. (not)in运算符:(不)包含
3. between and
4. 逻辑运算符: and(与) or(或)
3.DML数据标记性语言--------增删改
增加:
insert into 表名 values(值,值,值.....),(值,值,值.....)......;//为表中所有列添加数据(单/多条)
insert into 表名(列名,列名...) values(值,值....);//为指定列添加数据
删除:
delete from 表名; -- 删除表中所有的记录 [不建议使用]--删库跑路蹲大牢
delete from 表名 where 条件; -- 根据条件删除满足条件的记录
修改:
update 表名 set 修改的字(列名=值,列名=值.... ) where 条件;
4.DQL数据库查询语言--------查询数据表中的记录
select [distinct--去重] [列名 as 别名,列名 别名, 列名--起别名][*--全局]
from 表名
[where 条件]
[group by 分组列] [having 分组后的条件] //分组及分组后的条件
[order by 排序的列 [desc asc:默认]] //排序及排序方式
[limit 起始记录,每页的条数]//分页
4.1模糊查询 like 通配符 %:统配n个字符 _:统配一个字符
4.2联表:
注:多个表连接,表>=2
通过联表查询想要的字段信息,只要找到(外键关联的条件)表之间的关联之处即可
内连接:select * from 表名1 [inner] join 表名2 on 联表条件;//并集,相同合一
左连接:select * from 表名1 left join 表名2 on 联表条件;//表1的全部(包括和表2公共的部分)
左连接:select * from 表名1 right join 表名2 on 联表条件;//表2的全部(包括和表1公共的部分)
自连:select * from 表名 [inner/left/right] join 表名 on 联表条件;//规则和上面相同
4.3查询嵌套:
把一个sql查询的结果作为另一个sql查询的条件值/临时表。
4.4内置函数:
5大聚合函数:一般和分组使用
sum():求和
count(): 求个数
avg():平均值
max():最大值
min():最小值
字符串函数:
concat(s1,...sn):拼接
lower(str):转小写
upper(str):转大写
lpad(str,n,pad):左填充---用pad对str的左边填充n个长度
rpad(str,n,pad):右填充---用pad对str的右边填充n个长度
trim(str):去空格
substring(str,start,len):返回从str从start到len的字符串
char_length(str):返回字符串的长度
日期的函数:
curdate():返回当前日期
curtime():返回当前时间
now():返回当前日期和时间
year(date):获取date的年份
month(date):获取date的月份
day(date):获取date的日期
date_add(date,interval e type):返回一个日期/时间值+时间间隔e后的时间值
datediff(date1,date2):返回date1和date2之间的天数
数学函数:
ceil(x):向上取整
floor(x):向下取整
mod(x,y):返回x/y的模
abs(x):求x的绝对值