mysqld.exe为数据库服务端 存取数据都要经过服务端
想要存取数据需要用客户端mysql.exe连接mysqld.exe才能存取
服务器客户端有多种,常用的是phpMyAdmin
表与库的概念
表就是多行多列的数据,多张表组成一个库,多个库又组成服务器
认识SQL
SQL 结构化查询语言 特点:描述需要的数据
根据不同特点分为三大类
DML 数据操作语言/使用者角度/80%
DDL 数据定义语言/建设者角度/建表/建库/建视图等/15%
DCL 数据控制语言/管理员角度/用于授权/操作事务时间及效果/5%
insert操作
insert into `table name` (列名) values (每一列的值)
3个重点:插入那一张表 插入哪几列 这几列分别插入什么值
不写列名的情况下,值按列的顺序进行填充(每一列都必须有值)
字符串的值必须加单引号
update操作
updata 表名 set 列1 = 新值 1,列2 = 新值 2 where 条件;
4要素 改什么表 改哪些列 改成什么值 在哪些行生效?
记得一定要加条件
delete操作
delete from 表名 where 条件 记得一定加条件
select操作
查询3问 1:查哪张表的数据? 2:查哪些列的数据? 3:查哪些行的数据
select 列1,列2`````` from 表名 where 条件;
mysql三大列类型
数值型 整形 Tinyint/ smallint/ mediumint/int/ bigint(M) unsigned zerofill
查询模型
列为变是变量就可以计算 where为表达式
取列值=投影运算 列与列运算=广义投影
where条件 <>不等于 in 在某个集合内 between 在某个范围内
or || 逻辑或 not ! 逻辑非 and && 逻辑与
like 后面接%代表任意字符 _代表一个字符 如:where goods_name like "诺基亚%";
mysql函数: concat(‘xxx’,‘原文’)拼接字符串 substring(‘需要截取的文字’,‘截取长度’)截取字符串
select concat('htc',substring(goods_name,4)) from goods where goods_name like "诺基亚%";
NULL
查询null只能用 is null 和 not null 尽量避免使用null
group分组与统计函数
max()求最大 count()求行数 avg()平均值 min()最小值 sum()求总和
group()分组 一般情况下挺耗费资源的 如果加了别的字段语义有歧义的时候,取按照分组字段排序出现的第一条数据
例子:select cat_id,count(*) from goods group by cat_id; 以cat_id为分组条件查询每个cat_id的数据条数
如果要加where 要写在group by前面
having对结果集进行筛选 having永远写在where语句的后面 因为它只作用于where查询出来的内容
where对数据表进行筛选 结果集存放在内存 where之针对表数据发挥作用
综合案例:求不及格两门同学的平均成绩
SELECT `name`,sum(score<60) as bjg,avg(score) FROM `result` where 1 GROUP BY name HAVING bjg>=2;
order by 排序 降序 desc 升序 asc 默认
select goods_name,cat_id,shop_price from goods order by cat_id,shop_price asc;
limit
select goods_name,cat_id,shop_price from goods ORDER BY shop_price desc LIMIT 0,3;
5种查询语句的书写顺序 where---group by---having---oreder by---limit
1+n查询
1条语句引发N条数据->N条数据引发N条查询 尽量避免这种操作
where型语句子查询
查询每个栏目下最新的商品 (goods_id为最大) 查询结果作为where条件参与运算
select * from goods where goods_id in(select MAX(goods_id) from goods where 1 group by cat_id) 内层查询结果作为外层比较条件
from型语句子查询
查询每个栏目下最新的商品 (goods_id为最大) 查询结果作为二次查询的表来进行运算
select goods_id,goods_name,cat_id from (select * from goods where 1 order by cat_id,goods_id desc) as cxjg where 1 group by cat_id
exists型句子查询
两表数据进行运算 查询有商品的栏目
查询有商品的栏目 select * from category where exists(select * from goods where goods.cat_id = category.cat_id);
girl表 boy表
内连接查询
SELECT * FROM `boy` inner join `girl` on boy.hid=girl.hid;
左连接查询
selse * from `boy` left join `girl` on boy.hid=girl.hid; 以左边数据为标准,查不到的补NULL
右连接查询
selse * from `boy` rightjoin `girl` on boy.hid=girl.hid; 以右边数据为标准,查不到的补NULL
案例
SELECT
t1.tname as '主队',mres,t2.tname as '客队',matime
FROM
`m`
LEFT JOIN t as t1 ON m.hid = t1.tid
left join t as t2 on m.gid = t2.tid
where matime between '2006-6-1'and'2006-7-1'
;
同一个表可以进行多次连接 只需要给不同的别名即可
union语句
union把两条或者多条sql查询语句的结果合并成一个结果集 数据可以是两个表或者多个表的数据
sql1 n行 sql2 行 sql1 union sql2 = n+m行
必要条件:取出结果集的列数必须相同,列名未可不相同,列名以第一条sql数据的列名为基准
注意:使用union完全相等的行数据会被合并 (合并是耗资源的操作,尽量避免)
使用 union all 可以避免数据合并
union语句中无需写 order by 子查询order by 意义不大,因为合并后进行order by 效率更高
a表: b表:
案例:select id,sum(num) from (SELECT * FROM `a` union all select * from `b`) as jh where 1 group by id;
创建表
建表语句 create table 表名(
列1 列类型 [列属性 默认值],
列2 列类型 [列属性 默认值],
列3 列类型 [列属性 默认值],
……
列n 列类型 [列属性 默认值]
);
engine = 存储引擎
charset = 字符集
添加列
alter table bb add 列名 列类型 [列属性 默认值]
列类型——整形列
整形列各个类型所占大小
整形列属性介绍
unsigned 无符号 表示列的值从0开始,不为负数
zerofill 适用于学号/编码/序号等固定宽度的数字,可用0填充至固定宽度 使用zerofill属性的同时列也有unsigned属性 即从0开始不为负数
M 设定zerofill填充0至多宽
注意:补零仅影响显示,而显示仅在 windows 下通过cmd命令行使用mysql客户端工具才能够显示 linux下通过mysql 客户端命令行下可以显示
例子:alter table tablename add liename tinyint<5> zerofill;
浮点列与定点列
float(M,D) M为总位数 D为小数点后面的数字
double
decimal
区别:float/double 精度会有精度损失 decimal 定点型 更精确
字符型列
char型 M最大字符数为255 如果内容不够宽度,内部会使用空格补齐,取出来时候再把 ‘右侧空格’删掉 varchar不会
varchar M最大字符6W+
text 存储文章文本时选用
blob 二进制类型 用来存储视频、音频、图像等二进制信息
ender 枚举类型 可设置insert范 围的值 一次只能选择一个
set 枚举类型 设置insert范围的值,一次可以多选值
日期时间类型
year 年 如:1999 2004
data 日期 1994-12-5
time 时间 13:52:13
datetime 时间日期 1994-12-5 13:52:13
timestamp 自动更新时间戳
一般存储时间使用时间戳存储不是用datetime,因为时间戳方便计算
列的默认值
避免NULL 使用 not null default 默认值
主键与自增
id int primary key auto_increment
主键 primary key 此 列不重复 能区分每一行
自增 auto_increment 自动增长 一张表上只能有一列为自增列 并且此列必须加上索引
建表技巧
一张表如果都是定长列,查询速度会很快
定长与变长分离
常用字段与不常用字段分离
列的增删查改
增加 alter table 表名 add 列名······· alter table 表名 add 列名·······(after)插入在指定列后
删除 alter table 表名 drop column 列名
修改 alter table 表名 change 列名 列属性····· alter table 表名 modify 列名 新属性·····
查看 desc 表名
视图
又被称为虚拟表,视图是sql的查询结果
作用: 权限控制可以用 可通过视图开放其中一列或者几列
简化复杂的查询
视图可以更新/删除/修改
但是必须需物理表一一对应才可进行,如果多对一则无法进行操作
create view v4(视图名) as select goods_id,goods_name from goods;
视图aigorithm
对于简单查询形成的view,在对view查询时,可以把建立视图的语句+查询视图的语句===合并=》查询物理表的语句
这种视图算法叫merge(合并)
或者视图语句本身比较复杂,如果进行合并难以解读,这时候mysql会先执行视图语句形成临时表,再对临时表进行查询
这种视图算法叫temptable
建立视图的时还可以规定视图的算法 如:
create algorithm=merge view v5 as select goods_is from goods;
表and视图常用语句
存储引擎概念
frm:表结构 MYD:表数据 MYI:表索引
查询表存储引擎: show table status where name='表名' G
Menory引擎:存储速度快,一般用于存储临时数据,因为服务器一关机就会没有
Innob引擎:每次存储有日志,可回复性高
Misam:可直接复制相应数据库文件无需导入数据库即可生成表
字符集与乱码
计算机显示出现乱码是因为:数据本身的字符集与所显示的字符集不一致而导致
===
彻底杜绝乱码现象:
1 php文件本身为utf-8 2 meta charset="ust-8" 3 表字符集为utf_8 4 数据库查询时声明 set names utf-8
校对集:字符排序的顺序
索引概念
索引是数据的目录,能快速定位行数据的位置
索引提高查询速度,降低增删改速度
一般在查询频繁的/重复数据少的列上添加索引效果更好
create teble t12( id int, name char(10), email char(20), primary key(id), //主键索引 key name(name), //普通索引 unique key emaill(emaill) //唯一索引 primary key(id,name), //多列索引 );
索引类型:
key 普通索引
unique key 唯一索引
primary key 主键索引
fulltext 全文索引(中文环境下无效,要分词+索引,一般用第三方解决方案,如sphinx)
索引长度:key name(name(10)); 只引用前10个字符作为索引
多列索引:key name(name,id); 把两列的值作为一个整体作为索引
索引操作
查看表索引 show create table 表名 // show index from 表名
删除表索引 alter table 表名 drop index 索引名 // drop index 索引名 on 表名
添加表索引 alter table 表名 add[index/unique]索引名(列名)
添加主键索引 alter table 表名 add primary key(列名称)
删除主键索引 alert teble 表名 drop primary key
关于事务
启动事务 start transaction;
结束事务 commit;
回滚事务 rollback;
事务隔离性 只能看到事务开始前和结束后的状态
事务原子性 是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生
事务一致性 事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性