第一、数据库基础

QQ 登录 注册 淘宝 京东 服务器数据库 查看历史订单 后台数据库中
软件由代码写的,代码里面不可放数据库
数据库存放数据,存放在文件中。
管理该数据库的软件 DBMS 数据库管理系统 database数据库 表table
行业中主流的数据库管理软件有甲骨文ORACLE收费高 政府 银行 金融 SQLSERVER mysql社区版开源 瑞典公司开发的 后来由Oracle收购
用户 --应用程序-- 数据管理系统(数据管理员)-- 数据库
数据库是保存有组织的数据的容器,通常是一个文件或一组文件
数据库在工作中的应用:
软件都需要有数据库作为后台支撑
构造数据进行性能测试,大数据量测试
数据库构造初始化的数据
大众点评 YAhoo用mysql数据库
mysql中的数据存放在表中
mysql基于服务器
mysql是基于客户机-服务器模式 C/S的数据库管理软件
服务器是负责所有数据访问和处理的软件,数据的增删改查都由服务器来处理
数据库和表都是创建在服务器端 负责干活的 客户端负责发送请求的
数据库表名不可重复。相当于我们注册的用户名不可重复
主键 primary key是唯一标识表中每一行的这个列(或几个列)主键用来表示一个特定的行
满足两点:任意两行都不具有相同的主键值,即主键值不重复
每一行都必须具有一个主键值,即主键值不能为空(NULL)
外键引用其他表的主键中的数据 需要有完整性 统一性
SQL语言是结构化查询语言,是一种专门用来与数据库通信的语言

set sql_safe_updates=0;

第二、数据库命令

查看mysql数据库 show databases;
ctrl + Enter 执行当前行
ctrl + shift + Enter 执行全部脚本
执行/使用数据库 use+数据库
创建数据库 create database 数据库名;
查看创建数据库的语句 show create database 数据库名;
查看当前数据库的表 show tables;
删除数据库 drop database 数据库名;
查看用户权限 show grants; 查看当前用户的权限
查看服务器错误信息 show errors;
查看服务器警告日志信息:show warnings;
查询表数据 select * from customers;
从客户表里面查询数据,所有列显示出来
select cust_id,cust_name from customers;
从客户表里面查询id和name这两列
插入数据 insert into customers(cust_id,cust_name)values("8888","zhangshan");
在客户表里面添加cust_id为8888,cust_name为zhangshan的两列
修改数据 update customers set cust_name='lisi' where cust_id='8888';
从客户表里面修改id为8888的姓名列为lisi
删除数据 delete from customers where cust_id='8888';
从客户端里面删除id为8888的

第三、数值类型

整型
tinyint 1字节 非常小的正整数 带符号:-128-127 不带符号0-255
int 4字节 标准整数
smallint 2字节 MEDIUMINT 3字节 BIGINT 8字节
浮点型
存放近似值:float 4字节 单精度浮点数
存放近似值:double 8字节 双精度浮点数
存放准确值:decimal M+2字节 以字符串形式表示的浮点数,它的取值范围可变,有M和D的值决定 用的最多
M整体的长度 D小数位数后面有几位
M:65,65位数字,最大为65 D:30
decimal(5,2)-999.99-999.99
字符串类型 (char)
字符串可以表示任意值
char[(M)] M个字符 定长的字符。没输满用空格补满
varchar[(M)] M个字符 变长 不用补空格
如果数据都有相同的长度,选用varchar会多占用空间,因为有一位用来存储其长度。如果数据长短不一,选用varchar能节省存储空间,而char不论字符长短都需要占相同的空间,即使是空值也不例外
如果长度出入不大,则用char会比varchar好
blob 二进制 图片等
text 文本等
日期 时间类型
date time datetime 日期值 时间值 日期时间值组合
CCYY-MM-DD hh:mm:ss CCYY-MM-DD hh:mm:ss
timestamp 特殊类型 时间错类型 获取系统当前时间

第四、MySQL 数据库技术

查看表结构 desc 表名;
创建表 create table table_name(column_name1 column_type1 int NULL,columu_name2 columu_type2 char(10) not null );
primary key (cust_id)这一列为主键
engine=InnoDB; 默认存储引擎

各列之间用逗号分隔。最后一列不用分号
给列指定NULL类型
NULL值就是没有值或缺省 NOT NULL
auto_increment 告诉mysql,本列每当增加一行时自动增量,每执行一次insert操作时,mysql自动对该列增1,每个表只允许一个auto_increment列,而且它必须可以被索引(通常使用它作为主键)
使用默认值
如果在插入行时没有给出值,mysql允许指定此时使用的默认(default)值
更新表;
alter table 语句
1.在alter table 之后给出要更改的表名 2.所做更改的列
添加列 在更改名加 add
alter table employee add dept_no int not null;
修改列
alter table 表名 modify 列名 新类型 新参数;
alter table 表名 change 旧列名 新列名 新类型 新参数;
alter table student modify id char(4) not null; 修改学生ID字符
alter table student change id uid int unsigned not null default 0;
当需要修改字段名称时使用change 当需要修改字段类型,参数时使用modify
给表指定外键 foreign key
alter table employee add constraint fk_dept foreign key (dept_no) references dept(dept_no);
这里的给employee表的dept_no这个列创建为dept表的外键
删除列
alter table 表名 drop 列名
删除表
drop table 表名
删除表内容
delete from 表名
重命名表
rename table 旧的表名 to 新的表名
查看创建表的SQL语句
show create table 表名
增加列 add 删除列 drop 修改列类型 modify 重名名列 change

第五、mysql 数据库查询操作

crashcourse 课程数据库表介绍:
customer客户表 存储客户信息
vendors 供应商表 存储供应商基本信息
orders 订单表 存储客户订单信息 订单编号 日期 客户id
orderitems 订单明细表 存储订单明细 订单编号 明细编号 产品编号 数量 价格
products 产品表 存储产品基本信息 产品编号 供应商 价格
productnotes 产品说明表

select语句的作用是从一个或多个表中查询信息。
查询特定列
格式 select 列名 from 表名
select cust_id from crashcource.customers; 不用use 数据库
查询所有列
select * from 表名
避免查询重复的内容 只显示一次
select distinct 列名 from 表名
设定查询结果返回的行数
select distinct 列名 from 表名 limit 行数;
查询结果排序
order by 默认升序 关键字 ASC
order by 降序 关键字DESC
order by与limit组合
order by 子句位于from子句之后,如果使用limit,那么它必须位于order by 之后
select 列名 from 表名 order by 列名1,列名2,列名3 limit 2;

第六 mysql条件查询与通配符

查询结果过滤
select语句中,数据库通过where子句指定查询的条件进行过滤
select 列名 from 表名 where 列满足的条件;
查询为空列 where 列名 is null;
注意:在同时使用order by和where子句时,order by 应位于where查询结果之后,否则将会产生错误
and操作符
select 列名 from 表名 where '列名1满足的条件'and'列名2满足的条件';同时满足
select 列名 from 表名 where '列名1满足的条件'or'列2满足的条件'; 一个满足
and or 同时使用 and优先级高于or 用括号
IN操作符
select 列 from 表 where 列名 in(n,m,mn);
in操作符特点
1.In操作符的语法清晰直观
2.计算次数容易管理
3.in操作符一般比OR操作符执行速度更快;
4.in可以包含其他select语句,使得能够动态的建立where子句
NOT操作符
mysql只支持使用NOT对IN between 和exists子句取反
Like操作符 模糊操作
通配符是用来匹配值的一部分的特殊字符
like %百分号通匹符。不能匹配NULl ,匹配任意多个字符
_下划线通匹符。匹配单个字符
转义符 \ "%0\%" 第一个通配符,第二个%

第七(一)mysql结果数据处理与函数

列的别名
使用concat()函数进行字符拼接,给查询出来的数据列指定新的名字
使用as关键字创建 -别名
select vend_id,vend_name,concat(vend_id,'----',vend_name) as vend_tittle from vendors;
算数运算系列
lower 大写变小写 upper 小写变大写 length 计算字符长度
trim()去掉字符串左右两边的空格 rtrim 右边 ltrim 左边
substring(列名,4,2)从第4个字符开始取字符串,取两位.身份证号码截取
select 列名,length(列名),lower(列名),upper(列名),concat(列名)from 表名;多列操作
left/right(列名,4); 返回个数为4个字符
日期时间处理函数
select curdate(),curtime(),now();返回当前日期时间
adddate()增加一个日期
addtime()增加一个时间
datediff()计算两个日期之差 - - 相当于比较
date() year() time() day()
计算30天后日期
select 列名 adddate(列名,30)from 表名;
adddate(order_date,interval 5 month) 在date日期后面加5个月 。
order_date 属于datetime 型 只可显示2015-09-19 00:00:00 的订单
这时需要加 date(order_date)
不是函数不需要加括号

第七(二)数据处理

数值处理函数
truncate(列名,1) 8.99 ---8.9
round(列名,1) 8.99 -- 9.0
select abs(datediff('2008-08-02',curdate()); 比较日期取绝对值

集聚函数 只在列上起作用
count(列名) avg(列名) sum(列名) min(列名) max(列名)

select count(*)from products where vend_id='10003';
select prod_id,sum(quantity) from orderitems where prod_id='FC';
select avg(prod_price) from products where vend_id="1003";


select prod_name,min(prod_price)from products; 这个是逻辑语法错误。prod_name 不可以放置 min 前面。。加了 where就可以 放列名
流程函数
if(条件,t,f) 如果value是真,返回t,否则返回f
select 列名1,列名2,if(列名1>5,'H','L') as level from 表名;

ifnull(value1,value2)如果value1为空返回value1,否则返回value2
select 列名1,列名2,ifnull(列名1,'value') as level from 表名;

case when 条件1 then 结果1 when 条件2 then 结果2 else 结果3 end
如果value是真,返回result 否则返回default

select prod_id,prod_price,case when prod_price<5 then'low' 
when prod_price>=5 and prod_price<=10 then 'medium'
else 'high' end as level from products order by prod_price;

case 表达式,when 条件1 then 结果1 when 条件2 then 结果2 else 结果3 end

select dsitinct vend_id case vend_id when 1001 then'A' 
when 1002 then'B' else'C' end as level from vendors;

第八  mysql分组查询与子查询:

查询结果的分组操作
分组允许把数据表当中的字段分为多个组,字段值相同的为一组,分组为了便于对每个组进行聚合计算
分组是在select语句的group by 子句中建立的
注意:group by 只是创建分组,但并不保证分组里面的数据的排序顺序,需要使用order by 子句对分组里面的数据进行排序

过滤分组
除了能用group by 分组数据外,mysql还允许对分组指定条件,规定包含哪些分组,排除哪些分组
mysql使用having子句来完成该操作
where子句过滤指定的行,having子句过滤指定的分组
过滤总数大于等于2的分组
select 列名1 count(*) as 别名 from 表名 group by 列名1 having 别名>=2;
select后面只能查看group by 子句后有的列和聚集计算的列
group up 可以根据多个列进行分组,多个列分组即多个列的值相同
select中子句的顺序
select 要返回的列或表达式 必须使用
from 从中检索数据的表 仅在从表选择数据时使用
where 行级过滤 选择条件时可用
group up 分组说明 仅在按组计算聚集时使用
having 组级过滤 需在group up后面使用
order by 输出排序顺序
limit 需要检索的行数

第九 表联结 &联结:

sql最强大的功能之一就是能在数据索查询的执行中联结表
避免冗余
笛卡尔乘积是由没有联结条件的表关系返回的结果,检索出的行数是第一个表与第二个表的乘积
select * from vendors,products;
笛卡尔乘积并不是我们想要的信息。
表关联
两个表之间的关联关系通过外键来关联.
外键foreign key是用引用其他主键primary key的值
创建联结
数据上存在关系。说明存在关联的条件

select vend_name,prod_name,prod_price from vendors as p1,products as p2
where p1.vend_id=p2.vend_id order by vend_name,prod_name;


多表联结
SQL对一条select语句中可以联结的表的数目没有限制,创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系

select vend_name,prod_name,prod_price,quantity 
from vendors as p1,products as p2,orderitem as p3
where p1.vend_id=p2.vend_id and p2.prod_id=p3.prod_id and order_num='20005';


多表联结性能问题
mysql在运行时关联指定的每个表以处理联结,这种处理可能非常消耗资源,因此不要联结不必要的表。联结的表越多,性能下降越厉害。

内联结也称等值联结,它基于两个表之间的相等测试
仅显示两个联结表中的匹配行的联结
格式 inner join ...on
select 列名1.2.3 from 表名1 inner join 表名2 on 条件 inner join 表名3 on 条件 where 过滤条件
###查询20050901之后购买订单的客户姓名,客户地址,订单编号
select cust_name,cust_address,orders_num from customers inner join order on customers.cust_id=orders.cust.id where date(order_date)>'2005-09-01';

给表指定别名 customers as C
作用 缩短SQl语句 允许在的单条select语句中多次使用相同的表
自联结的执行效率高于子查询
自联结相对来说较复杂

select p1.prod_id,p2.prod_name from products as p1,products as p2 
where p1.vend_id=p2.vend_id and p2.prod_id='DTNTR';


左联结
以左边表为基准,按照过滤条件查找右边表的记录,如果匹配到,那么就组合成一行,并显示结果,如果没有匹配到,那么只显示左边表的字段,右边表中不存在的字段用空值来表示
###查找出没有产品的供应商名称
select vend_name from vendors left join products on vendors.vend_id=products.vend_id where products.vend_id is not null;
右联结
作用和左联结刚好相反,以右边为基准,去匹配左边的表,如果左边字段为空,那么就用空值来表示。

### 查找没有买过订单的客户名称
select cust_name from customers right join orders on customers.cust_id=orders.cust_id where orders.cust_id is not null;

联合查询
利用union关键字可以将多条select语句组合起来,将它们的结果组合成单个结果集

select cust_id,cust_name from customers
union
select vend_id,vend_name from vendors;


union 必须由两条或两条以上的select语句组成,语句之间用关键字union分隔,union中的每个查询必须包含相同的列;列数据类型必须兼容

select as A ,as B; 利用结果及别名

第十 (一)插入 修改 删除:

插入其他结果的数据
insert into 表名(列1,列2) select 列名3,列名4 from 表名1 where 条件
更新数据
update语句可以更新表中特定的行 也可以更新表中所有的行。
update语句如果后面不跟where语句的话,将修改表中所有的行。

数据备份
create table 表名 select * from 表名
金额打九折 price*90%

删除数据
delete语句
从表中删除特定的行 通过where子句指定条件
从表中删除所有的行 不带where子句

truncate table 表名;

select * from customers into outfile 路径; 数据导出

第十(二)mysql的数据备份与还原:

备份数据库与表
备份数据库:进入mysql安装目录的bin目录执行
mysqldump-u root -p database(数据库名)>C:\database.sql
备份表 -P 端口
mysqldump -u root -p database(数据库名).tablename(表名)>table.sql 路径
cmd命令窗口,进入mysql的bin目录执行
导入数据库

mysql -u root -p; 进入数据库
create database newdb;创建一个要导入的数据库
use newdb;
source database.sql;
data export 导出备份
data import 导入数据 还原

事物的基本概念 例如转账
事物是对数据库的一组操作,组成这组操作的各个单元,要不全部成功要不全部失败
1)原子性是指事物包含的所有操作要么全部成功,要么全部失败,因此事物的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
2)一致性是指事物必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事物执行之前和执行之后都必须处于一致性状态。。。如转账金额
3)隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事物,不能被其他事物的操作所干扰,多个并发事物之间都要相互隔离
即要达到这么一种效果:对于任意两个并发的事物TI和T2,在事物T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事物都感觉不到有其他事物在并发地执行。
4)持久性是指一个事物一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据系统遇到故障的情况下也不会丢失提交事物的操作

索引的基本概念
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。相当于书的目录
优点:加快了查询的速度
缺点:低了增删改的速度。有些增加表的文件大小比索引文件还要大。
索引类型
普通索引(index)最基本的索引,没有任何限制
唯一索引(unique)索引列的值必须唯一,但允许有空值
主键索引(primary)特殊的唯一索引,不允许有空值
全文索引(fulltext)仅可用于MYLSAM表
组合索引 一个索引包含多个列

SQL三种类别语句
DDL 数据定义语言 create drop alter rename
DML 数据操作语言 select insert delete update
DCL 数据控制语言 grant revoke commit

第十一 mysql数据库技术在工作中的应用

ningzhi商城项目环境搭建
安装JDK,配置环境变量 JAVA_HOME PATH CLASSPATH
安装Apache tomcat web服务器
安装mysql 导入sql脚本
将war包放入tomcat目录webapps下
Tomexam放入mysql目录date下
mysql tomcat 重启服务

修改用户密码命令
update user set authentication_string=password('123456')where user='root';
改好密码之后需要重启mysql服务 还有端口需要改为3306
前台页面:http://localhost:8080/Shopping
后台页面: http://localhost:8080/Shopping/bg-land.jsp

show grants for root; 输出root用户权限
revoke select,update,delete,insert on db_shopping.* from 涛哥;
撤销涛哥进行对数据库及表db_shopping.* 的增删改查
grant select,update,delete,insert on db_shopping.* to涛哥;
赋予涛哥进行对数据库及表db_shopping.* 的增删改查
create user 涛哥 identified by “123456”;
创建涛哥新用户及密码

rename user XX to XX; 改用户名
drop user XX;删除用户名及相关权限
set password for 涛哥=password('123456');

修改涛哥的用户密码

set password =password('123456');

修改当前的用户密码

首先需要看数据库的结构 wy6wy 6
注册功能 --表单 Web来说
修改用户信息失败,数据库的数据无变更;
注册 数据添加

批量添加数据脚本

drop procedure test_insert;
delimiter //
create procedure test_insert()
begin
declare y tinyint default 20;
while y<30
do
insert into tb_link values(y,concat('测试连接',y),
'http://www.taobao.com');
set y=y+1;
end while;
commit;
end//
delimiter;
call

测试翻页脚本

drop procedure if exists test_insert1;
delimiter //
create procedure test_insert1()
begin
declare y tinyint default 20;
while y<30
do 
insert into tb_link values(y,concat('测试连接',y), 'http://www.taobao.com');
set y=y+1;
end while;
commit;
end//
delimiter ;
call test_insert1(); 
show variables like %engin%;
set @@storage_engine="InnoDB"