/********** 基本数据类型*******************/
#数值
tinyint 1字节 8位
有符号 :-128--->127(只有后七位表示绝对值 最高位表示正负)
无符号 : 0--->255
smallint 2 字节 16位
有符号 :[-32768]-2^15--->[32767]2^15-1(只有后七位表示绝对值 最高位表示正负)
无符号 : 0--->[65535]2^16
mediumint 3 字节 24位
有符号 :[-8388608]-2^23--->[8388607]2^23-1(只有后七位表示绝对值 最高位表示正负)
无符号 : 0--->[16777215]2^24
int 4 字节 32位
有符号 :[-2147483648]-2^31--->[2147483647]2^31-1(只有后七位表示绝对值 最高位表示正负)
无符号 : 0--->[4294967295]2^32
bigint 8 字节 64位
有符号 :[-9223372036854775808]-2^63--->[9223372036854775807]2^63-1(只有后七位表示绝对值 最高位表示正负)
无符号 : 0--->[ 18446744073709551615]2^64
Tinyint(M) unsigned zerofill
unsigned 表示零填充 ,影响值的范围
M表示宽度 只有在 zerofill 时才有意义
zerofill [默认 unsigned ]
float (M,D) 浮点型
decimal (M,D) 6,2 定点型
M : 精度(总位数,不含小数点)
D : 标度(小数位)
银行的四舍五入算法 ,根据单双数舍,概念相同
字符型:
char (M) 定长 可存储 字节数M<=255 实占M个字符 不够右侧补空格
取出除时去掉右侧空格
varchar (M) 变长 可存储 字节数M<=65535,有1-2字节 记录真实长度
日期时间类型:
Year 类型
1901-2155 年 [0000年 表示错误年份]
两位 00-69 表示2000-2069
70-99 表示1970-1999
Date 类型 格式 1992-08-12
1000-01-01-->9999-12-31
Time 类型
hh:mm:ss
datatime 类型
1990-02-25 12:12:12
真正存储时间 是用的时间戳 而不是具体时间
/********** 逻辑运算法*******************/
not !
or ||
and &&
between -- and --
in (2,3,4,5)
/********** 通配符*******************/
select * from student where name like '李%';
select * from student where name like '李*';
%匹配 单个字符
*匹配多个字符
/********** select 5个子语句 和 函数*******************/
max
min
sum
avg
count
group by
order by
having
select max(id) from student ;
select * from student where id >2 order by name,id asc ;
asc 升序
desc 降序
limit
limit [offset,num]
offset 偏移量
num 取出个数
select * from student where id >2 limit 3,3
where 把表达式放在行内,看表达式是否成立
取出的结果理解为一张临时表
select * from student where id in (select max(id) from student )
select * from student where id = (select max(id) from student )
1 where 把内层的结果看做是外层结果的比较条件
通常用来查询 最大 最贵商品
表达式在哪一行成立 哪一行就被取出来
== >< > < >= <= in between and or and not
2 from 把内层的查新结果当成临时表[as 加临时表名],供外层再次查询
通常用来查询 最新最贵商品
3 exists 把外层的查询结果 带入内层 看是否符合条件
select * from category where exists (select * from goods where cat_id = 栏目id )
(select * from goods where goods.cat_id = category.cat_id )
select good_id,good_name,market_price-shop_price as shengqian from goods having shengqian >1000;
4 group by 分组 一般配合统计函数一起使用
max min avg sum count
5 having 表达式
数据再表中 表在硬盘或者内存里
where针对 表文件发挥作用 查询结果可以看做一张表
having 针对查询结果起作用!!
6 order by 排序
可以针对字段 升序[asc] 降序[desc] 排列
如果一个字段排不出结果 可选择其他字段继续排序
order by 字段1[asc]、[desc],字段2[asc]、[desc]
7 limit 限制条目
limit [offset,]M
offset 偏移量
M 取出条目
union 合并查询结果
左连接 右连接 内连接
把两次或者多次查询结果合并在一起
要求:两次查询的列数一致
推荐:查询的每一列的列类型一致
select * from ta
union
select * from tb
自动去除重复的
如果不想去除 那么 加all
select * from ta
union all
select * from tb
左连接
select 列1,列2...N from
table a left join table b
on table a 的列 = table B 的列
where / having ....
右连接
select 列1,列2...N from
table a right join table b
on table a 的列 = table B 的列
where / having ....
内连接
select 列1,列2...N from
table a inner join table b
on table a 的列 = table B 的列
where / having ....
取出 左右连接的交集
视图 如果一个查询结果非常频繁的进行操作,就把这个结果创建视图
由查询结果形成的一张虚拟表(当做表看)
create view viewname select 语句
使用视图的情况;
1 简化查询
2 把多张表放在一个里
3
drop view viewname
alter view viewname as select 语句
视图中的增删改能影响到表
视图 insert 必须包含所有表中没有默认值的列
Algorithm = merge / temptable / undefined
merge 引用视图的语句 与定义视图的语句合并
temptable 引用视图时根据视图的创建语句建立临时表
瞬间创建一个临时表
undefined 未定义,系统自动选set names gbk;
择
字符集和校准集
create table table_name
(
...
) charset utf8
表声明 字符集 存储就是那个字符集
告诉服务器给它的数据 character_set_client = gbk / utf8 ;
告诉转换器,转成什么格式 character_set_connection = gbk / utf8 ;
返回结果 character_set_result = gbk / utf8 ;
如果三者相同 简写成 set names utf8
出现乱码的情况:
client 声明与事实不符
result 与客户端页面不符时候
collation 校准集
触发器
应用场景:
1 当想一个表中添加或者删除数据,需要再相关表中进行同步操作
2 当表上某列数据的值与其他表的数据有联系时
3 需要对某张表进行跟踪时
create trigger triggername
after / before
insert / update /delete on 表名
for each row
begin
sql语句
end
分界符
delimiter #
如何在触发器引用行值
对于 insert 新增的行用 new 来表示
行中的每一列的值 用 new.列名来表示
对于 insert 删除的行用 old 来表示
行中的每一列的值 用 old.列名来表示
对于 update 修改前的行用 old 来表示 修改后的行用 new
行中的每一列的值 用 old.列名来表示
清空表
truncate 表名;
事务
start transaction
sql语句
commit / rollback
备份
#导出库下的表
mysqldump -u 用户名 -p 密码 库名 表1 表2.。。>地址/文件名.sql
#导出库下所有表
mysqldump -u 用户名 -p 密码 库名 >地址/文件名.sql
#导出一个库
mysqldump -u 用户名 -p 密码 -B 库名 库名 >地址/文件名.sql
#导出所有库
mysqldump -u 用户名 -p 密码 -A >地址/文件名.sql
恢复
#以库为单位
source <地址/文件名.sql
#以表为单位
use database
再 source <地址/文件名.sql
索引
# 原则
不要过度索引
索引条件 查询(where)比较频繁的时候
散列值上(不集中)
普通索引 index 加快查询速度
唯一索引 unique index 行上的值不能重复
主键索引 primary key 主键必唯一 但是唯一索引不一定是主键
一张表只能有一个主键索引 可以一个或者多个唯一索引
全文索引 fulltext index 对于中文意义不大
#增加索引
alter table 表名
add index / unique index / fulltext index
索引名(列名) / primary key
如:
alter table member add index tel(tel);
主键索引
alter table 表名 add primary key (列名)
#删除索引
alter table 表名 drop index 索引名
alter table 表名 drop primary key
/********** 基本语句练习*******************/
#建表语句
create table demo
(
age smallint ,
name varchar(20)
)
#增加行
insert into demo
(age,name)
values
(20,'张三');
#设置编码
set names GBK
#删除列
delete from demo where id = 3;
#查询语句
select * from demo ;
select age,name from demo where age>10;
# 新增列[ 一次只能增加一列]
alter table demo add age2 tinyint unsigned ;
alter table demo add age3 tinyint not null default 0;#声明默认值
# 建表语句
create table student
(
id smallint primary key auto_increment ,
name char (8) not null default "",
age tinyint not null default 0,
email varchar (20) not null default "",
date_in date not null default '2012-01-01'
) engine = Innodb charset = UTF-8;
#插入数据
insert into student
(name,age,email,date_in)
values
('张思',22,'60002@qq.com','2013-01-06');
#修改数据
update student set
name = '宋江',
age=99
where id =1;
#删除
delete from student where id =3;
delete from student where id between 1 and 5;
等价于:
delete from student where id >=1 and id<=5;
delete from student where id in (1,2,3,4,5);
#列的增删改
alter table boy add height tinyint unsigned not null default 149;
alter table boy add height tinyint unsigned not null default 149 after id;
alter table boy change 被改变的列 新的列声明