1.数据库技术
MySQL数据库:数据库管理系统,存储和管理数据
JDBC:Java Database Connectivity ,Java数据库连接技术,使用java语言连接数据库
-
前端技术
HTML:Hypertext Markup Language,超文本标记语言,编写网页
CSS:Cascading Style Sheets ,层叠样式表,美化网页
JavaScript:java 脚本语言,处理客户端的业务
Ajax:Asynchronous Javascript and XML ,异步的 Javascript and XML ,在客户端处理请求和响应 -
后台技术
Servlet:Server Applet,服务器端的小程序,在服务器端处理客户端请求
JSP:Java Server Page,Java 服务器端网页,使用java语言去动态的生成网页
一、初识MySQL数据库
1.数据库的概述
<1>数据库:Database
长期存储在计算机内的,有组织的,可共享数据的集合。
存储数据的仓库。(文件)
<2>数据库管理系统:操作和管理数据库的软件。(软件)
<3>数据库的类型:
关系型数据库:基于二维表表现形式。(行和列的表现形式)
非关系型数据库:NoSQL----Not only SQL
键值对存储:Redis - 存储数据K-V的形式存储
文档存储:MongDB --以文档形式进行存储
<4>主流的关系型数据库
MySQL、Oracle、SQLServer、DB2
<5>关系型数据库的特点:
基于二维表表型形式。(行和列的表现形式);
表
行row:记录
列column:字段、属性
2.MySQL概述
<1>MySQL数据库
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
<2>版本
社区版:免费(个人、组织、企业)
企业版:非盈利的版权,会收取一定的服务费。
<3>特点
体积小、速度快、总体拥有成本低,尤其是开放源码。
二、安装MySQL数据库
<1>安装方式
ZIP压缩包:解压配置即可
MSI:一步一步安装配置,比较全面。
<2>注意事项:以前安装过,需要卸载干净再安装
1.关闭服务
2.卸载MySQL软件
3.删除残留文件1:原始位置
4.删除残留文件2:C:/programData/
5.删除残留文件配置参数:cmd—xxxmachine–system—001/002–service–eventlog–application–删除mysql
<3>安装
MSI安装,配置较为全面(建议使用这种方式,比较简单)。
三、使用MySQL软件
<1>启动服务
net start mysql 启动服务
net stop mysql 关闭服务
<2>登录数据库
格式:mysql - 参数
参数: -u 用户名
-p 密码
-P 端口
-h 服务器名称
-prompt 设置提示
例如:
mysql -uroot -proot
mysql -uroot -proot -P3306 -h39.106.163.65(阿里云服务器)
mysql -uroot -p(回车)
密码(密码不可见)
使用MySQL Command Line Client 输入密码
<3>退出数据库
quit
exit
\q
ctrl+c
<4>修改密码
1.停止mysql服务
2.再DOS下输入 mysqld --skip-grant-tables
3.在新开一个DOS下登陆mysql数据(不需要密码)
4.更改密码:
use mysql 选择名称是mysql的数据库
update user set password=password(‘123’) where root=‘root’;
5.关闭DOS窗口,结束mysqld进程
6.重启MySQL服务,使用新的密码登陆
<5>修改MySQL的提示符
方式一: mysql -uroot -proot --prompt hehe
方式二:prompt hehe
识别版本号
select version();
四、MySQL数据库数据类型
MySQL支持多种数据类型:数值、字符、日期类型
常用的类型:
1.数值类型
int:整型,存储整数
double:小数
float[(M|D)]:小数,
float(6,2) 表示最多6位,小数占2位 最大存储数值范围 9999.99
2.字符类型
char(size):字符
varchar(size):字符
一般推荐使用varchar类型 为什么,因为varchar是变长字符串
char如果你指定了5个字符的空间,但是你只用一个是不是浪费了空间
varchar你如果设置5个字符的空间,如果你添加2个字符的数据那么它就用两个字符的空间。(变长)
3.日期
date:日期----年月日
datetime:日期---年月日时分秒
五、MySQL数据库种的数据的使用
如何操作:编程语言
<1>SQL概述
结构化查询语言,定义,操作数据,和维护数据的完整性,安全性。
<2>组成
数据定义语言(DDL):用于定义和管理数据对象,包括数据库,数据表等。
create、drop、alter
create:创建数据库和表
drop:删除表对象
alter:修改表结构
数据操纵语言(DML):用于操作数据库对象中所包含的数据
insert、delete、update
insert:添加数据
delete:删除数据
update:修改数据
DQL数据查询语言:用于查询数据库对象中所包含的数据
select:查询数据
事务控制语言(TCL):是用来管理数据库的语言,包括管理权限及数据更改
commit、rollback、savepoint
commit:提交事务
rollback:事务回滚
savepoint:事务节点
数据控制语言(DCL):
grant----授权
revoke—收回权限
1.数据定义语言(DDL)
数据库的操作
<1>创建数据库
语法格式:create database [if not exists] 数据库名称 [character set [=] 编码名称];
例如:
create database 1701d character set utf8;
<2>查看数据库
语法格式:show databases;//查询所有的数据库
show create database 数据库名称;//查询指定已经创建的数据库。
<3>修改数据库
语法格式:alter database [if not exists] 数据库名称 [character set [=] 编码名称];
例如:
alter database 1701d character set gbk;
<4>删除数据库
语法格式:drop database 数据库名称;
例如:
drop database 1701d;
数据表的操作
<1>创建数据表
使用一个数据库:use 1701d;
查看当前正在使用的数据库 select database();
创建表:
create table 表名(
字段名 字段类型,
字段名 字段类型,
.....
);
例如:
create table emp(
empno int not null,
ename varchar(32),
sal double,
sex varchar(2) default '男',
deptno varchar(32)
);
<2>查询数据表
show tables;//查询当前数据库中所有的数据表
desc 表名;//查询某张表的结构
<3>修改数据表
3.1 修改表名
方式一:alter table 表名 rename 新表名;
方式二:rename table 旧表名 to 新表名 [,旧表名 to 新表名,…]
3.2 添加列
语法格式:alter table 表名 add 列名 列类型 [first|after 列名];
例如:
alter table emp add birth date;//默认在列的最后面添加新的列
alter table emp add birth date first;//在列的最前面添加新的列
alter table emp add birth date after sal;//在sal列的后面添加新的列
3.3 修改列定义
语法格式:alter table 表名 modify 列名 列定义 [first|after 列名];
3.4 修改列名
语法格式:alter table 表名 change 列的列名 新的列名 新的列定义 [first|after 列名];
3.5 删除列
语法格式:alter table 表名 drop [column] 列名;
例如:alter table emp1 drop birth;
<4>删除数据表
语法格式:drop table 表名;
例如:drop table emp1;
2.数据操纵语言(DML)
<1>插入操作
语法格式:insert [into] 表名 [(列名1,列名2,…)] values|value (数值|表达式,数值|表达式,数值|表达式,…);
例如:
insert into teacher (id,note) values ('1','先挣它一个亿。');
insert into teacher value ('2','王建零','先挣它一个亿。');
<2>删除操作
语法格式:delete from 表名 where 条件
例如:
delete from teacher where id=1;//指定条件删除记录
delete from teacher;//不带条件删除,删除所有记录
扩充:
truncate table 表名;----------删除数据; 会清空表中所有的数据
面试题:
delete删除与truncate删除有什么区别?
删除方式:
delete --一条一条的删除,不清空auto_increment记录数。
truncate 直接将表中数据删除,auto_increment自增1将设置为零,从新开始。
<3>修改操作
语法格式:update 表名 set 列名1=数值,列名2=数值,… where 条件;
例如:
update teacher set id=1,name='三' where id=2; -- 带条件修改,修改指定记录
update teacher set id=1,name='三'; # 不带条件 修改表中所有数据
3.数据查询语言(DQL)
完整语法格式:
select 表达式1|字段,…
[from 表名 where 条件]
[group by 列名]
[having 条件]
[order by 列名 [asc|desc]]
[limit 位置,数量]
<1>普通查询
select 查询表达式;//最简单的sql语句,是一个函数
select datebase(); select version();
<2>条件查询
where 条件表达式,支持运算符和函数
MySQL支持的运算符:
=、 !=、 >、 >=、 < 、<=
and、or、not
is null、is not null
betwee...and...
in(set);
like 通配符和占位符:% _ (模糊查询)
%:表示0个或者多个字符
_:表示占位一个
查询id大于2的老师信息
select * from teacher where id > 2;
查询薪水为空的老师信息----------在数据库中null永远不等于null
select * from teacher where sal is null;
查询id是1 、2老师的信息
select * from teacher where id=1 or id=2;//不建议
select * from teacher where id in (1,2);
查询id是1并且姓名是三的老师信息
select * from teacher where id=1 and name='三';
查询薪水在1000到10000之间的老师信息
select * from teacher where sal >=1000 and sal <=10000;
select * from teacher where sal between 1000 and 10000;//建议使用这种方式,等同于上面方式
查询姓名中有“老”字的老师信息
select * from teacher where name like '%老%';
查询姓名是三个字的
select * from teacher where name like '___';
查询姓苍的老师的信息
select * from teacher where name like '苍%';
<3>分组查询
[group by 列名] [having 条件]
一般情况分组查询结合聚合函数一起使用
(max、min、sum、avg)
1.having和where的区别:
having是在分组之后对数据进行过滤,where是在分组之前对数据进行过滤。
2.having后面参与判断的字段是有效的。
<4>排序查询
语法格式: order by asc | desc 默认升序(asc)
例如:
select * from teacher order by id asc;//根据id进行升序排序
select * from teacher order by id desc;//根据id进行升序降序
select * from teacher order by id ;//根据id进行升序降序,利用默认排序
<5>限制结果集数量的查询(分页)
语法格式:limit n条数; ---从第一条开始取n条数据。(了解)
语法格式:limit start起始位置,count条数;-----从起始位置start取count条数据(起始位置从0开始) 推荐使用这种
分页(每页显示5条数据):
第一页:select * from teacher limit 0,5;
第二页:select * from teacher limit 5,5;
第三页:select * from teacher limit 10,5;
第四页:select * from teacher limit 15,5;
第n页:select * from teacher limit (n-1)*5,5;
分页公式:
开始下标索引(起始位置) = (当前页-1)*每页显示数据;
4.事务控制语言(TCL)
MySQL事务默认自动开启的;
<1>为什么使用事务
银行转账:老王给儿子小王转账1000元
事务广泛使用:订单系统、银行系统等…
<2>MySQL事务控制
commit(提交)、rollback(回滚)、savepoint(事务节点)
<3>实战操作
create table student(
id int,
name varchar(32),
age int
);
insert into student (id,name,age) values (1,‘老王’,‘17’);
语法:set autocommit = false|true;//设置事务的提交方式
rollback;//事务回滚
commit;//事务提交
savepoint 节点名称;//设置回滚节点
rollback to 节点名称;//回滚到具体的某个节点
例如:
set autocommit = false;
delete from student where id = 1;
rollback;
commit;
update student set money = money-5 where id=1;
savepoint t1;
update student set money = money-5 where id=1;
savepoint t2;
rollback to t1;
commit;
5.数据控制语言(DCL)
用户的创建和授权
grant、revoke
<1>授权语法格式:
grant 权限 on 数据库.表 to 用户名@登陆的主机;
show grants;//查询所有权限
例如:
1.新建数据库testdb
create database testdb;
2.创建用户
use mysql;//选择mysql数据库
create user 'zhangsan'@'localhost' identified by '123123';
3.授权用户
grant all privileges on testdb.* to 'zhangsan'@'localhost';
4.查看权限
show grants for 'zhangsan'@'localhost';
5.收回权限
revoke select on testdb.* from 'zhangsan'@'localhost';
<2>取消权限的语法格式:
revoke 权限 on 数据库.表 from 用户名@登陆的主机;
收回权限
revoke select on testdb.* from 'zhangsan'@'localhost';
<3>删除用户
delete from user where user=‘用户名’;
flush privileges;-- 刷新权限
注意: all privileges(所有权限)、 .(所有数据库.所有表) 、’%’(本地主机+远程主机)
常用权限:
select:对所有表进行查询操作
insert:对所有表进行插入操作
update:对所有表进行修改操作
delete:对所有表进行删除操作
create:数据库、表、索引
drop:数据库和表的删除操作
alter:对所有表进行更改
重点
增删该查(CURD) 整个数据库中对你们来说 查询是最最最最最重要的。
1.创建数据表
2.向数据库表中添加数据
3.修改数据表中内容
4.删除数据表中内容
5.操作表结构(添加列、修改列、删除列)
6.数据表查询(条件查询、分组查询、排序查询、分页查询)(重中之重)
六、MySQL约束
<1>概念
是一种限制,它是对表的行或列的数据作出限制,确保表中的数据的完整性和唯一性。
<2>使用场景
创建表的时候,添加约束
<3>分类
-
default:默认约束,域完整性
-
not null:非空约束 ,域完整性
-
unique:唯一约束 ,实体完整性
-
primary key:主键约束 , 实体完整性
-
foreign key:外键约束 , 参照完整性
-
check:检查约束(MySQL不支持),域完整性
-
auto_increment:自增长约束
-
unsigned:无符号约束
-
default:默认约束,域完整性
create table emp(
id int,
sex varchar(2) default ‘男’,
age int
); -
not null:非空约束 ,域完整性
create table emp(
id int not null,
sex varchar(2) default ‘男’,
age int
); -
unique:唯一约束 ,实体完整性
create table emp(
id int not null unique,
sex varchar(2) default ‘男’,
age int
); -
primary key:主键约束 , 实体完整性 primary key 等同于 not null unique
create table emp(
id int primary key,
sex varchar(2) default ‘男’,
age int
); -
foreign key:外键约束 , 参照完整性
-
check:检查约束(MySQL不支持),域完整性
-
auto_increment:自增长约束
create table emp(
id int primary key auto_increment,
sex varchar(2) default ‘男’,
age int
); -
unsigned:无符号约束
七、多表查询(重中之重)
多表查询分类
<1>多表查询 where子句多表查询、join子句多表查询<2>连接查询(左连接、右连接、内连接、完全连接)
内连接:inner join…on、join
inner join 是比较运算符,只返回符合条件的行
右连接:right join 或right outer join
右连接包含right join右表所有的行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)
左连接:left join 或 left outer join
左连接和右连接一样。以显示左表所有的行,如果右表中某行在左表没有匹配,则结果中对应右表的部分全部为空(NULL)
完全连接:full join 或 full outer join
完全连接使用full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应右表的部分全部为空。如果左表中某行在右表中没有匹配,则结果中对应左表的部分全部为空例如: create table emp ( empno int primary key auto_increment, ename varchar(32), deptno int ); create table dept( deptno int primary key auto_increment, dname varchar(32) ); 1.利用左连接查询员工信息:员工编号 员工姓名 员工薪水 所在部门 select empno,ename,dname from emp e left join dept d on e.deptno=d.deptno 2.利用右连接查询员工信息:员工编号 员工姓名 员工薪水 所在部门 select empno,ename,dname from emp e right join dept d on e.deptno=d.deptno 3.利用内连接查询员工信息:员工编号 员工姓名 员工薪水 所在部门 select empno,ename,dname from emp e inner join dept d on e.deptno=d.deptno 4.利用全连接查询员工信息:员工编号 员工姓名 员工薪水 所在部门 select empno,ename,dname from emp e full join dept d on e.deptno=d.deptno;语法错误 mysql 4.0之前可以使用full join进行完全连接 4.0以后,如果想要使用完全连接 UNION ALL 或者 UNION select empno,ename,dname from emp e left join dept d on e.deptno=d.deptno union select empno,ename,dname from emp e right join dept d on e.deptno=d.deptno UNION ALL:UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。 UNION: 命令列出不同的值
<3>子查询(ANY子查询、IN子查询、SOME子查询、ALL子查询)
子查询解决的问题:
谁的薪水比李四高??
select * from emp where sal > (select sal from emp where ename=‘李四’);定义:子查询允许把一个查询嵌套在另一个查询当中。 子查询又叫做内部查询,相当于内部查询,包含内部查询的就称为外部查询。子查询的结果被主查询所使用。 注意的问题: 1. 括号 2. 可以在主查询的where select having from 后面,都可以使用子查询 3. 不可以再group by 后面使用子查询 4. 主查询和子查询可以不是同一张表;只有子查询返回的值,主查询可以使用即可。 需求:查询部门名称是人力的员工信息 第一种方式:利用子查询 select * from emp where deptno=(select deptno from dept where dname='人力'); 第二种方式:利用关联查询 select * from emp e,dept d where e.deptno=d.deptno and d.dname='人力'; SQL优化:尽量使用多表查询 绝大部分的子查询在最终执行的时候它都是转换成一个多表查询来执行的。 通过SQL执行计划可以看出来。 通过SQL执行计划会发现这两种方式执行的是一样的。 5. from后面的子查询 需求:查询员工号 姓名 月薪 select * from (select empno,ename,sal from emp) emp2; 查询员工号 姓名 月薪 年薪 select * from (select empno,ename,sal,sal*12 from emp) emp2; 6. 一般不在子查询中排序; 7. 一般先执行子查询,再执行主查询。
ANY关键字
假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么,
select …from … where a > any(…);
->
select …from … where a > result1 or a > result2 or a > result3;
需求:
查询工资比1号部门任意一个员工高的信息
select * from emp where sal > any (select sal from emp where deptno=1);
select * from emp where sal > (select min(sal) from emp where deptno=1);
ALL关键字
ALL关键字与any关键字类似,只不过上面的or改成and。即:
select …from … where a > all(…);
->
select …from … where a > result1 and a > result2 and a > result3;
需求:
查询工资比1号部门所有员工高的员工信息
select * from emp where sal > all (select sal from emp where deptno=1);
select * from emp where sal > (select max(sal) from emp where deptno=1);
SOME关键字
some关键字和any关键字是一样的功能。所以:
select …from … where a > some(…);
->
select …from … where a > result1 or a > result2 or a > result3;
IN关键字
IN运算符用于WHERE表达式中,以列表项的形式支持多个选择,语法如下:
WHERE column IN (value1,value2,…)
WHERE column NOT IN (value1,value2,…)
当 IN 前面加上 NOT运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。
案例:
查询部门名称是人力和开发的员工
select * from emp where deptno in (select deptno from dept d where d.dname=‘人力’ or d.dname=‘开发’ );
查询不是老板的员工
select * from emp where mgr is not null
八、MySQL中的函数
max():求最大值
查询emp中薪水最高的人?
select max(sal) from emp
min():求最小值
查询emp中薪水是多少?
select min(sal) from emp
avg():求平均数
查询每个部门的平均薪资
select AVG(sal) from emp group by deptno
sum():求和
查询emp中员工的总工资
select sum(sal) from emp;
count():求总记录数
查询员工数量
select count(*) from emp;
知识点遗漏
distinct 去重 消除冗余
查询学生信息,根据姓名去重
select distinct usernme,age from user;
查询学生信息,根据姓名和年龄去重
select distinct usernme,age from user;
别名: as 、 空格
select username as ‘姓名’, age ‘年龄’ from emp;
<> :不等于 等同于 !=
查询不是1号部门的员工
select * from emp where deptno <> 1
外键约束
语法格式:
ALTER TABLE 表名 ADD FOREIGN KEY (字段名) REFERENCES 表名(字段名) ;
例如:
alter table student add constraint FK_Reference_1 foreign key (c_id)
references class (c_id) on delete restrict on update restrict;