本站创建于2006年,博主为Delphi老码农,暗黑忠实粉丝,主要用于学习经验分享
    • 错误 21002: [SQL-DMO]用户“XXX”已经存在

    • SQL用户“xxx”已经存在的解决方法

      MSSQL2000迁移数据库或者还原数据库后,新建相同用户名的时候或者指定数据库登录用户时出现错误提示“错误21002:[SQL-DMO]用户“XXX”已经存在

      产生原因:
      这就是我们通常所说的“孤立用户”,所谓孤立用户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录。

      我们建立了同样名称的数据库登录用户后,数据库中的表我们照样不能使用时因为sid的不同,就是系统登录表和数据库用户表中的用户名相同,但是sid字段不同,数据库中的还是以前旧系统的sid值,所以我们就要把它对应成我们新建的,数据库靠sid来识别用户。

      [1g1g]滴答滴-侃侃#playID:-21707[/]

      阅读剩余部分...

    • Google nexus i9020/23 新手入门

    • Q0-0 : 如何查看手机生产日期? 查看手机生产地?

      A :手机背面 电池仓 标签,串号下面的s/n。 第4、5位为年、月。
                       第4位:Z为2010年 B为2011年
                       第5位:123456789abc代表1-12月    查看生产地:手机关机按住(音量上键+电源键)进入Bootlodader   然后看第6行的 CARRIER INFO:xxx,这里的XXX就是销往地货制造定制  方的简称,如:VDF(沃达丰定制机)EUR(欧洲)HKT(香港HKT集团控股公司) TMB(T-Mobile定制机) SAR(沙特) AXI(印尼GSM/3G运营商AXIS) XSE(印度尼西亚)    SKT (韩国运营商SKT电信公司)

       Q0-1 : Nexus s 几个虚拟 按键的名称介绍:A :  从左到右依次为:返回键—— 菜单键 (四道杠)—— 搜索键 —— 主页键 (小房子)

       Q1 : 如何个性化铃声?
      A :在SD卡目录里建立 ringtones(来电铃声文件夹);    alarms  (闹钟铃声文件夹)      notifications( 短信 通知铃声文件夹)

             然后 把你不同用途的铃声放到不同的文件夹下手机就可以了。 再进行如下设置 :
        1 来电铃声:设置/声音与显示/手机铃声   2短信铃声:短信/菜单/设置/选择铃声     3闹钟铃声:时钟/闹钟/添加闹钟/铃声

    • mysql笔记(11)--子查询

    • CREATE TABLE clients (

        clno INT,

        fname VARCHAR(15),

        lname VARCHAR(15),

        job VARCHAR(15),

        account_balance DECIMAL(7,2));

       

      INSERT INTO clients VALUES

        (10, 'sam','smith','auditor',5525.75),

        (20,'james','jones','manager',8960.25);

       

      CREATE TABLE firms (

        clno INT,

        company VARCHAR(15),

        city VARCHAR(15));

       

      INSERT INTO firms VALUES

        (10,'abc co','leduc'),

        (20,'def ltd','nisku'),

        (30,'ghi inc','nisku');

      select * from firms where clno in(select clno from clients );

      select * from firms where clno =(select clno from clients  where job=’manager’);

      select fname,lname from clients where clno=(select max(clno) from firms);

      select fname,lname from clients where clno=(select avg(clno) from firms);

      如果内部查询返回空结果集,子查询会返回错误

      子查询共有三种类型,区分它们的方法是根据返回结果的列数和行数。

      如果一个子查询返回仅仅一列一行数据,被成为数量级子查询。一个数量级子查询可以用在任何适合数据值比较的地方(一个列值或者文本)。它常常被使用在where子句当中,跟随在比较操作符号后面。
      如果子查询返回多个列,并且是一行记录的话,它被称为行级子查询。行级子查询是数量级子查询的发展,可以用在任何适合数量级子查询的地方。
      最后,如果一个子查询返回多个列和多行的话,它被称为表级子查询。表级子查询可以用作涉及到表的查询操作,包含在from子句当中。它也常常被用在where子句当中,后面使用in或者exist或者一个确定的比较操作(确定的比较操作是一个比较操作通过使用some,all,或者any限定)

      SELECT * FROM clients WHERE clno < ANY (SELECT clno FROM firms);

      使用any的规则如下:

      ANY返回true,如果子查询的比较操作至少有一个是是true
      ANY
      返回false,如果子查询返回为空行,或者比较任意一行都是false
      ANY
      的同义词是SOME,使用in等同于使用= ANY

      在这里,第一次的比较还是返回false,而第二此返回true,最后,子查询的结果是false,所以查询返回空行。使用all的规则是:

      返回true,如果子查询返回空行记录,或者子查询的每一个结果比较都为true的话。
      返回false,如果子查询至少有一个比较结果返回false

      在有些时候,查询的结果是子查询是否有一个结果返回。使用[NOT] EXISTS来判断结果集是否为空。如果你的子查询至少有一行返回,使用EXISTS返回true;否则,返回为false。还有一种用法,NOT EXISTS,如果子查询结果集为空,它返回为true,否则的话,返回为true。一般情况下,子查询跟随在[NOT] EXISTS后面,以select *开头。在这里,星号(*)不是表示列出所有的列,而是表示为列出一些列。

      SELECT * FROM clients WHERE EXISTS  (SELECT * FROM firms);

      也可以把一个子查询,作为一个表名,放在from子句后面(就像oracle里面的用法一样,作为内部视图):

      select * from(select * from clients where job like'a%')as cl;//cl作为一个子查询的临时结果集:

      当子查询被使用在from子句当中,关键字as是强制使用的;中间的临时结果必须被命名,作为外部的查询被引用。

      mysql> update clients set account_balance=(select sum(clno)*2 from firms) where

      fname='sam';

    • mysql笔记(12)--外键约束

    • 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张 表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。


      这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
      首先创建用户组表:
      创建用户组表
      create table t_group (
      id int not null,
      name varchar(30),
      primary key (id)
      );
      并插入两条记录:
      插入记录
      insert into t_group values (1, 'Group1');
      insert into t_group values (2, 'Group2');


      下面创建用户表,分别以不同的约束方式创建外键引用关系:
      1、级联(cascade)方式
      级联方式
      create table t_user (
      id int not null,
      name varchar(30),
      groupid int,
      primary key (id),
      foreign key (groupid) references t_group(id) on delete cascade on update cascade
      );


      参照完整性测试
      insert into t_user values (1, 'qianxin', 1); #可以插入
      insert into t_user values (2, 'yiyu', 2); #可以插入
      insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符


      约束方式测试
      insert into t_user values (1, 'qianxin', 1);
      insert into t_user values (2, 'yiyu', 2);
      insert into t_user values (3, 'dai', 2);
      delete from t_group where id=2; #导致t_user中的2、3记录级联删除
      update t_group set id=2 where id=1; #导致t_user中的1记录的groupid级联修改为2


      2、置空(set null)方式
      置空方式
      create table t_user (
      id int not null,
      name varchar(30),
      groupid int,
      primary key (id),
      foreign key (groupid) references t_group(id) on delete set null on update set null
      );


      参照完整性测试insert into t_user values (1, 'qianxin', 1); #可以插入
      insert into t_user values (2, 'yiyu', 2); #可以插入
      insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符


      约束方式测试
      insert into t_user values (1, 'qianxin', 1);
      insert into t_user values (2, 'yiyu', 2);
      insert into t_user values (3, 'dai', 2);
      delete from t_group where id=2; #导致t_user中的2、3记录的groupid被设置为NULL
      update t_group set id=2 where id=1; #导致t_user中的1记录的groupid被设置为NULL


      3、禁止(no action / restrict)方式
      禁止方式
      create table t_user (
      id int not null,
      name varchar(30),
      groupid int,
      primary key (id),
      foreign key (groupid) references t_group(id) on delete no action on update no action
      );


      参照完整性测试
      insert into t_user values (1, 'qianxin', 1); #可以插入
      insert into t_user values (2, 'yiyu', 2); #可以插入
      insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符


      约束方式测试
      insert into t_user values (1, 'qianxin', 1);
      insert into t_user values (2, 'yiyu', 2);
      insert into t_user values (3, 'dai', 2);
      delete from t_group where id=2; #错误,从表中有相关引用,因此主表中无法删除
      update t_group set id=2 where id=1; #错误,从表中有相关引用,因此主表中无法修改


      注:在MySQL中,restrict方式与no action方式作用相同。

    • mysql笔记(9)--变更数据表结构

    • 1,重新命名数据表
      alter table A rename to B  //
      数据表A改名为B
      rename table A to B                //
      数据表A改名为B
      rename A toC,B to A,C to A    //
      数据表A和数据表B互换名字
      alter table S.A rename to T.A                //
      数据库S里面的表A移动到数据库B里面
      rename table S.A to T.A   //
      数据库S里面的表A移动到数据库B里面
      2,
      改变数据列的类型
      我们现在要把数据表A里面的一个smallint unsigned类型的数据列I再次改动为mediumint unsigned类型
      alter table A motify I mediumint unsigned
      alter table A change I I mediumint unsigned
      注意change子句的特点:不仅能够改变数据列的类型,还能改变数据列的名字。这是modify子句所不能完成的。下面就把这个数据列改名了。
      alter table A change I J mediumint unsigned
      3,
      将数据表由可变长度数据行转变成固定长度数据行
      有的时候为了提高性能,需要做这样的转变,但有一点需要注意:必须用同一条alter命令来一次改变所有的数据列,不能仅仅改变一个数据列!举例如下:
      create table A(name varchar(40),address varchar(80))
      我们开始修改命令就应该是:
      alter table A modify name char(40),modify address char(80);
      4,
      将数据表由固定长度数据行转变成可变长度数据行
      如果觉得空间利用率不高,那就需要再转变回来,这个就很简单了,没有特别要求
      alter table A modify name varchar(40)
      5,
      转换数据表类型
      我们知道,MySQL数据库存在多种数据表类型,但每一种类型的特性并不相同。
      如果你想让你的数据表支持事务处理机制。那就必须把它搞成BDBinnoBDB格式
      alter table A type= BDB
      alter table A type= InnoBD

    • mysql笔记(6)--select高级查询(四)连接

    • 1.交叉连接CROSS JOIN
      如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;

      举例,下列A、B、C 执行结果相同,但是效率不一样:
      A:SELECT * FROM table1 CROSS JOIN table2
      B:SELECT * FROM table1,table2

      C:select * from table1 a inner join table2 b


      A:select a.*,b.* from table1 a,table2 b where a.id=b.id
      B:select * from table1 a cross join table2 b where a.id=b.id (注:cross join后加条件只能用where,不能用on)
      C:select * from table1 a inner join table2 b on a.id=b.id


      一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。
      因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用。

      2.. 内连接INNER JOIN
      两边表同时符合条件的组合

      如果仅仅使用
      SELECT * FROM table1 INNER JOIN table2

      内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。

      但是通常情况下,使用INNER JOIN需要指定连接条件。

      3.关于等值连接和自然连接

      等值连接(=号应用于连接条件, 不会去除重复的列)

      自然连接(会去除重复的列)

      数据库的连接运算都是自然连接,因为不允许有重复的行(元组)存在。
      例如:

      SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column

      4. 外连接OUTER JOIN
      指定条件的内连接,仅仅返回符合连接条件的条目。
      外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者 两边连接(全外连接时)的所有数据行。

      1)左外连接LEFT [OUTER] JOIN
      显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL
      例如
      SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column
      2)右外连接RIGHT [OUTER] JOIN
      显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL
      例如
      SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column
      3)全外连接full [outer] join
      显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集

      在检索时指定多个表,将每个表用都好分隔,这样每个表的数据行都和其他表的每行交叉产生所有可能的组合,这样就是一个全连接。

      select * from xindi,student;

      select xindi.*,student.* from xindi,student where xindi.id=student.id;

      左连接:左边的表一定有,若右边的表有匹配的项,则写出,若没有则用null

      select *from xindi left join student on xindi.id=student.id; //on 类似于where

      如果只有ON子句的条件,那么左边表的每一行都会返回。

      如:select *from xindi left join student on xindi.id=1; //返回的是与上面一行相同的结果

      Left join 常与where结合:

      mysql> select *from xindi left join student on xindi.id=student.id where student.id is not null ; //on xindi.id=student.id是连接的条件

      等价于mysql> select *from xindi left join student where xindi.id=student.id ; 内连接

      如:create table stu(stu_id int primary key,stu_name char(10),class_id int);

          create table class(class_id int,class_name char(10));

      insert into stu values(1,‘lili’,11),(2,'lucy',12),(3,'jim',13);

         insert class values(11,'gradeone'),(12,'gradetwo'),(14,'gradetwo');

      mysql> select stu.stu_id,class.class_id from stu join class on(stu.class_id=class.class_id);

      mysql> select stu.stu_name, class.class_name from stu left join class on(stu.class_id=class.class_id); //左连接

      mysql> select stu.stu_name, class.class_name from stu right join class on(stu.class_id=class.class_id); //右连接

      mysql> select stu.stu_name, class.class_name from stu join class on(stu.class_id=class.class_id); //全连接

      注:全连接和左连接的结果集排列顺序是不同的

    • mysql笔记(6)--select高级查询(二)sql变量,对字符串的处理,null值

    • 1.设置sql变量

      可以使用查询结果来设置变量,我们能够方便的把一些结果保存起来以供他用。变量命名规则是:@name,赋值语法是 @name:=value,

      如:select @bir:=birth from stu where name=‘lili’;

      select * from stu where birth>=@bir;

      也可以用子查询得到上述结果:select * from stu where birth>(select birth from stu where name='lili');

      2. mysql对字符串的处理

      mysql能够支持的数据类型,和其它的数据库一样,我们可以处理各种数值(整型,浮点),字符串型,日期/时间型,NULL值等等。大家在使用的需要注 意不同类型的数值的格式是不一样的。在这里,对字符串的处理有一个比较特殊的地方大家需要理解。因为字符串两端是需要用引号(单引号,双引号)括起来的, 但是如果字符串本身里面也包括了引号(单引号,双引号),我们应该怎么办呢。这时就必须用以下三种方法之一来标识这个特殊的字符串。
         (1)如果字符串内部的引号字符与字符串两端的引号字符相同,则双写该引号
      ‘I can’’t’
      “He said,””I told you so, “”’
         (2). 用与字符串内部的引号字符不同的引号把该字符串引起来,此时,就不用双写字符串内部的引号了
      “I can’t”
      ‘He said,”I told you so,”’
         (3)用反斜杠对字符串内部的引号字符进行转义,此时与字符串两端的引号无关
           ‘I can\’t’
            “He said,\”I told you so,\””

      2. null 值的问题

      mysql> INSERT INTO my_table (phone) VALUES (NULL);

      mysql> INSERT INTO my_table (phone) VALUES ("");

      两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串。第一个的含义可以认为是“电话号码不知道”,而第二个则可意味着“她没有电话”。

      在SQL中,NULL值在于任何其他值甚至NULL值比较时总是假的(FALSE)。包含NULL的一个表达式总是产生一个NULL值,如:select null+2;返回null

      当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。当使用GROUP BY时,所有的NULL值被认为是相等的。

      为了有助于NULL的处理,你能使用IS NULL和IS NOT NULL运算符和IFNULL()函数。

    • mysql笔记(6)--select高级查询(一)

    • 1.表和列的别名:

      (1) mysql> SELECT name,species FROM pet ORDER BY name, species;

      mysql> SELECT name,species FROM pet ORDER BY 1,2;

      mysql> SELECT name AS n,species AS s FROM pet ORDER BY n,s;

         mysql> SELECT name n,species s FROM pet ORDER BY n,s;

      用列的别名构造新表: mysql> CREATE TABLE pet1

                                 -> SELECT name (AS) animal,owner (AS) child

                                  -> FROM pet;

      你可以在GROUP BY、ORDER BY或在HAVING部分中使用别名引用列。注意,你的ANSI SQL 不允许你在一个WHERE子句中引用一个别名。

      select name n, count(*)as total from xindi group by n;//正确

      select phone p from xindi where p>123;//错误

       

      (2)表的别名具体方法类似于列。

      列的别名经常用于表自身的连接中。你不必有2个不同的表来执行一个联结。如果你想要将一个表的记录与同一个表的其他记录进行比较,联结一个表到自身有时是有用的。

         pet联结自身来进行相似种类的雄雌配对:

         mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species

             -> FROM pet AS p1, pet AS p2

             -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";


      2.where ,group by,having 用法小注:select name,sum(phone) from xindi group by phone having sum(phone)>1233;

      执行where子句查找符合条件的数据;

      使用group by 子句对数据进行分组;

      对group by 子句形成的组运行聚集函数计算每一组的值;

      最后用having 子句去掉不符合条件的组。

      需要注意:having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.

      having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。

      having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

      select dno,sum(salary)from employe group by dno having sum(salary)>10000


      3.limit,concat的用法,分离year,month,day

      (1)limit的用法

      mysql> select * from xindi order by phone limit 2; //只取前两个值

      +-------+-------+-------+----+

      | name | phone | email | id |

      +-------+-------+-------+----+

      | brown | NULL | NULL | 5 |

      | lili |   123 | NULL | 6 |

      +-------+-------+-------+----+

      2 rows in set (0.01 sec)


      mysql> select * from xindi order by phone limit 2,2; //只取第三和第四个值

      +------+-------+-------+----+

      | name | phone | email | id |

      +------+-------+-------+----+

      | lili |   123 | NULL | 7 |

      | Lucy | 13456 | NULL | 3 |

      +------+-------+-------+----+

      2 rows in set (0.00 sec)

      (2) concat

      select concat(name,email)from xindi;

      select concat(name,email) as name from xindi;

      concat()函数把这个值转化为字符串,无论输出参数是一个字符串还是一个数值, concat() 都会返回一个字符串.

      (3) 三个函数year(),month(),dayofmonth()可以分别分离出日期中的年月日来。

      mysql> create table stu(id int primary key,name char(10),birth date,death date);

      insert stu values(1,'lili','2000-01-01','2010-01-01');

      insert stu values(2,'lucy','2002-1-1','2009-1-1');

      select * from stu where death>'2009-12-31';

      select * from stu where month(birth)=1;

      select * from stu where year(birth)>2000;

      select * from stu where dayofmonth(birth)>1;

      select * from stu where dayofmonth(birth)>=1;

      dayofmonth()函数返回当月的第几天。。

    • mysql笔记(5)--集合函数,时间日期函数,字符串匹配函数

    • mysql中的集合函数有:count(),sum(),avg(),min(),max(),时间和日期函数等。

      1.   1) select count(*) from xindi where phone=123456;//计算表xindi中phone=123456的个数 或者 select count(phone)from xindi where phone=123456;

         2)select count(phone)from xindi; //phone 列的数目

         3)select count(distinct phone)from xindi;//有多少个不同种类的电话

          4)如果种类phone出现了不止一次,它将只被计算一次。关键字DISTINCT 决定了只有互不相同的值才被计算。

      通常,当你使用COUNT()时,字段中的空值将被忽略,不算入内。

      另外,COUNT()函数通常和GROUP BY子句配合使用,例如可以这样返回每种phone的数目:

      select phone, count(phone) from xindi group by phone;

      5)select avg(phone)from xindi; // 在计算平均时,忽略空值,phone共四个值,两个空值,除以时只除2.

      select name,avg(phone) from xindi group by(name); // 计算每个名字的phone 的平均值

      6)select sum(phone) from xindi;

         Select name, sum(phone) group by (name);

      7)极值:

      Select min(phone)from xindi;

      Select name,min(phone)from xindi;//这是错误的sql语句,因为集合函数不能和非分组的列混合使用,上述name未分组。所以应用下面的语句:

      select name,min(phone) from xindi group by name;

      2.操作时间和日期:日期和时间类型:DATETIME、DATE、TIMESTAMP、TIME和YEAR这5种类型的每一个都有合法值的一个范围,而“零”当你指定确实不合法的值时被使用。

      a. 当前日期 select curdate();select curdate()+0;

         当前时间 select curtime();select curtime()+0;

      b. 自动记录数据的改变时间:

           TIMESTAMP类型提供一种类型,TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。你可以使用它自动地用当前的日期和时间标记INSERT或UPDATE的操作。

      mysql> CREATE TABLE student

      -> (

      -> id int,

      -> name char(16),

      -> time timestamp

      -> );

      向表中插入记录,可以查看效果:

      Insert student values(1,’jim’,null);

      select *from student;

      update student set name=’lan’where id=1;

      select*from student; //time的值会改变

      有时希望不更改任何值,也能达到修改timestamp列的值,这时设置该列的值为null,mysql就可以自动更新timestamp的值:

      Update student set time=null where id=1;

      Select*from student ;//这时timestamp的值已改变

      如果,当你创建一个行时,你想要一个TIMESTAMP被设置到当前的日期和时间,但在以后无论何时行被更新时都不改变,可以这样

      Update student set name=’yun’,time=time where id=1;

      Select *from student where id=1;

      TIMESTAMP的存储需求是4字节,而DATETIME列的存储需求是8字节。

      c.返回时间和日期

      mysql> SELECT * FROM weblog WHERE entrydate>="2001-02-08" AND entrydate<"2001-02-09" ;

      或者 mysql> SELECT * FROM weblog WHERE entrydate LIKE '2001-02-08%' ;

      注:LIKE运算符和模式匹配,是通过比较串值进行的,因此必须使用标准的时间书写格式,YYYY-MM-DD HH-MM-SS

      d. 比较日期和时间:

      mysql> SELECT FROM_DAYS(729669); -> '1997-10-07'
       
       TO_DAYS(date) 给出一个日期 date,返回一个天数(从 0 年开始的天数): mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('1997-10-07'); -> 729669
      TO_DAYS()  无意于使用先于格里高里历法(即现行的阳历)(1582)出现的值,因为它不考虑当历法改变时所遗失的天数。
       
      FROM_DAYS(N) 给出一个天数 N,返回一个 DATE 值:
      返回2个时间相差的天数

      select to_days(now())-to_days('20100510');


      3. 字符串模式匹配:

      SQL的模式匹配允许你使用 “_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在MySQL中,SQL的模式缺省是忽略大小写的。

      select*from xindi where name like "l%i";

      select*from xindi where name like " %i";

      select*from xindi where name like "l% ";

      select*from xindi where name like "l___";//l后面有三个字符的

      mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

      mysql> SELECT * FROM pet WHERE name REGEXP "fy$";

      mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";

      mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";//重复5次(有5个字符)

      mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$"; //重复5次(有5个字符)

    • mysql笔记(4)--数据库的导入导出

    • (1)导入数据 load data:

      Load Data InFile 'C:/Data.txt' Into Table `TableTest` ;

      Load Data InFile 'C:/Data.txt' Into Table `TableTest` Lines Terminated By '\r\n';

      自定义语法
      Load Data InFile 'C:/Data.txt' Into Table `TableTest` Fields Terminated By ',' Enclosed By '"' Escaped By '"' Lines Terminated By '\r\n';
      Fields Terminated By ',' Enclosed By '"' Escaped By '"'
      表示每个字段用逗号分开,内容包含在双引号内
      Lines Terminated By '\r\n'; 表示每条数据用换行符分开

      (2)导出数据select* from xindi into outfile ‘d:\\a.txt’;

      使用select命令还可以指定卸出文件时,字段之间的分隔字符,转义字符,包括字符,及记录行分隔字符。列在下面:
        FIELDS
        TERMINATED BY 't' [OPTIONALLY] ENCLOSED BY ''
        ESCAPED BY '\'
        LINES
        TERMINATED BY 'n'
         TERMINATED 表示字段分隔 [OPTIONALLY] ENCLOSED 表示字段用什么字符包括起来,如果使用了OPTIONALLY则只有CHAR和VERCHAR 被包括。ESCAPED 表示当需要转义时用什么作为转义字符 ;LINES TERMINATED 表示每行记录之间用什么分隔 。
        上面列的是缺省值,而且这些项都是可选的,不选则使用缺省值。可以根据需要进行修改。给出一个例子如下:
        mysql> select * from xindi into outfile 'a.txt' fields terminated by ',' enclosed by '"';

       结果可能如下:
        "1","Mika","Hakinnen","1"
        "2","David","Coulthard","1"
        "3","Michael","Schumacher","2"
        "4","Rubens","Barrichello","2

      1.导出整个数据库

      mysqldump -u 用户名 -p 数据库名 > 导出的文件名

      mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

      2.导出一个表

      mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

      mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

      3.导出一个数据库结构

      mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:/wcnc_db.sql

      -d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table

      4.导入数据库

      常用source命令

      进入mysql数据库控制台,

      如mysql -u root -p

      mysql>use 数据库

      然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

      mysql>source d:/wcnc_db.sql


      补充:
      mysqldump支持下列选项: 

      --add-locks 
      在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。 
      --add-drop-table 
      在每个create语句之前增加一个drop table。 
      --allow-keywords 
      允许创建是关键词的列名字。这由在列名前面加表名的方法做到。 
      -c, --complete-insert 
      使用完整的insert语句(用列名字)。 
      -C, --compress 
      如果客户和服务器均支持压缩,压缩两者间所有的信息。 
      --delayed 
      用INSERT DELAYED命令插入行。 
      -e, --extended-insert 
      使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句) 
      -#, --debug[=option_string] 
      跟踪程序的使用(为了调试)。 
      --help 
      显示一条帮助消息并且退出。 
      --fields-terminated-by=... 
      --fields-enclosed-by=... 
      --fields-optionally-enclosed-by=... 
      --fields-escaped-by=... 
      --fields-terminated-by=... 
      这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。 
      LOAD DATA INFILE语法。 
      -F, --flush-logs 
      在开始导出前,洗掉在MySQL服务器中的日志文件。 
      -f, --force, 
      即使我们在一个表导出期间得到一个SQL错误,继续。 
      -h, --host=.. 
      从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。 
      -l, --lock-tables. 
      为开始导出锁定所有表。 
      -t, --no-create-info 
      不写入表创建信息(CREATE TABLE语句) 
      -d, --no-data 
      不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的! 
      --opt 
      同--quick --add-drop-table --add-locks --extended-insert --lock-tables。 
      应该给你为读入一个MySQL服务器的尽可能最快的导出。 
      -pyour_pass, --password[=your_pass] 
      与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。 
      -P port_num, --port=port_num 
      与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。) 
      -q, --quick 
      不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。 
      -S /path/to/socket, --socket=/path/to/socket 
      与localhost连接时(它是缺省主机)使用的套接字文件。 
      -T, --tab=path-to-some-directory 
      对 于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据--fields-xxx和-- lines--xxx选项来定。 
      -u user_name, --user=user_name 
      与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。 
      -O var=option, --set-variable var=option
      设置一个变量的值。可能的变量被列在下面。 
      -v, --verbose 
      冗长模式。打印出程序所做的更多的信息。 
      -V, --version 
      打印版本信息并且退出。 
      -w, --where='where-condition' 
      只导出被选择了的记录;注意引号是强制的! 
      "--where=user='jimf'" "-wuserid>1" "-wuserid<1" 

      最常见的mysqldump使用可能制作整个数据库的一个备份: 

      mysqldump --opt database > backup-file.sql 

      但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的: 

      mysqldump --opt database | mysql --host=remote-host -C database 

      由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了: 

      mysqladmin create target_db_name 
      mysql target_db_name < backup-file.sql

Powered by Typecho)))   ICP:蜀ICP备05009250号