mysql笔记

window
net start mysql
net stop mysql


mysql远程登录(加端口)

mysql -h 10.15.200.106 -P 3310 -u product -p


在mysql命令行下
exit;退出

配置系统的环境变量

sql structored query language

\s  //查看mysql的链接信息

show variables;
show variables like 'time_zone';
show variables like 'port';
desc xsphp.users;//查看表结构

DDL  数据定义语言 cteate drop alter
用于定义和管理数据对象(库,表,索引,视图),包括数据库,数据表等,例如 create drop alter等语句
create database xsphpdb;
create database if not exists xhphp;

create table if not exists xsphp.users(id int,name char(30));


CREATEDATABASE`ol_article`DEFAULTCHARACTERSETgbk COLLATE gbk_chinese_ci;


DML  数据操作语言,和表中的数据记录
insert into xsphp.users values(1,'zhangsan');
insert into xsphp.users(id,name) values(1,'zhangsan');//一般用这种方式
update xsphp.users set name='lisi',id=3;
delete from xsphp.users where id=3;

DQL 数据查询语言
select * from

程序中不能带*
distinct 是整个记录中不重复的 不是针对单独的某一个字段
set num+1 //可以减少一条查询语句

where 条件
&&   ||   !
and  or   not

比较运算符
=       和程序中的=不一样
<=>     比=号多了一个null
!= <>
<
<=
>
>=
is null  

is not null
between and
not between and

like          //_(任意一个字符)和%(0个或多个任意字符)
not like      //

in
regexps
select * from products where name regexp '^j';
select * from products where name regexp 'j$';



数据库中的null转换为程序 有可能转为0 有可能转为空
检索数据库中的null 要用 is null 不能用=号

百万条数据时就不能用一个表了
可以把长表分成短表 可以把20个字段分成5-4个字段

在关系型数据库设计中 规范化的数据库设计是包含使用正规的方法来将数据表分成
多个相关的表 拥有大量的窄表 是规范化数据库的特征
而拥有少量的宽表是非规范化数据库的特征

两个表相乘就是笛卡尔乘积

group by
count();
sum();
mix();
min();

having

用到什么数据查什么数据 不能全查出来之后再用程序处理

DCL
Data Control Language
是数据库控制语言
grant,deny,revoke

一般都用工具来执行
是用来管理数据库的语言 ,包含管理权限及数据更改 ,例如,

//按层次查找
? contents
? data types;
? int

?  show
? create
? update

sql是不区分大小写的,但是表就是一个文件名,库是一个文件夹,windows不区分大小写,linux区分大小写
一般是sql语句大写 自己定义的名称小写

在终端可以写多行
用\c不能用大C退出

->\c  退出
'->\c  这样退出不了
'->' 先补上单引号 然后用\c退出

mysql 类型
1.数值型                                            UNSIGNED
   整形(整数)
    非常小的整形  1字节 -128-127                     0-255         TYIYINT
    较小的整形    2字节 -32768-32767                 0-65535       SMALLINT
    中等大的整数  3                                  0-16777215    MEDIUMINT
    标准的整数    4字节  -2147483648-2147483647      0-4294967295  INT
    大整数型      8字节                                            BIGINT
    
    int(1) unsigned int(2) unsigned 存储都是一样的  最大值为4294967295
    加1 2 的目的是为了应用属性前导0 zerofill
   浮点型(小数)  //M总共有多少位
    //如果插入的数据超过了该列定义的实际精度 则插入的数值会四舍五入插入到实际定义的精度值 四舍五入的过程中不会报错
    float(M,D)         4字节
    double(M,D)        8字节
    
    浮点数存在误差 不能用==比较 要用范围比较
    
   定点数              //进行四舍五入的时候会产生警告 其实是按字符串型的数据存储的 比较精确的 但是CPU不能直接对它运算 会影响到效率
     decimal(M,D)       M+2字节
    
2.字符型
    "MYSQL" 'mysql'   mysql能够识别转义字符 \
                 最大存储空间
    char         255            属于固定长度
    varchar      好像无限长     可变长度
    
    char(4)      varchar(4)
    ''      4           ''       1字节
    'ab'    4           'ab'     2字节
    'abcd'  4           'abcd'   5字节
    'abcdef'4           'abcdef' 5字节
    
                          
    char   varchar  检索方式不同
    create table tb10(v char(4),c varchar(4));
    insert into tb10 values('ab ','ab ');
    select concat(v,'#'),concat(c,'#') from tb10;
    +---------------+---------------+
    | concat(v,'#') | concat(c,'#') |
    +---------------+---------------+
    | ab#           | ab #          |
    +---------------+---------------+
    
    char是固定长度 处理速度比varchar快的多 但缺点是浪费存储空间
    
    text 文本数据 (文章)        2的16次方-1
    
          MEDIUMINT            2的24次方-1
          LONGTEXT             2的32次方-1
    blob  二进制数据 (相片)     2的16次方-1
          
          MEDIUMBLOG
          LONGBLOG             大概是几个G
          一般的做法是用程序把文件中二进制数据读出来,插入数据库中
    enum  枚举  1或2字节   强调 枚举中存放的是字符串  一次只能存一个值
     ENUM('one','two','three','four');
    set   集合  1 2 3 4 8 字节           一次可以用多个集合中的值,中间使用逗号分开即可
3.日期型
    date       YYYY-MM--DD
    time       HH:II:SS
    datetime   YY-MM-DD HH:II:SS
    timestamp  YYYYMMDDHHIISS
    year       YYYY
    
    创建表时最好不要使用这些中时间格式  他们不好参与运算
    用整数保存时间戳 time();这个可以参与运算
    
四 数据字段属性
   1.unsigned 可以让空间增加一倍
   2.zerofill
    只能用在数值型字段 前导0 不够设定位数的补0
    该字段自动应用unsigned
   3.auto_increment
   只能是整数,数据每增加一条就会加1,字段的值不允许重复
   null 0 空   三种情况都会加1
   从最大的值开始加1
   4.null 和 not null
   默认是空
   null 值
   将来将这个表的数据转为php程序的数据时,整数列有null 能转成0吗 字符串有NULL 能转成 php ''吗 0.00吗
   建议,在创建表时每个字段都不要插入null
   
   使用 not null
   字段设为not null 缺省情况下默认转为0了
   
五 创建索引
   1.主键索引
      create table t7(
        id int not null auto_increment [primary key],
        name varchar(30),
        age int not null  default '0',
        primary key(id));
   2.唯一索引
     unquie
     创建唯一索引的目的往往不是为了提高速度 而是为了避免字段的重复
    
      create table users(
         id int not null auto_increment,
         name varchar(30) not null default '' unique,
         age int,
         primary key(id));
    
   3.常规索引
      最重要的技术
      提升数据库的性能
      
      可以提高查找的速度,减慢数据列上插入,删除,修改  因为你要插入 删除 修改的话必须按索引规则插入 删除 修改
      
      分表 专门创建索引的放到一个表里 没有索引的放到另一个表里 然后两个表用一个字段关联
      什么地方用索引 需要where条件进行搜索的 需要进行排序的 需要进行分组的
      索引会消耗系统资源 要适可而止
      
      和表一样是独立的数据对象
      可以单独使用
      也可以在创建表时创建
      
      index key 是同一词
      多列都可以指定索引
      
       create table cards(
         id int not null,
         uid int not null,
         sid int not null,
         number int not null,
         primary key(id),
         key cuid(uid),
         index csid(sid));
    
    
     以上是数据库优化中的最主要的部分
   4.全文索引
     fulltext类型索引 ,myisam表类型
     只有在varchar char text文本字符串上使用
     也可以多个数据列使用
    
     fulltext学习资料
     http://apps.hi.baidu.com/share/detail/34941200
   

   数据表类型及存储位置
   MYSQL和大多数数据库不同 mysql有一个存储引擎的概念
   mysql可以针对不同的存储引擎需求可以选择可以选择最优的存储引擎(插件式存储引擎)
   
   show engines
   
   查看默认的存储引擎
   show variables like 'table_type';
   
   MyISAM 和 InnoDB两个
   
   create table () type InnoDB;
   create table () engine=innodb;
   
   选择myisam还是innodb
   
   注意:在一个mysql库中可以(创建表时)指定不同表类型
   
   MyISAM表类型
   特点:成熟稳定 易于管理
   会经常产生一些垃圾碎片
   
   他使用一种表格锁定的机制 用来优化多个并发的读写操作
   OPTIMIZE table 表名  //经常使用这个命令来恢复表所浪费的空间
   强调快速读取操作
   
   也有缺点 有些功能不支持
   innodb
   事物处理的提交回滚崩溃恢复能力 这些事物安全的存储引擎  还可以支持外键
   支持myisam表所不支持的功能 占用空间大
   也有缺点 占用空间大
   
   功能               MyISAM          InnoDb
   事物处理           不支持          支持
   数据行锁定         不支持          支持
   表空间             相对小          相对大 大myisam表的两倍
   全文索引           支持            不支持
   
   innodb适合很多用户同时修改数据表中的内容
   
   create table t1(id int) engine myisam;
   
   create table t2(id int) type = myisam;
   
   db.opt //存储字符集的
   
   myisam引擎
   table.frm //存储表结构的
   table.myd //存储数据
   table.myi //专门保存索引的
   
   innodb引擎
   只有一个文件table.frm对应的数据文件
   innodb是采用表空间的概念来管理的 所有的内容都放在一个文件里了
   
   MRG_MYISAM
   
   七。mysql的默认字符集
   ascII 是七位编码 后来被转变为 iso-646的标准
   基本上所有的字符集都是兼容ascII码的
   
   iso-8859-1/latin1
   
   gb2312-80  80年发布  双字节编码字符集 不推荐  支持的中文少
   gb13000  不推荐      双字节
   gbk      可以用      双字节  
   gb18030   数据库支持还比较少见 双字节
   
   utf-32   四个字节的字符集                                        太长了
   usc-2    两个字符集   window 2000内部使用的就是这个字符集
   utf-16   两个字节或四个字节的字符集 java window xp/nt 内部使用
   utf-8    1-4个字节的编码linux/unix unicode 互联网               强烈推荐   但是每个汉字占三个字节
   
   如果数据库只需要支持一般的中文 数据量很大 性能要求也很高 那么应该选择双字节的字符集 比如说gbk 相对于utf8来说每个汉字相对较小
   
   gbk 2个字节
   utf-8 3个字节
   
   name varchar(12) 6个汉字   GBK
   name varchar(12) 4个汉字   utf-8
   但是我还是觉得使用utf8比较好 因为gbk utf-16 usc-2  等所有的字符集都是占两个字节 会造成很大的不必要的开销
   
   如果数据库需要做大量的数据运算 如比较 排序 采用定长的字符集比较好
   
   如果所有客户端程序都是支持相同字符集 优先选择该字符集作为数据库的字符集
   这样可以避免因数据转行带来的不必要的开销和数据的损失
   
   mysql服务器 数据库 数据表 字段
   
    show character set;
   
   数据库中的用的utf-8没有-  用utf8
   
   mysql的字符集
      字符集:是用来定义mysql存储字符的方式  36
      校对规则:比较字符串的方式
      一对多的关系:一个字符集可以对应多个校对规则
   show collation like 'gbk%';
   show collation;

   //数据库服务器的默认字符集
   my.ini里
   default-character-set=latin1
   
   show variables like 'character_set_server';//服务器字符集
   show variables like 'collation_server';//服务器的校对规则
   
   character_set_client
   character_set_connection
   character_set_results
   
   set names 字符集   //同时修改以上三个的值
   
   alter database character set utf8;
   alter table tb1 character set utf8;
   
   C:\Documents and Settings\Administrator>mysqldump -u root -p --default-character-set=gbk -d xs1>d:/sql.sql

   -d表示只导出表结构

source /home/www/newfish.0118.sql

   
   alter table tb1 add name varchar(30) not null;
   alter table tb1 add pid int unsigned not null;
   alter table tb1 add sex varchar(10) not null after name;
   alter table tb1 add id1 int first;
   alter tb1 modify sex char(3);  //modify只能改类型 如果想把字段名都改掉的话 用change
   alter table tb1 change name username char(3);
   alter table tb1 rename as users;
   alter table users drop sex;
   drop table users;
   
   清空truncate tablename
   


mysql内置函数

函数中可以将字段名作为变量来用,变量的值就是这个列对应的每一行记录

select concat("abc","yes","dddddddddd");

insert(str,x,y,insert);将字符串x位置开始,y个字符串长度替换为insert
mysql中的索引时从1开始的
select insert('abcfjhld',2,2,'hello');
+--------------------------------+
| insert('abcfjhld',2,2,'hello') |
+--------------------------------+
| ahellofjhld                    |
+--------------------------------+

 select lower('sDg');
 +--------------+
| lower('sDg') |
+--------------+
| sdg          |
+--------------+

select lower('HELLO'),upper('hello');
+----------------+----------------+
| lower('HELLO') | upper('hello') |
+----------------+----------------+
| hello          | HELLO          |
+----------------+----------------+


left(str,x); right(str,x) //分别返回最左别的x个字符和最有别的x个字符,如果第二个参数为null则什么也不返回

lpad(str,n,pad) ,rpad(str,n,pad) 用字符串pad对str最左边和最右别进行填充

select lpad('ss',10,'*'),rpad('dd',10,'#');

+-------------------+-------------------+
| lpad('ss',10,'*') | rpad('dd',10,'#') |
+-------------------+-------------------+
| ********ss        | dd########        |
+-------------------+-------------------+

trim() ltrim() rtrim()

replace(str,a,b)

select replace('abcejj','j','xx');
+----------------------------+
| replace('abcejj','j','xx') |
+----------------------------+
| abcexxxx                   |
+----------------------------+

strcmp(s1,s2);如果s1比s2小,返回-1,否则返回1 或 0        asc码进行比较
substring(str,x,y);//返回字符串中的第x位置起y个字符串长度的字符串
select substr('abcdefg',2,10);
+------------------------+
| substr('abcdefg',2,10) |
+------------------------+
| bcdefg                 |
+------------------------+

 select abs(-10);
 返回值
 ceil(x):返回大于x的最小整数
 floor(x):返回小于x的最大整数
 mod(x,y):返回x/y的摸
 rand:0-1直接
 ceil(rand*100)
 round(x,y):返回参数x的四舍五入的有y位小数的值
 truncate(x,y):返回数字x截断为y位小数的结果
 
 
select curdate();
+------------+
| curdate()  |
+------------+
| 2011-10-20 |
+------------+

select curtime();
+-----------+
| curtime() |
+-----------+
| 21:06:02  |
+-----------+

select now();
+---------------------+
| now()               |
+---------------------+
| 2011-10-20 21:06:35 |
+---------------------+

select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
|       1319116039 |
+------------------+

select from_unix(1319116039);
+---------------------------+
| from_unixtime(1319116039) |
+---------------------------+
| 2011-10-20 21:07:19       |
+---------------------------+

select hour(curtime());
+-----------------+
| hour(curtime()) |
+-----------------+
|              21 |
+-----------------+


select week(now());
+-------------+
| week(now()) |
+-------------+
|          42 |
+-------------+

select minute(curtime());
+-------------------+
| minute(curtime()) |
+-------------------+
|                16 |
+-------------------+

select monthname(now());
+------------------+
| monthname(now()) |
+------------------+
| October          |
+------------------+

select date_format(now(),'%Y-%m-%d %H:%i:%s');
+----------------------------------------+
| date_format(now(),'%Y-%m-%d %H:%i:%s') |
+----------------------------------------+
| 2011-10-20 21:21:11                    |
+----------------------------------------+


流程控制函数

 select id,salary, if(salary>3000,'height','low') from salary;
 +------+---------+--------------------------------+
| id   | salary  | if(salary>3000,'height','low') |
+------+---------+--------------------------------+
|    1 | 1000.00 | low                            |
|    2 | 2000.00 | low                            |
|    3 | 3000.00 | low                            |
|    4 | 4000.00 | height                         |
|    5 | 5000.00 | height                         |
|    6 |    NULL | low                            |
+------+---------+--------------------------------+


select id , salary , ifnull(salary,0) from salary;
+------+---------+------------------+
| id   | salary  | ifnull(salary,0) |
+------+---------+------------------+
|    1 | 1000.00 |          1000.00 |
|    2 | 2000.00 |          2000.00 |
|    3 | 3000.00 |          3000.00 |
|    4 | 4000.00 |          4000.00 |
|    5 | 5000.00 |          5000.00 |
|    6 |    NULL |             0.00 |
+------+---------+------------------+

select case when salary<=3000 then 'low' else 'high' end from salary;
+---------------------------------------------------+
| case when salary<=3000 then 'low' else 'high' end |
+---------------------------------------------------+
| low                                               |
| low                                               |
| low                                               |
| high                                              |
| high                                              |
| high                                              |
+---------------------------------------------------+

其他函数

select database();
select version();

select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+

select inet_aton('192.168.1.1');//ip地址的网络字节顺序
+--------------------------+
| inet_aton('192.168.1.1') |
+--------------------------+
|               3232235777 |
+--------------------------+

select inet_ntoa(3232235777);
+-----------------------+
| inet_ntoa(3232235777) |
+-----------------------+
| 192.168.1.1           |
+-----------------------+

select password('123213');//是给mysql系统本身用的
+-------------------------------------------+
| password('123213')                        |
+-------------------------------------------+
| *84BE5433CCE0D6A69FB5AE6C53E04007B49A9CA0 |
+-------------------------------------------+




PHP5中PDO可以处理各种数据库
mysqli只能处理mysql
mysqli的功能和性能比mysql高
如果以后要考虑到换数据库的可能 用PDO
mysqli 以后就用这个

mysql->oracle  数据切换 最难的是程序转为oracle的
大型项目可以同时开十几个链接
$link1 = mysql_connect();
$link2 = mysql_connect();
$link3 = mysql_connect();

解决错误
mysql语法错误等
mysql_errno();
mysql_error();

if(mysql_affected_rows() > 0){
}

必须要关闭链接

mysql_insert_id();
mysql_affected_rows();

mysql_pconnect   //建议链接的时候用持久链接的效率比较高

只要是客户端执行的函数 cmd 都可以在php文件中执行


mysql_fetch_row($result);//索引数组
mysql_fetch_assoc()//返回关联数组
以上两个没有效率问题 看个人喜好

mysql_fetch_array();//返回索引加关联数组 没有上面两个高
mysql_fetch_object();

mysql_data_seek($result,$row);//将指针移动到下一条记录


mysql_num_fields($result);
mysql_num_rows($result);
mysql_field_name($result,$col);
mysql_free_result($result);


$mysql = new mysqli("localhost","root","123456","xsphpdb");

if(mysqli_connect_errno()){
   echo "错误 " . mysqli_connect_error();
}

$sql = "select id,name from shops where id<50";
$result = $mysql->query($sql);

$rows = $result->num_rows;
$cols = $result->field_count;

$result->field_seek(2);

while($field=$result->fetch_field()){
  $field->argname;
  $field->name;
  $field->max_length;
}

$result->data_seek(5);

//记录信息
/*
* $result->fetch_row()    ----  mysql_fetch_row()     索引数组  
* $result->fetch_assoc()  ----  mysql_fetch_assoc()   关联数组 fetch_row 和 fetch_assoc 没有效率区分
* $result->fetch_array()  ----  mysql_fetch_array()   两个数组都返回(MYSQLI_ASSOC,MYSQLI_NUM,MYSQLI_BOTH)   //一般不是用 效率比较低
* $result->fetch_object() ----  mysql_fetch_object()
*
*/

$result->free();


//执行select语句,返回
$mysql->close();

处理字段信息
field_count
current_field
lengths

data_field
fetch_fields


php新加的功能都会以对象形式添加
mysqli i:表示改进  
1.功能增加了
2.效率大大增加(以后的php项目改成mysqli)
3.更稳定

就算是使用mysqli中过程化的编程方式,也比使用mysqli编程方式强
使用mysqli扩展就要使用面向对象的编程方式进行开发

1.mysqli和链接有关的类
2.mysql_result表达了对数据库的查询所返回的结果集。

以上两个类就可以完成mysqli扩展功能
mysqli初始化中加上了要选择的数据库

$mysqli = @new mysqli("localhost","123456","xsphp");
//有可能连接不成功 $mysqli有可能没有生成对象
if(mysqli_connect_errno()){
   echo "连接失败 " . mysqli_connect_error();
   $mysqli = null;
   exit;   
}

$mysqli = mysqli_init();
$mysqli->real_connect("localhost","root","123456","xsphp");
$mysqli->options();//调优

//select语句(结果集), 非select 会影响行数

$sql = "insert into";
$result = $mysqli->query($sql);//bool
/*
*  判断sql语句是否有误
*/
if(!result){    
  $mysqli->errno;
  $mysqli->error;
}


/*
* 判断行数时候受到影响
*/
echo $mysqli->affected_rows;

$mysqli->insert_id;//自动增长的id

$mysqli->close();

mysqli_stmt(后面重点介绍)


<?php
$mysqli = new mysqli("localhost","root","root");

$sqls = "select current_user();";
$sqls .= "desc `test2`.`user`;";
$sqls .= "select * from `test2`.`user`;";
$sqls .= "select current_date()";


if($mysqli->multi_query($sqls)){
 
  do{
     $result = $mysqli->store_result();
     echo '<table align="center" border="1" width='.(100*$result->field_count).'>';
     echo '<tr>';
     while($field = $result->fetch_field()){
        echo '<th>'.$field->name.'</th>';
     }
     echo '</tr>';
    
     while($row=$result->fetch_assoc()){
         echo '<tr>';
         foreach($row as $col){
             echo '<td>'.$col.'&nbsp;</td>';
         }
         echo '</tr>';
     }
    
     echo '</table>';
    
     if($mysqli->more_results()){
            echo '<p>--<p>--<p>';
     }
    
  }while($mysqli->next_result());
 
}else{
  echo $mysqli->errno;
  echo $mysqli->error;
}




使用mysqli完成事物处理
   事物处理 一件事(多个sql要完成的任务看为是一个事物)(有任何一个环节出错,都整个事物撤销,如果都成功才去提交)
   innodb  Berkley DB(BDB) 支持事物
   默认表都是自动提交的(autocommit)
   
   1.关闭自动提交
   2.start事物   
               set autocommit=0;关闭自动提交
               start transaction;开启事物
               
               rollback; //有问题回滚
               commit;   //没问题提交
               
               if(!$result){
                 $error=false;
               }else{
                 if($mysqli->affected_rows == 0){
                   $error = false;
                 }
               }
               
               $mysqli->autocommit(0);
               $error = true;
               if($error){
                 $mysqli->commit();
               }else{
                 $mysql->rollback();
               }
               $mysqli->autocommit(1);
                  
   
cmd mysql ->   rollback 回滚

$mysqli->set_charset();


表单提交过来的编码好像是gb2312的


mysqli_stmt预处理类(推荐你使用的类)
1.mysqli和mysqli_result 完成的功能 ,都可以使用mysqli_stmt完成
2.效率上 高 就是如果执行多次相同的语句,只有语句数据不同,因为将一条语句在服务器准备好,然后将不同的值
传给服务器,在让这条语句执行 这样就不用每次都编译了
 编译一次 使用多次
3.sql注入
 需要把注释 * %的语句都要过滤掉才可以
 mysqli_stmt可以防止这些 不需要过滤
 ?占位符  安全 ?只会当成数据来出来 不会当成sql语句
 
$mysqli = new mysqli("localhost","root","root");
$stmt = $mysqli->stmt_init();

$sql = "insert into `test2`.`user`(id) values(?)";
$stmt->prepare($sql);
$stmt->bind_param('s',$id);//$id引用传递

$id = 'xiaobai';
$stmt->execute();


$mysqli = new mysqli("localhost","root","root");

$sql = "insert into `test2`.`user`(id) values(?)";

$stmt = $mysqli->prepare($sql);

$stmt->bind_param('s',$id);

$id = 'xiaobai';

$stmt->execute();
$stmt->insert_id;
$stmt->affected_rows;
$stmt->close();



$mysqli = new mysqli("localhost","root","root");
$stmt = $mysqli->stmt_init();

$sql = "select * from `test2`.`user` where id=?";
$stmt -> prepare($sql);

//i d s b  引用传值
$stmt->bind_param('s',$id);
$stmt->bind_result($ids);
$id="xiaobai";
$stmt->execute();

/*
* 原理每次从服务器上获取一条记录 效率低
*/
$stmt->data_seek(2);//不管用
while($stmt->fetch()){
   echo $ids;echo '<br>';
}
echo $stmt->num_rows;//0



$mysqli = new mysqli("localhost","root","root");
$stmt = $mysqli->stmt_init();

$sql = "select * from `test2`.`user` where id=?";
$stmt -> prepare($sql);

//i d s b  引用传值
$stmt->bind_param('s',$id);
$stmt->bind_result($ids);
$id="xiaobai";
$stmt->execute();


$stmt->store_result();//一次性从结果集里把所有记录都传过来 重要

$stmt->data_seek(2);
while($stmt->fetch()){
   echo $ids;echo '<br>';
}
echo $stmt->num_rows;
$stmt->free_result();


视图
create view student_view as select * from student;
select * from student_view;
视图发生变化 基表也会发生变化
基表发生变化 视图也跟着变化

mysql视图
1.视图可以让查询变得很清楚(复杂的sql语句可以变的很简单)

2.保护数据库的重要数据,给不同的人看不同的数据

视图时以frm文件存储的


视图名不能和表名重复
create [or replace] []
view view_name [(colunm_list)]
as sql

 show tables;
 显示表和视图




create view stu4(
stu_name,stu_age,`stu email`)
as select name ,age,email from student
;

mysql> select * from stu4;
+----------+---------+-----------------------+
| stu_name | stu_age | stu email             |
+----------+---------+-----------------------+
| xiaobai  |      20 | [email protected] |
| zhansan  |      20 | [email protected]     |
| lisi     |      20 | [email protected]        |
| wangwu   |      20 | [email protected]      |
+----------+---------+-----------------------+
4 rows in set (0.00 sec)

 create view stu8 as select *  from student where age >= 20 ;
视图有三种类型
merge      会将引用视图的语句的文本与视图定义结合起来,使用得视图定义的某一部分取代语句对应部分
Temptable   视图的结果会放到临时表里  如果视图底层表中的数据有变化 那这些变化就会在下次视图访问表示时立即显示出来
undefined  默认 在merge和Temptable中选择一个   mysql将选择将要使用的算法 倾向于merge的算法 merge的方法更有效 如果使用Temptable 视图基本上是不可更新的(必须视图里的记录和基表里的记录一一对应的时候才可以更新) 使用Temptable一般是在查询中使用了统计函数的时候   但其实一般的情况下merge的算法的效率会更高 除非从查询语句中看出某种算法优于另一种算法 否则使用undefined

algorithm=merge

mysql> create algorithm=merge view stu9 as select *  from student where age >= 2
0 ;
Query OK, 0 rows affected (0.17 sec)

with check option
with local check option   只要满足本视图的条件就可以更新
with cascaded check option 必须满足所有所有针对视图的条件,才可以更新

可以在视图的基础上再创建视图

mysql> create or replace view stu7 as select * from student where age<100 with c
heck option;

mysql> create or replace view stu_1 as select * from stu7 where age>=20 with loc
al check option;
mysql> create or replace view stu_2 as select * from stu7 where age>=20 with cas
caded  check option;
Query OK, 0 rows affected (0.08 sec)
mysql> update stu_1 set age=120;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0
mysql> update stu_2 set age=120;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

子查询可以定义到视图里 然后对该视图再进行子查询

alter view stu as select * from table
drop view stu
drop view stu1,stu2,stu3,stu4

show table status like 'stu_1' \G;
show create view stu_2 \G;显示视图的语法

select * from `information_schema`.`views` \G;从系统信息库里去查information_schema 反应会比较慢


convert字符集转换函数 


mysql> select m.id,count(c.mid) from message as m left join comment as c on m.id
=c.mid group by m.id;

你可能感兴趣的:(mysql笔记)