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

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得到的数据填充至新的数据表,但是不会复制数据列的属性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容

  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,027评论 0 19
  • MySQL 数据库常用命令 1、MySQL常用命令 create database name; 创建数据库 use...
    55lover阅读 4,767评论 1 57
  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,363评论 1 14
  • 今天宝宝闹着不午睡,于是我就带他去附近的景点逛逛,快结束的黄金周人没有那么拥挤了,但那些摊贩们却依然坚守着。 捏面...
    OQ熊阅读 143评论 0 0
  • 江南烟雨后的巷子,斑驳的墙面悄然爬上的青苔,课后偏要绕小道回家的妞!
    安锦素阅读 152评论 0 0