美文网首页我爱编程
MySQL技术内幕(第四版)读书笔记

MySQL技术内幕(第四版)读书笔记

作者: named77 | 来源:发表于2015-04-23 00:32 被阅读264次

    2015/4/22


    MySQL采用的是客户/服务器体系结构,因此,当你使用MySQL时,你实际上是在使用两个程序,MySQL服务器程序,指的是mysqld程序,它运行在你存放你的数据库的机器上,负责在网络上监听并处理俩字客户端的服务请求,根据这行请求去访问数据库的内容,再把有关信息回传给客户端;另一个程序是MySQL客户端程序,它们负责连接到数据库服务器,并通过向服务器发出查询命令来告知客户端需要哪些数据。mysql是最常用的客户端程序。其他的有mysqldump、mysqladmin,前者把数据表的内容导出到一个文件里,后者用来检查数据库服务器的工作状态和执行一些数据库管理方面的任务。也就是说MySQL和mysql是两种不同的事物,前者指一个完整的MySQL RDBMS,而后者指的是一个特定的客户端程序。

    使用mysql连接数据库服务器(WINDOWS CMD下):
    cd D:/WAMP/wamp/bin/mysql/mysql5.5.20/bin
    mysql -h host_name -p -u user_name
    回车,输入密码。
    或者,mysql -h host_name -pyour_pass -u user_name
    或者,mysql --host=host_name --password=your_pass --user=user_name
    -h,-u与其后的内容有无空格均可,但是-p必须没有空格。
    如果不想输入-u选项,可以设置环境变量(既然说是环境变量,那么,可以去控制面板->系统中设置):
    set USER=user_name(但是亲测不好用)
    如果是连接本地数据库,则可省略-h选项。
    此处把我的几个错误记录下来,我刚开始用命令行连接数据库时,切到mysql.exe所在的目录下,没有输入上述连接命令,直接就是mysql.exe,然后回车,然后再输入mysql -h host_name -p -u user_name就是不行。
    还有,密码必须是手动敲进去的,复制粘贴的不行。


    2015/4/23

    Q1:尝试不使用-u、-p登录,发现可以连接。按理说不行啊。我想是不是因为环境变量中已经有了用户名的原因,退出mysql,输入SET USER=noUser,然后不使用-u、-p登录,结果依然可以登录。想不明白是为什么。
    A1:可能是SET USER=noUser没有起作用,然后存在''@localhost这个用户。
    Q:LINUX下的命令提示符为$或者#,书上说Unix为%或者$,windows为C:>。是这样么?

    可以在连接的时候直接指定数据库:
    mysql -h host_name -pyour_pass -u user_name dbname
    SQL语句末尾的分号表示语句的结束,也可以使用“\g”(表示go),也可以使用“\G”(表示数值排列显示结果)。
    “\c”,退出当前语句输入(有时前面输入一个引号,后面输入一个“\c”不好使,是因为MySQL将\c认为是字符串的内容了,退不出语句输入,这时候将字符串结束,即输入另一个引号即可)。

    连接MySQL直接执行文件中的SQL命令:
    mysql -h host_name -pyour_pass -u user_name < my.sql

    显示当前数据库:
    SELECT DATABASE();

    进入mysql后,读入文件中的SQL语句:
    source my.sql;


    2015/4/26

    AUTO_INCREMENT和PRIMARY KEY的关系:
    MySQL要求必须给具有AUTO_INCREMENT属性的列定义某种形式的唯一化索引,若没有,数据表的定义就不合法。PRIMARY KEY表示对列创建索引以加快查找速度,同时,也要求该数据列里面的值都是唯一且存在的,所以具有PRIMARY KEY属性的字段可以省略NOT NULL。

    两个的语句:
    当前服器所有数据库 SELECT DATABASE();
    当前使用的数据库 SHOW DATABASES;

    SHOW TABLES;
    也就是说,SHOW后面不是函数且为复数,而 SELECT后面是函数。

    查看表结构:
    DESCRIBE table_name;
    DESC table_name;
    EXPLAIN table_name;
    SHOW COLUMNS FROM table_name;
    SHOW FIELDS FROM table_name;
    同时,这些字句还允许将输出内容限制为指定的数据列,比如说加上LIKE字句,或者直接指定需要查询的列名:DESCRIBE table_name column_name

    Q:语句SHOW FULL COLUMNS FROM table_name;SHOW COLUMNS FROM table_name有什么区别?

    使用SHOW命令得到的内容都可以使用mysqlshow客户端得到。
    mysqlshow -h host_name -u user_name -pyour_pass;
    mysqlshow -h host_name -u user_name -pyour_pass database_name;
    mysqlshow -h host_name -u user_name -pyour_pass database_name table_name;
    “ISAM”是“indexed sequential access method”(索引化顺序访问方法)的缩写,MyISAM引擎在这种访问方法的基础上增加了一些MySQL独有的东西。

    Q:P31中有这么一句话,

    InnoDB引擎通过引入“外键”概念而具备了保持“引用一致性”的特点。

    意思是不是MyISAM引擎就没有“外键”这一概念?

    这样的建表语句:
    CREATE TABLE table_name ( FOREIGN KEY (column_name) REFERENCES another_table_name (column_name) ) ENGINE = InnoDB;
    这样即可定义外键。外键的作用是确保被插入的列值必须与另一张表中的指定列中的值可以匹配上。出现在FOREIGN KEY 里的数据列,要么它本身有一个索引,要么是某个多数据列索引里第一个被列出的数据列。如果不是,最好使用INDEX(column_name)显式指定一个,虽然,InnoDB存储引擎会为出现在外键定义里面的数据列自动创建一个索引,但它创建的未必是合适的,所以,最好显式指定一个。

    使用SET子句插入数据:
    INSERT INTO table_name SET column_name1 = value1,column_name2 = value2;

    读取本地文件my_sql.txt中的内容,插入数据库:
    LOAD DATA LOCAL INFILE 'my_sql.txt' INTO TABLE table_name;
    如果没有LOCAL关键字,即为读取服务器上的文件。
    在默认情况下,LOAD DATA 语句将假设各数据列的值以制表符分割,各数据行以换行符分隔,数据值的排列顺序与各数据列在数据表里的先后顺序一致。
    也可以使用mysqlimport客户端
    mysqlimport -h host_name -u user_name -pyour_pass --local database_name my_sql.txt注意这里没有“;”,如果加上,分号会被当做文件名的一部分
    Q:不加--local参数是不是就可以访问服务器端的文件了?

    获得数据库版本:
    SELECT VERSION();

    MySQL不区分数据列的大小写,但是却未必不区分数据库和数据表名字的大小写,这取决于服务器主机上使用的文件系统以及MySQL的配置情况。

    关于NULL值的比较:
    使用普通的算术比较运算符对NULL值进行操作,其结果是不可预知的,甚至使用普通的算术比较运算符比较NULL和其自身,结果也是不可预料的。
    比较NULL值只能使用IS NULL 或者IS NOT NULL或者<=>或者NOT <=>,比如,SELECT NOT NULL<=>NULL;返回0。

    MySQL部分算术运算符:

    DIV 整数除法
    % 求余
    / 除法

    MySQL部分逻辑运算符:

    XOR 逻辑异或
    NOT 逻辑非

    有这么一个需求,将记录以某一个可能包含NULL值的列降序排列,但是还需要让该列为NULL的记录在结果集的前面,可以这样:
    SELECT (*) FROM table_name ORDER BY IF(column_name <=> NULL,0,1) column_name DESC
    这里使用了IF函数,当第一个参数为真,IF()函数返回第二个参数,否则返回第三个参数。


    2015/5/7

    Q:一个变量@val,它的生存周期是多长?我试验过,在mysql客户端,设置一个变量,然后执行别的SQL语句,该变量一直存在,但是quit或者exit后,再连接数据库,该变量就不存在了。这是不是就是与常连接的概念有关。

    随机取出某条数据:
    SELECT col_name FROM table_name ORDER BY RAND()
    COUNT(*)COUNT(col_name)的区别:后者只统计非NULL行。
    统计某列的不重复值 的数目,以前我一直是COUNT()函数和GROUP BY col_name一起用来实现,还可以这样,更简单:COUNT(DISTINCT col_name)


    2015/8/11

    存储引擎的可移植性:
    从某种意义上讲,任何一个MySQL服务器所管理的任何数据表都可以移植到另一台服务器上去,想用mysqldump工具把它备份出来,然后把备份文本文件放到另一台服务器主机,并通过加载备份的方法重新创建该数据表。可移植性还有另一层含义,即二进制可移植性,指的是你可以直接把代表某个数据表的硬盘文件复制到另一台机器,并把他们安装到数据子目录下的相应地点,然后那台机器上的MySQL服务器就可以使用该数据表了。
    一般来说,MyISAM和InnoDB的存储格式与机器无关,他们具备二进制可移植性。

    从其他数据表或查询结果创建数据表:
    CREATE TABLE new_table_name LIKE table_name;
    INSERT INTO new_table_name SELECT...;

    CREATE TABLE new_table_name SELECT ...;
    前者首先复制表结构及所有数据列的属性,然后填充数据。后者直接将SELECT得到的数据填充至新的数据表,但是不会复制数据列的属性。

    相关文章

      网友评论

        本文标题:MySQL技术内幕(第四版)读书笔记

        本文链接:https://www.haomeiwen.com/subject/rqaufttx.html