回顾
1.数据库基本概念
1)数据库管理系统(DBMS):专门管理数据的软件系统,提供了很多功能:
-科学,高效的额数据存取操作
-提供友好的操作界面
-提供给开发语言访问接口
-提供丰富的工具(备份/恢复,性能优化)
2)关系模型概念
-关系:规范的二维表
-实体:实现中
-元组:二维表中一行称为一个元组
-属性:元组中
-键:能够区分实体唯一的属性
-主键:从多个键中选取一个,作为关系(表)中逻辑上唯一确定实体的依据
非空,唯一
2.MySQL操作
1)安装:
linux:MySQL-server,mysql-client
libmysqclient-dev
windows:记住root口令,添加用户 名称/密码,端口
2)安装确认
查看端口:netstat -an|grep 3306
管理脚本:/ect/init.d/mysql[status|start|stop|restart]
3)服务管理:同管理脚本
4)客户端连接服务器
-mysql(客户端),mysqld(服务器)
-连接:
mysql -h主机 -u用户 -p密码
5)库管理
-查看库:show databases;
-进入某库:use 库名
-查看当前库:select database();
-创建库:creat database 库名
-删除库:drop database 库名
6)表管理
-查看库中有那些表:show tables;
-创建表:create table 表名
(字段1 类型,
..)[设置库属性]
-查看表结构:desc 表名称
-查看建表语句:show create table 表名
-删除表:drop table 表名
7)数据操作
-插入
insert into acct values
('78901','sehngjia','c0001',1,now(),1,1200.00),
('78902','sehng','c0002',1,now(),1,1200.00);
insert into acct(acct_no,acct_name)valuse('78904','jia')
-查询
select * from acct;
select * from acct where acct_type=1
select * from acct where acct_type =1 or acct_type=2
select acct_no "账户",acct_name as "名为" from acct (投影)
select acct_no , balance/10000 from acct
今天
1.数据类型
1)主要数据类型
-数值类型:整数,浮点数
-字符类型:对应程序里的字符串
-日期时间类型
-枚举类型:具有固定取值范围
例如:性别,账户类型
2)数值类型:
类型 大小 范围
-TINYINT 1 Byte 0~255(无符号)
-128~127(有符号)
-INT/INTEGER 4 Byte 0~2^32-1(无符号)
-2^31~2^31-1(有符号)
BIGINT 8 Byte 0~2^64-1(无符号)
-2^63~2^63-1(有符号)
DECIMAL 可变 存储精确数字
可指定最长长度,小数位数
eg:数值类型使用示例
create table num_test(
--显示3位无符号整数,左边0填充
card_type int(3) unsigned zerofill,
dist_rate decimal(10,2)
);
insert into num_test values(1,0.80);
insert into num_test values(100,23.456);
insert into num_rest values(1000,23.444);
imsert into num_rest values(2,3);
unsigned #无符号整数
说明:
-当字段使用unsigned修饰时,值只能是整数
-定义整数时指定长度,仅仅是指定显示宽度存储的值得大小由数据类型决定
-zerofill表示长度不足时左边用0填充
-整数值超过类型的范围,插入时会报错
-当浮点数小数部分超过指定长度,自动进行四舍五入
3)字符串类型
-定长: char (使用较少)
最大存储255个字符
如果长度不足指定的长度,右边以空格填充
如果不指定长度,默认长度为1
超过长度,无法存入
-变长字符串: varchar (常用)
最大能存储 65535 个字符
根据数据的实际大小分配存储空间
超过长度,无法存入
-大文本类型:text
字符数大于 65535 时使用
-char 和 varchar 特点比较
char 类型性能较高,但浪费存储空间
varchar 节省存储空间,但效率低于 char
一般情况下使用 varchar
4)枚举
-ENUM:从指定的值中选取一个
-SET: 从指定的值中选取一个或多个
eg:创建一个含有枚举类型的表
create table enum_test(
name varchar(32),
sex enum('boy','girl'),
course set('music','dance','paint')
);
inset into enum_test values
('jia','girl','music,dance');
说明:
5)日期时间类型
-日期:date,'1000-01-01'~'9999-12-31'
-时间:time,'00:00:00'~'23:59:59'
-日期时间:datetime,年月日时分秒
-时间戳:timestamp
-相关函数
now()/sysdate() 取系统时间
curdate()/curtime() 取当前日期/时间
year()/mouth()/day() 单独取日期中年月日
date()/time() 单独取日期时间中的日期/时间
示例:
select now(),sysdate();
select now(),sysdate(),curdate(),curtime();
select year(now()),month(now()),day(now());
select date(now()), time(now());
2.修改记录
1)update 表名 set 字段1 = 值,字段2 = 值,where 条件表达式
示例:
修改某一个账户的状态
update acct set status = 2 where acct_no='78901';
update acct set status = 3,balance=balance-100 where acct_no='78901';
注意事项:
限定好条件!!!
如果不适用where 限定条件,则修改所有数据
修改的值得类型要和定义的值一致
3.数据删除
1)语法:
delete from 表名 where 条件
delete from acct where acct_no='78902';
-注意事项
限定号条件!!!
删除之前做好备份!!!
4.运算符操作
1)比较运算符:>,<,>=,<=,<>(!=),=
eg:查询账户余额大于2000.00的记录
select * from acct where balance > 2000;
查询账户类型不为2的记录
select * from acct where acct_type <> 2;
2)逻辑运算符
- and:多个条件同时满足
- or: 多个条件至少满足一个
eg:多个条件的组合
selece * from acct where(acct_name='shengjia'or acct_name='jia'and status=1);
3)范围比较
- between ... and ..在..和..之间
- in:在某个集合内
- not in:不在某个集合内
eg:查询所有金额在3000~6000之间的记录
select * from acct
where balance between 3000 and 6000;
eg:利用in操作查询指定户名的账户
select * from acct
where acct_name not in('shengjia','jia9');
4)模糊查询
- 格式 :where 字段名称 like 通配字串
- 通配符 单个下划线(_)匹配单个字符
%匹配多个字符
eg:查询账户名称已D开头的记录
select acct_no from acct where acct_name like 'D%';
查询账户名称已D开头S结尾的记录
select acct_no from acct where acct_name like 'D%s';
select acct_no from acct where acct_name like '%h%';
5)空/非空判断
-判断为空:is null
-判断非空:is not null
eg:查询acct_type为空/非空的记录
selece * from acct
where acct_type is null;
5.查询字句:排序,分组,筛选
1)order by 子句
将查询结构按照某个字段排序
格式:order by 排序字段[ASC/DESC]
ASC升序(默认)
DESC降序
select acct_no,acct_name,balance from acct order by balance desc;
2)limit子句
- 作用:限定查询结果显示的笔数
- 格式:limit n 只显示前面的n笔
limit m,n 从第m笔显示,共显示n笔
eg:显示账户信息前2笔
select acct_no,acct_name,balance from acct limit 2;
eg:显示账户余额最大的前2笔
select acct_no,acct_name,balance from acct order by balance desc limit 2;
eg:查询账户,按照金额倒序排列,从第二笔开始,共显示3笔
select acct_no,acct_name,balance from acct order by
分页示例:
创建简单表
create table page_demo(no varchar(8),name varchar(32));
insert into page_demo values
('1','Jerry'),('2','tom'),
('3','robot'),('4','dekie'),
('5','steven'),('6','emma'),
('7','yuhua'),('8','jia'),
('9','nine'),('10','ten');
分页查询,每页3笔数据
select * from page_demo limit 0,3;
select * from page_demo limit 3,3;
select * from page_demo limit 6,3;
select * from page_demo limit 9,3;
页数从1开始,第n页的查询语句
m = (页码-1)*每页笔数
n = 每页笔数
select * from page_demo limit m,n;
3)聚合函数
- max/min : 查询最大/最小值
eg:查询余额最大值
select max(balance) from acct;
select min(balance) from acct;
- avg:求平均值
eg:求所有账户的平均值
select avg(balance) from acct;
- sum:求和
-count:统计
select count(*) from acct;
*注意:count后的括号中,跟字段名称该字段值为空的数据不参与统计
分组格式: group by 分组字段名称
eg:分组统计各状态账户的数量
select ststus "状态",count(*) "数量" from acct group by ststus,acct_type;
注意:根据那些字段分组,则需要先将字段查出来
eg:分组统计各类型账户中,余额最大值
select acct_type "类型",max(balance) "余额" from acct group by acct_type;
5)having 子句
-作用:对分组聚合的结果进行过滤,需要和group by 配合使用
-示例:
eg:按照账户类型统计余额总和,过滤掉账户类型为空的数据
select acct_type ,sum(balance)from acct group by acct_type having acct_type is not null
order by acct_type desc
limit 1;
insert into acct values
('78904','sheng4','c0002',3,now(),1,200.00),
('78905','sehng5','c0002',1,now(),1,1300.00),
('78902','sehng6','c0002',2,now(),1,3500.00);
-执行顺序:(难点)
第一步:from acct
首先执行from 语句,找到数据源
第二步:where
执行 where 子句,选出满足条件的数据
第三步:group by acct_type
按照指定字段分组
第四步:sum(balance),acct_type
按照分组进行聚合
第五步:having acct_type is null
对分组聚合后 的数据进行过滤
第六部 :order by acct_type
排序
第七部:limit
限制显示笔数
作业:
1. 创建数据库eshop,并指定为utf8编码
2. 创建订单表(orders,utf8字符集),包含
如下字段
order_id 订单编号,字符串,32位
cust_id 客户编号,字符串,32位
order_date 下单时间,datetime类型
status 订单状态,枚举类型,枚举范围
('1','2','3','4','5','6','9')
1-待付款,2-待发货
3-已发货,4-已收货
5-申请退货,6-已退货
9-废弃
products_num 包含的商品数量,整数型
amt 订单总金额,浮点,两位小数
3. 在orders表中至少插入5笔数据
数据看上去尽量真实
4. 编写SQL语句,实现如下功能:
1)查找所有待付款订单
2)查找所有已发货、已收货、申请退货的订单
3)查找某个客户待发货的订单
4)根据订单编号,查找下单日期、订单状态
5)查找某个客户所有订单,按下单时间倒序排列
6)统计每种状态订单笔数
7)查询订单金额最大值,最小值,平均值,总金额
8)查询金额最大的前3笔订单
9)修改某个订单状态为“已收货”
10)删除已废弃的订单
1.建库:create database eshop
dafault charset-utf8;
2.建表:create table orders(order_id varchar(32),
cust_id varchar(32),
order_date datetime,
status enum('1','1','3','4','5','6','9'),
products_num(16,2))default charset=utf8;
3.插入数据:insert into orders values
('201801010001','0001',now(),'1',2,100);
insert into orders values
('201801010002','0002',now(),'1',1,200);
insert into orders values
('201801020001','0001',now(),'1',4,70);
insert into orders values
('201801010003','0002',now(),'2',3,450.26);
insert into orders values
('201801020007','0003',now(),'1',4,10.12);
4.查询
1)select * from orders where status='1';
2)select * from orders where status in ('3','4','5');
3)select * from orders where cust_id = '0002'and status='2';
4)select order_date,status from orders where order_id='201801010001';
5)select * from orders where cust_id ='0002' order by order_date desc;
6)select status "状态",count(*)"笔数"from orders group by status;
7)select max(amt),min(amt),avg(amt),sum(amt)from orders;
8)select * from orders order by amt desc limit 3;
9)update orders set status = '4' where order_id='201801010001';
10)delete from orders where status='9';