PHP NOTE 9 mysql 复习
@20130611 by boxcore
约定:
tabname:表名
dbname:数据库名
fieldname 或 field+n : 字段名
oldTabName:旧表名
newTabName:新表名
——————–
一、数据库概述
——————–
1.MySQl操作过程:MySQl 服务端,MySQl客户端;
2.数据库产品分类:关系型数据库 ,非关系型数据库;
3.数据表的字符集:Client,Conn,Server,DB
     1 )my.ini配置默认字符串:
          dafault-character-set=utf8     # client & Conn charset;
          character-set-server=utf8       # server & DB charset;
     2 )PHP语句设置客户端字符集: mysql_query(“set name utf8”);
     3 )创建表时指定字符集方法:
          create table tab(…)engine=MyISAM DEFAULT CHARSET=utf8; (简写)
          create table tabname(…)type=mysiam default character set utf8 collate utf8_generalci;
4.数据表组成:表结构文件 (),表数据文件(), 表索引文件 ();
5.数据库引擎:InnoDB支持事务处理,但不支持全文搜索, MyISAM支持全文搜索但不支持事务, MEMORY和MyISAM 一样,只不过它把数据保存在内存而不是磁盘中,这样速度更快。
———————-
二、数据库的常用操作:
———————-
1.数据库的连接:mysql -uroot -p123 -h192.168.2.2
2.退出MySQL:exit|quit|Ctrl+C
3.中断数据库的操作:c
4.MySQl服务器的关闭和退出:net stop mysql || net start mysql
5.MySQl中用户的修改:set password=password(“密码 “);
     创建用户: CREATE USER ‘test1’@’localhost’ IDENTIFIED BY  ‘**’;
6.MySQl中用户授权:grant all on .* to user1@192.168.190.20 identified by “密码”;
     GRANT ALL PRIVILEGES ON  `test1%` .  TO  ‘test1’@’localhost’;
7.刷新权限如:flush privileges;
      在客户端修改用户权限后需要刷新数据库缓存
8.查看用户授权
     use mysql
     select user,password,host from user;
10.删除用户
     方法一: drop user user1@”%”;
     方法二:
          use mysql
          delete from user where user=” 用户名”;
—————–
三、数据库的操作
—————–
1.创建数据库     create database dbname ;
2.查看数据库     show databases;
3.删除数据库     drop database dbname ;
4.切换数据库     use dbname ;
———–
四、表操作
———–
1.查看表:show tables ;
2.创建表:create table tabname (field1 ,field2, fieldn);
3.删除表:dorp table [if exists] tabname ;
4.修改表名:rename table oldTabName to newTabName ;
5.查询表结构:desc tabname;
——————–
五、表内容管理
——————–
1.增加数据:insert
insert into user(name) values(“user4”);
2.删除数据:delete
//必须加where 条件,如果不加 where全部删除,这个时候应该用 truncate清空数据
delete from user where id>=3 and id<=5;
delete from user where id between 3 and 5;
3.修改数据:update
update user set name=’user5’,age=20 where id=5;
//在mysql 中没有==,只有 =,即包含赋值,又包含比较
4.查询数据:select
———————–
六、数据字段类型
———————–
1.数值     // 显示和大小
int|float|tinyint
     ·tinyint数值类型的无符号取值范围: 0-255
     ·int数值类型的无符号取值范围: 0-42亿
2.字符串 // 显示和个数
char|varchar|enum|set
     ·char(3)的意思是什么: 0-255
     ·varchar(3)的意思是什么: 0-65535
3.日期和时间( 数值)
date|time|datetime|year|timestamp
     在php中把时间加工成时间戳,放到 mysql中的int 列
——————-
七、数据字段属性
——————-
1.unsigned
2.zerofill
3.auto_increment
4.null
5.not null     # 如表中性别例子 ,如果有一列你设计成not null,那么给 default默认值
6.default
—————–
八**.**数据表的类型
—————–
1.myisam     // 默认就是 myisam
2.innodb     // 事务
     创建表时指定表类型: create table t1(id int) engine=innodb;
     修改表引擎类型: alter table tablename engine=innodb;
     查看表类型: show create table tabname;
——————-
九**.**数据表索引设置
——————-
1.主键索引 primary key 一个表中只能有一个主键索引
添加索引 :
1).建表时就加上去
2).用alter 命令
     alter table t2 add primary key(id);  // 加主键
     alter table t2 modify id int unsigned auto_increment; // 加无符号和自增属性
删除索引 :
     alter table t2 modify id int; // 加无符号和自增属性
     alter table t2 drop primary key;
2.唯一索引     unique index
     // 每一列都可以是唯一索引,本列值不能重复值
3.普通索引     index
     添加索引 :alter table user add index in_name(name);
     删除索引 :alter table user drop index in_name;
//每一列都可以是普通索引
4.全文索引     fulltext
————————
八**.**修改数据表结构 -alter
————————
1.修改字段
1)change
·alter table user change age sex int;
#把age 的字段重命名为 sex并设置字段属性为int;【更改字段名,修改字段名】
//修改字段名的时候建议带上他原有的 int或者varchar 属性,如果不写属性会报错;
2)modify
·alter table user modify age tinyint;
2.添加字段
     ·alter table user add age int;  //默认加到最后
     ·alter table user add age int first;  //加到最前面去
     ·alter table user add age int after id;  //加到id 后面
3.删除字段
     ·alter table user drop age;
4.添加索引
     ·alter table tab62 add primary key(id);
     ·alter table tab62 modify id int unsigned auto_incrment;
     ·alter table tab62 add unique un_name(name);
     ·alter table tab62 add index in_pass(pass);
5.删除索引
     ·alter table tab62 modify id int;
     ·alter table tab62 drop primary key;
     ·alter table tab62 drop index in_pass;
     ·alter table tab62 drop unique un_name;
6.更改表名称
     1)rename table tab62 to tab26; 修改表名,非字段
     2)alter table user rename to user1;
7.更改auto_increment 属性的初始值
alter table user autoincrement=1;
//truncate user;  效率快,自增列表自动从 1开始(清空表中所有数据)
8.更改表名称:alter table 旧表名 rename as 新表名
9.删除表:dorp table [if exists] 表名;
———————————–
结构化查询语言 sql**包含四个部分**:
———————————–
1.DDL   // 数据定义语言 ,create,drop,alter
2.DML   // 数据操作语言 ,insert,update,delete
3.DQL   // 数据查询语言 ,select
4.DCL   // 数据控制语言 ,grant,commit,rollback
—————————-
操作数据表中的数据记录 (DML)
—————————-
1.insert
eg:insert into user(name) values(“user4”);
2.update
update user set name=”user4” where id=4;
//在mysql 中没有==,只有 =,即包含赋值,又包含比较
update user set name=’user5’,age=20 where id=5;
3.delete
//必须加where 条件,如果不加 where全部删除,这个时候应该用 truncate清空数据
delete from user where id>=3 and id<=5; 等同于 delete from user where id between 3 and 5;
———————————
数据查询语言( DQL**)**–select 使用
———————————
1.选择特定的字段
select id,name from user;
//select  from user;
2.给字段取别名-as
select id,name from user;
select id maoxian,name from user;
select id as maoxian,name from user;
3.distinct关键字的使用
//取出唯一值
select distinct age from user;
4.使用where 条件进行查询
select  from user where id>=3 and id<=5;
5.查询空值null
select  from user where age is null;
select  from user where age is not null;
6.between and的使用方法
select  from user where id between 3 and 5;
7.in的使用方法
select  from user where id=1 or id=2 or id=10;
select * from user where id in(1,2,10);   建议使用这个
8.like的使用方法
//模糊查询,text 类型不能加索引
% 匹配所有
 匹配一个字符
select  from user where  name like “%mysql%”;  //% 在前,name这一列的索引会失效
9.使用order by 对查询结果排序
//排序,asc 和desc,一个是升序,一个降序
select  from user order by id asc;  // 默认就是升序 ,数字从小到大
select  from user order by id desc;  // 默认就是升序 ,数字从大到小
10.使用limit 限定输出个数 (分页实现)
select  from user order by id limit 0,2;
select  from user order by id limit 5; //limit 0,5  前五个
11.concat() 连接函数
select concat(id,age) from user;     # 输出的值为每一行中指点的列字符串相加。
select concat(“aaa”,”bbb”,”cccc”);  # 输出连接的字符串: aaabbbccc,如果没有双引号则误认为是字段,报错。
12.rand() 随机数
eg: select  from user order by rand() limit 3;
13.使用统计函数:
count() 统计个数
sum() 求和
avg() 平均值
max() 最大值
min() 最小值
eg:
select count(id),sum(age),avg(age),max(id),min(id) from user;
14.group by分组聚合的 使用-select
结合合计函数,根据一个或多个列对结果集进行分组
//分组  聚合
//只分组没有意义,必须用函数去聚合 .
eg: select banji,sum(score),count(id) from user group by banji; // 从班级表中统计每个班的总分数和总人数
eg2:查找每个客户的总金额(总订单) :
————————————
O_Id OrderDate      OrderPrice Customer
1      2008/12/29      1000     Bush
2      2008/11/23      1600     Carter
3      2008/10/05      700      Bush
4      2008/09/28      300      Bush
5      2008/08/06      2000     Adams
6      2008/07/21      100      Carter
————————————
执行语句: SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer;
结果集类似这样:
————————-
Customer SUM(OrderPrice)
Bush           2000
Carter           1700
Adams           2000
————————–
—————————————
数据查询语言( DQL**)**2–select 的多表查询
—————————————
假如下面三种方法都能实现一种表,优先选择普通多表查询。
1.普通多表查询
1)两表查询
mysql> select user.id,user.name,user.score,user.banji,tel.num from user,tel where user.id=tel.uid;
2)三表查询
mysql> select user.name,tel.num,qq.qq from user,tel,qq where user.id=tel.uid and user.id=qq.uid;
2.嵌套查询| 子查询-in
select  from user where id in(select uid from tel);
3.左链接查询-left join on
select user.id,user.name,tel.num from user left join tel on user.id=tel.uid;
//左链接以左边的表为主导,先输出左边表的所有数据,按条件输出右边表的内容,没有相对应的内容就为 null
普通多表查询的三种方法,分别有什么区别:
普通多表查询,查多个表,并且可以输出多个表的内容
嵌套查询,查多个表,但只能输出一个表的内容
左链接查询,查多个表,先把左边的表全部输出,右边的表按条件输出,否者输出 null
==========================================
复习 –**最常用的语法:*
———————————–
1.DDL 数据定义语言,create,drop,alter
1)create database {database}
2)create table {table}();
2.DML 数据操作语言,insert,update,delete
1)insert into 表名 [(字段 1,字段2, 字段n)] values (‘值 1’,’值2’,’ 值n’);
2)update 表名 set 字段名 =表达式[, 字段n=表达式 n] [where 条件] [order by 字段] [limit 行数 ];
3)delete from 表名 [where 条件 ] [order by 字段] [limit 行数];
3.DQL 数据查询语言,select
select [all|distinct] {|table.*|[table.]field[as alias1][,[table.]field2[as alias2][,…]]} from tableexpression[,…][in externaldatabase] [where…] [group by…] [having…] [order by…] [limit count];
4.DCL 数据控制语言,grant,commit,rollback
1)grant 权限 on 数据库 .数据表 to 用户@登录主机 indentified by “密码”