MySQL.

Slides:



Advertisements
Similar presentations
如何學好數學? 黃駿耀老師
Advertisements

辅助核算 3.5.
10 郑和远航.
三个偶像的故事和功绩 ——第12课 明清时期的反侵略斗争 董飞燕.
捣蛋鬼历险记 初一四班 孙嘉佑小组.
中國歷史 明代之患禍及民變.
10 郑和远航 郑和 郑和,1371年生于云南昆阳州(今昆明晋宁县)一个信奉伊斯兰教的回族家庭,原名马和,小字三宝,十一岁时在明太祖朱元璋发动的统一云南的战争中被俘进宫,后当朱元璋四子燕王朱棣的近侍。1403年朱棣登基,史称明成祖。次年正月初一,朱棣念他有勇有谋,屡立奇功,便赐姓“郑”,改称郑和,并提拔为内宫太监,于永乐三年(1405年7月11日)率领庞大船队首次出使西洋。自1405年到1433年,漫长的28年间,郑和船队历经亚非三十余国,涉十万余里,与各国建立了政治,经济,文化的联系,完成了七下西洋的伟
明清 抗击外国侵略的英勇斗争 雅克萨反击战(俄) 戚继光抗倭(日) 郑成功收复台湾(荷兰) 荷兰 俄 罗 斯 日 本 台湾 沙 俄 入 侵
戚继光抗倭.
刑事訴訟法 授課人:林俊益副教授 時間:95.9.~96.6..
妩媚人生 云 计 算 与 大规模数据并行处理技术 黄 宜 华 南 京 大 学 计算机科学与技术系 软件新技术国家重点实验室 妩媚人生 妩媚人生
第16 课 中外的交往与冲突 授课人:鲍婷.
历史上的中日关系.
云南外事外语职业学院 入党积极分子培训 赵田甜.
第四章 清代臺灣的社會文化變遷 第一節 移墾社會的形成
認識食品中毒 一、什麼是食品中毒? 二人或二人以上攝取相同的食品而發生相似的症狀,並且自可疑的食餘檢體及患者糞便、嘔吐物、血液等人體檢體,或者其它有關環境檢體(如空氣、水、土壤等)中分離出相同類型(如血清型、噬菌 體型)的致病原因,則稱為一件“食品中毒”。 但如因攝食肉毒桿菌毒素或急性化學性中毒而引起死亡,即使只有一人,也視為一件“食品中毒”。
題目:四大古文明 班級:六年八 班 組員:賴宣光.游家齊.陳羿文 吳佳芬.許淑婷.許芳瑜..
食 物 中 毒.
琦君 《髻》 S 康倩瑜.
眼乾乾唔使慌.
滑膜皱襞综合征.
“公平”是最热的关键词 1、胡锦涛首次进行“总动员”,提出“在促进发展的同时,把维护社会公平放到更加突出的位置” 。
贵州省公务员面试 备考指导 中公教育 面试讲师 刘运龙.
外 套 各式領型與變化 武 玫 莉 製 作.
第4节 人体对食物的消化吸收.
陈冤之魅,心鬼之泪 ——雾里探花 《东方快车谋杀案》 By第二小组.
高考作文等级评分标准/发展等级10分 深刻 丰富 有文采 有创意 ①透过现象 深入本质 ②揭示问题 产生的原因 ③观点具有 启发作用
文明礼仪在我心 文明礼仪在我心.
第10课 社会生活的变迁.
故事会 盘古开天劈地 在很久很久以前,天地可不象我们现在看到的这样————天高高的在上面,地在我们的脚下,中间隔着几千几万米远。那个时候的天地就象是一个包在大黑壳里的鸡蛋,混混沌沌的,什么也看不清。人们走路都得弯着腰,耕田打猎都很不方便,因为一不小心抬个头,就会碰到天,惹它生气,接着就会招来狂风暴雨。因此所有的植物也都长不高,所以结的粮食和果实都很少,根本就不够大家吃。还经常会发生饿死人的事情。
面向三农,拓宽信息渠道 辐射千村,服务百万农民
三招 让孩子爱上阅读 主讲人:芝莺妈妈 2012年10月19日.
FUZHUANGZHITUYANGBANZHIZUO
如何挑選吳郭魚 嗨~ 餐旅二乙 4a2m0105 白妤潔 4a2m0122 何姿瑩.
学校春季呼吸道传染病预防知识 连云港市疾病预防控制中心
服裝整理概論.
印染纺织类艺术.
创业计划书的编写.
创业计划书撰写.
第九章 进行充分调研 选择自主创业.
香溢饺子馆创业计划书.
第三章 中国的民族民俗 第一节 概论 第二节 汉族 第三节 满族 蒙古族 维吾尔族 回族 朝鲜族 第四节 壮族 土家族 苗族 黎族
第 4 章 投资银行: 基于资本市场的主业架构.
创业数字图书馆.
中国管理科学发展探索 成思危 2006年8月18日于上海复旦大学.
“四文”交融,虚实并举,打造具有鲜明职教特色的校园文化 ——江苏省扬州商务高等职业学校校园文化建设汇报
103年度高職優質化輔助方案計畫申辦及輔導訪視說明會
“十二五”科技发展思路 与科技计划管理 科技部发展计划司 刘敏 2012年9月.
社区妇幼保健工作 江东区妇幼保健院 胡波瑛.
人生不要太圓滿 ◎ 張忠謀.
导致羊水过少的五大因素.
胎教.
怎样进行一次宣讲 何惠玲.
第三课 中国共产党的历程.
[聚會時,請將傳呼機和手提電話關掉,多謝合作]
规范母婴保健服务 努力降低孕产妇死亡率 市卫生局基妇科 朱静.
中国地质科学院矿产资源研究所 财务报账培训
白天的月亮 想與日爭輝 人生不要太圓滿 文字取自於:張忠謀 攝於陽明山 阿道的攝影工作坊.
第十章(上) 实现中华民族的伟大复兴.
营养要均衡.
ㄩ.
高中新课程历史必修(Ⅰ) 教材比较研究 四川师范大学历史文化学院教授 陈 辉 教育部2009普通高中历史课改远程研修资料.
十年职业生涯规划 —— 年 姓名:刘娟 学号:.
主考官眼中的面试 ——面试主考官教你备战2016年国考面试 主讲老师:李海鹏.
国内知名高校 医学院(部、中心) 院系及附属医院设置情况 调研报告
財務報表分析 授課教師:陳依婷.
第六章 可供出售金融资产 一、可供出售金融资产的概念和特征 二、可供出售金融资产的核算.
主讲人:刘文波 (四会国税 政策法规股) 2014年4月
智慧宁波 智慧财税 . 宁波市地方税务局.
第六模块礼仪文书写作 第一节求职信、应聘信 QIUZHIXINYINGPINXIN.
Presentation transcript:

MySQL

1. Install MySQL 5.0 2. MySQL使用简单示例 3. 设置环境变量PATH 4. Mysql,mysqladmin,mysqldump 5. MySQL Administrator和 MySQL Query Browser 6. SQL语言

7. 保护MySQL安装 8. MySQL服务 9. 创建新的数据库和用户 10. 文字:怎么写字符串和数字 11. SQL句法

1. Install MySQL 5.0 Website:http://dev.mysql.com Source Files & Version: mysql-noinstall-5.0.27-win32.zip mysql-gui-tools-noinstall-5.0-r11a-win32.zip mysql-connector-odbc-3.51.14-win32.zip

2. MySQL使用简单示例 mysqld mysql -u root -p show databases quit mysqladmin -u root shutdown -p

mysql>create database Student; mysql> use Student; mysql> create table BasicInfo( id int not null auto_increment, name varchar(50) not null, primary key (id)); mysql> insert into BasicInfo values(null,'Hello'); mysql> select * from ludgee;

3. 设置环境变量PATH System->Advanced->Environment Variables (;)c:\mysql\bin

4. Mysql,mysqladmin,mysqldump 只能通过mysql,mysqladmin,mysqldump,MySQL Adminstrator,MySQL Query Browser等命令和工具完成。

4.1 mysql 1.启动mysql 1)执行MySQL Command Line Client 2)完整路径、资源管理器拖放,CD命令切换等方式输入mysql程序 3)系统变量Path扩展

2.mysql的命令行选项 -u name或-user=name -p -h computername 或-host=computername -protocol=name -P n或-port=n -default-character-set=name databasename

-h选项给出远程MySQL服务器的主机名或IP地址。 前提:1.Computername可以通过网络访问; 2.Port可用; 3.用户具有访问远程MySQL的权限。

-protocol选项给出打算使用的通信协议: 不同计算机上:TCP/IP 同一台计算机:socket(UNIX/Linux),pipe(Windows)或memory(Windows) -default-character-set=name: latin1(ISO-8599-1),latin2(ISO-8599-2),utf8(Unicode),cp850(西欧使用的DOS字符集)

Sample: >mysql –u root –p –h uranus –default-character-set=utf8 mylibrary

3.交互使用mysql 启动mysql后,可以输入执行SQL命令,以分号(;)结束。 “我是个新手”:mysql拒绝执行不带WHERE子句的UPDATE和DELETE命令。 >mysql -u root --i-am-a-dummy mysql> delete from videos; ERROR 1175 (HY000): You are using safe upda le without a WHERE that uses a KEY column

Mysql命令; \c clear \h help \q exit,quit \s status \T[f] tee[filename] 把输入输出记载到指定文件 \t notee 停用tee功能。随时记载输入输出 \u db use database \. fn source filename 读取并执行文件里SQL命令

4.Windows环境下mysql的使用技巧 在输入窗口的标题栏点击右键,进入属性对话框: 颜色 窗口尺寸 滚动区域 剪贴板:QuickEdit Mode

以databasename数据库为操作对象执行file.sql文件所包含的全部SQL命令。 5.用mysql处理SQL文件 >Mysql [options] databasename < file.sql 以databasename数据库为操作对象执行file.sql文件所包含的全部SQL命令。 文件后缀名不用是sql,重要的是内容,命令之间以(;)分割。

以mysqldump备份的数据库文件,先用mysqladmin创建一些新的数据库以便容纳数据,然后从文件读入SQL命令。 读入数据库备份 >mysqladmin –u root –p create dbname >mysql –u root –p dbname < backupfile.sql

4.2 mysqladmin Mysqladmin程序有助于完成许多种系统管理任务,如创建或删除一个数据库、修改密码等。 >mysqladmin [options] admincommand

Options与mysql完全一样(-u,-p,-h等) admincommand是mysqladmin将要执行的任务: Create 创建数据库 Drop 删除数据库 Password 改变由-u给出的MySQL用户的密码

Sample: >mysqladmin –u root –p create newdatabase >mysqladmin –u root –p drop testdatabase >mysqladmin –u root –p password “new password”

4.3 mysqldump Mysqldump程序的用途是为数据库创建备份,在它生成的结果文件里,包含着创建必要的数据表和把有关数据插入这些数据表的SQL命令。 >mysqldump [options] dbname>backupfile.sql

5. MySQL Administrator和 MySQL Query Browser MySQL Administrator和MySQL Query Browser是两种较新的MySQL公司开发的客户端用户界面。 MySQL Administrator侧重于各种系统管理任务; MySQL Query Browser侧重于帮助人们编写和调试SQL命令。

5.1 与MySQL服务器建立连接 Stored Connection:连接名称 Server Host:服务器主机名,本地localhost Port:3306 Username,Password Default Schema(仅适用于MySQL Query Browser),为将要执行的SQL命令指定一个默认的数据库 Details:在极少场合需输入特定参数

5.2 MySQL Administrator Server Information:查看服务器信息 Service Control:启动/停止MySQL服务器(Windows版本里,Configure Service服务配置选项卡能对许多选项进行设置。 Startup Variables:配置启动参数,修改my.ini里的许多选项,需重启MySQL服务器才生效

User Administration:用户管理 Server Connections: Thread:所有活跃MySQL线程(Show Processlist) User Connection:把所有活跃的MySQL用户和他们的线程列成一份清单显示出来。(Show Privileges)

Health:查看系统负载 Connection Health:连接负载。包含3个图表:当前活跃连接的数量,网络通信流量,每秒处理的SQL查询次数。 Memory Health:Query Cache(查询缓冲区)和Key Buffer(索引缓冲区)的使用情况。 Status Variables(状态变量),Server Variables(服务器变量):管理各种状态信息。

Server Logs(查看服务器日志):这个模块可以让用户方便的查看MySQL服务器的日志数据,但前提是有关的日志功能必须已被激活。与日志有关的选项可以通过Startup Parameters模块的Log Files选项卡修改。

Backup(制作数据库备份):适合定期制作备份的场合。先New Project创建一个新的备份项目,在Project Name字段里给新项目起个名字。 1. 设置备份的范围 在Backup Content列表里对数据表进行取舍。 2. 备份选项 在Advanced Options选项卡里设置备份工作的细节。

Lock All Tables:锁定所有的数据表 Single Transaction:单个事务 Normal Backup:常规备份 Complete Backup:完全备份 No CREATEs No EXTENDED INSERTs Add DROP TABLE Complete INSERTs ANSI QUOTES Disable Keys

3. 进行备份 4. 备份工作自动化 Save Project->Excute Backup Now Schedule定期执行备份工作。

Restore:用备份回复数据库 用以前制作的数据库备份来恢复数据库。 在Restore Content选项卡里,在选好备份文件后,可以对应该恢复哪些数据表进行取舍。 想把来自一个数据库的数据表恢复到另一个数据库,需要在Target Schema里输入。

Replication Status:查看镜像机制的工作状态。 如果用MySQL Administrator连接的MySQL服务器是某个镜像系统的组成部分,就可以通过这个模块查看到该镜像系统的工作状态。 Catalogs:对数据库和数据表进行管理。

5.3 MySQL Query Browser MySQL Query Browser的主要任务是帮助人们构造和调试SQL命令。

5.3.1 SQL命令的输入和执行 输入SQL命令,单击Execute,显示一个执行结果数据表。 用鼠标单击方式执行SQL命令。 Ctrl+回车键:执行当前SQL命令 Ctrl+Shift+回车键:执行结果显示在新窗口 F11:改变窗口布局并加大SQL命令输入框 F12:关闭窗口其它部分,只保留结果显示区 用鼠标单击方式执行SQL命令。

5.3.2 修改SELECT结果里的数据 结果只针对一个数据表(没有join)且没有使用(Group By)子命令或任何统计函数。则允许修改-Edit。 双击修改、Add、Delete Apply Changes

5.3.3 SQL命令的历史记录和书签 把执行过的所有命令自动保存在一个名为History的清单里,可以通过主窗口右边的滚动窗口查看。 还可鼠标拖放,或者双击执行。 Ctrl+B组合键给自己常用的命令起一个名字,保存在Bookmark清单中。

5.3.4 一次执行多条命令(脚本) File->New Script Tab(新脚本)打开一个SQL脚本输入区。 既可以一次执行全部这些命令-Execute 也可以一条一条的依次执行-Script菜单

5.3.5 存储过程 提供一些帮助用户输入存储过程(stored procedure)的功能。

5.3.6 MySQL Help(帮助文档) 这份帮助文档可以通过主窗口右边的Syntax(语法)和Function(函数)滚动窗口进行检索,起内容来自http://dev.mysql.com/doc处的MySQL在线文档。

6. SQL语言 SQL命令分为三大类: DML(Data Manipulation Language) DDL(Data Definition Language) DCL(Data Control Language)

6.1 简单查询(SELECT) 6.1.1 确定数据表里有多少条记录 6.1.2 剔除冗余Distinct 6.1.3 限制查询结果中的数据列个数 6.1.4 限制查询结果中的数据记录个数(LIMIT) 6.1.5 使用LIMIT关键字确定数据表里的数据记录

6.2 对查询结果进行排序 6.3 筛选数据记录(WHERE,HAVING) 6.4 执行步骤 6.5 涉及多个数据表的关联查询 6.5.1 两个数据表的关联 6.5.2 三个或更多个数据表的关联 6.5.3 关联查询的语法

6.6 合并查询结果(UNION) 6.7 分组查询、统计函数(GROUP BY) 6.7.1 统计函数 6.7.2 统计函数GROUP_CONCAT() 6.7.3 对多个数据列进行GROUP BY查询 6.7.4 GROUP BY…WITH ROLLUP

6.8 修改数据 6.8.1 备份数据 6.8.2 插入数据记录 6.8.3 修改数据记录(UPDATE) 6.8.4 删除数据记录(DELETE)

6.1 简单查询(SELECT) SELECT * FROM tablename SELECT命令允许不出现数据库或数据表的名字。 查询返回给定数据表中的全部内容。 SELECT命令允许不出现数据库或数据表的名字。 如:SELECT 2×3 SELECT NOW()

6.1.1 确定数据表里有多少条记录 SELECT COUNT(pubID) FROM publishers 只返回数据记录的个数,而不是真正去读取他们的内容。 可以不是pubID,而是表中任何一列,或者*

6.1.2 剔除冗余Distinct 查询数据列内容不重复的数据记录有多少。 SELECT COUNT(DISTINCT pubID) FROM titles SELECT COUNT(*)/COUNT(DISTINCT titleID) FROM re_title_author

6.1.3 限制查询结果中的数据列个数 除了*(星号)可以列出查询的数据表中的所有列外,还可以指定查询返回的结果的数据列。 SELECT pubName FROM publishers 别名:可以用AS关键字给字段取一个别名。

6.1.4 限制查询结果中的数据记录个数(LIMIT) SELECT title FROM titles LIMIT 2 之后,如想查看下两条记录,就要再进行一次查询,使用LIMIT offset n子命令。 SELECT title FROM titles LIMIT 2,2

6.1.5 使用LIMIT关键字确定数据表里的数据记录 SELECT SQL_CALC_FOUND_ROWS title FROM titles ORDER BY title LIMIT 3 SELECT FOUND_ROWS() 增加SQL_CALC_FOUND_ROWS选项,可以在下一条查询里使用FOUND_ROWS查出总记录条数。

6.2 对查询结果进行排序 ORDER BY column SELECT authName FROM authors ORDER BY authName (DESC)

6.3 筛选数据记录(WHERE,HAVING) SELECT authName FROM authors WHERE authname>=‘M’ SELECT authName FROM authors WHERE authname LIKE ‘%er%’ Like操作符往往非常慢,通常可改为全文检索查询 SELECT authID,authName FROM authors WHERE authID IN(2,7,12)

GROUP和HAVING子句用于扩展聚合函数的功能。 GROUP BY用来指定分组,当进行任何聚合操作时,该子句都将对组进行统计计算。

HAVING子句经常和GROUP BY子句结合使用,为一个组或一个聚合指定搜索条件。 HAVING子句只能和SELECT语句一起使用,而且如果不用GROUP BY子句,它的用法会和WHERE子句很相似。 当用到GROUP BY子句时,将限制从聚合函数中返回的行的数量。

如果WHERE和HAVING同时出现,MySQl将优化执行WHERE子句,而HAVING子句只能用来对SELECT…WHERE…查询的结果(中间结果)作进一步筛选。 HAVING子句不易优化,尽量使用等价的WHERE子句。

6.4 执行步骤 1. 列出FROM子句中的全部表和视图的全部行的全部组合都包括在这一步形成的中间结果表中。 2. 如果指定一个WHERE子句,那么只有搜索条件为真的那些行才包括在这一步形成的中间结果表中。

3. 如果指定GROUP BY子句,那么前一步生成的中间结果表中的行组合成单独的组,使一个组中的所有行对于所有的组合列都有相同的值。 4. 如果指定HAVING子句,那么这种搜索条件应用到每一个组中。只有搜索条件为真的行的组才包含在这一步形成的中间结果表中。

5. 如果对选项列表指定DISTINCT关键字,那么删除前面步骤中生成的结果表中的冗余行;否则,所有的行都包括在最终的结果表中。

6.5 涉及多个数据表的关联查询 涉及多个数据表的关联查询可以在SELECT语句中的FROM子句或WHERE子句中被指定。 需要使用JOIN语法来构造: 内联结(INNER JOIN) 外联结(OUTER JOIN)

内连接(INNER JOIN):最常用。使用一个比较操作符(=,<>),将以两个表中共同的值为基础来匹配两个表中的行。 SELECT publName,title FROM publishers INNER JOIN titles ON publishers.publID=titles.publID ORDER BY publName

外连接(OUTER JOIN):是一种不常用的比较形式。这种类型的联结有三种不同的方式: 左联结(LEFT JOIN) 右联结(RIGHT JOIN) 全联结(CROSS JOIN)

左联结(LEFT JOIN):将从联结左边的表中检索所有的行,而不仅仅是那些匹配的行。 SELECT publName,title FROM publishers LEFT JOIN titles ON publishers.publID=titles.publID ORDER BY publName 如果左边表中的行在右边表中没有相匹配行,检索结果中对应右边表的列将包含空值。

右联结(RIGHT JOIN):将检索右边表中所有行和左边表中与右边表相匹配的行。 SELECT publName,title FROM publishers RIGHT JOIN titles ON publishers.publID=titles.publID ORDER BY publName 如果在左边表中没有与右边相匹配的行,则在该位置返回一个空值。

全联结(CROSS JOIN):不管另一边的表是否有匹配行而检索出两表中所有的行。 SELECT publName,title FROM publishers CROSS JOIN titles ON publishers.publID=titles.publID ORDER BY publName 如果左右表中各有10行,将返回100行。

6.5.1 两个数据表的关联 SELECT title,publName FROM titles,publishers 以上返回图书和出版公司的所有组合。下面增加WHERE子句。 SELECT title,publName FROM titles,publishers WHERE titles.publID=publishers.publID 也可使用下列等效方法。

2. 使用USING关键字来给出两个数据表之间的关联字段,但关联字段必须是相同的名字 1. LEFT JOIN…ON SELECT title,publName FROM titles LEFT JOIN publishers ON titles.pubID=publishers.pubID 2. 使用USING关键字来给出两个数据表之间的关联字段,但关联字段必须是相同的名字 USING (publID)

6.5.2 三个或更多个数据表的关联 返回一份所有图书及其所有作者的清单,同一本书有多位作者的将在清单里重复出现。 SELECT title,authName FROM titles,rel_title_author,authors WHERE titles.titleID=rel_title_author.titleID AND authors.authID=rel_title_author. authID ORDER BY title

生成一份出版公司和图书作者的清单,涉及4个数据表。有的作者在同一家出版社出版过不止一本书,使用DISTINCT可以确保重复的“作者-出版公司”数据记录只出现一次。 SELECT DISTINCT publName,authName FROM publishers,titles,rel_title_author,authors WHERE titles.titleID=rel_title_author.titleID AND authors.authID=rel_title_author.authID AND publishers.publID=titles.publID ORDER BY publName,authName;

6.5.3 关联查询的语法 SELECT命令语法下的FROM子句有许多彼此差不多完全一样的变体,汇总如下表

表6-1 无条件关联(数学意义上的完全组合,几乎没有实际用途) 语法变体 (1) FROM table1,table2 (2) FROM table1 JOIN table2 (3) FROM table1 CROSS JOIN table2 (4) FROM table1 INNER JOIN table2 (5) FROM table1 STRAIGHT_JOIN table2

表6-2 有条件关联 语法变体 (6) FROM table1,table2 WHERE table1.xyID=table2.xyID (7) FROM table1 LEFT[OUTER] JOIN table2 ON table1.xyID=table2.xyID (8) FROM table1 LEFT[OUTER] JOIN table2 USING(xyID) (9) FROM table1 NATURAL[LEFT[OUTER]] JOIN table2 (10) FROM table2 RIGHT[OUTER] JOIN table1 ON table1.xyID=table2.xyID (11) FROM table2 RIGHT[OUTER] JOIN table1 USING(xyID)

说明 1. 关键字OUTER可选,有和没有的效果完全一样。 2. 10,11项对应7,8项,调换了table1和table2。MySQL建议:为了最大限度的和其它品牌的数据库系统保持兼容,最好不使用RIGHT JOIN-应该把它改为LEFT JOIN。 3. USING变体要求两个数据表里的xyID字段有相同的名字。 4. NATURAL变体将自动使用两个数据表里的名字相同的字段进行关联,这意味着两个数据表里除了ID字段之外不应该再有任何名字相同的字段。

6.6 合并查询结果(UNION) 使用UNION关键字可以把两个或多个SELECT查询命令合并在一起,而最终的结果是各次查询结果的顺序排列: SELECT command UNION [ALL] SELECT command …

合并同一个数据表中的两个SELECT命令的结果: SELECT * FROM authors WHERE authName LIKE 'b%' UNION SELECT * FROM authors WHERE authName LIKE 'g%'

不同数据表上的查询也可以合并,但需要保证各次查询结果的数据列在个数和数据类型上都是一样的。 否则,MySQL将把最终的结果数据全部转换为第一条SELECT命令的数据类型。

UNION ALL可以保留最终结果里的重复的记录。 还可以把个别的SELECT命令用圆括号括起来,这样,可以对每次查询以及最终结果作出LIMIT和ORDER BY设置。

从两个数据表里分别选取了最多10条记录并把它们合并在一起,然后又从这些(最多20条)记录里选取了前5各来显示: (SELECT * FROM authors WHERE authName LIKE 'b%'ORDER BY authName LIMIT 10) UNION (SELECT * FROM authors WHERE authName LIKE 'g%'ORDER BY authName LIMIT 10) ORDER BY authName LIMIT 5

6.7 分组查询、统计函数(GROUP BY) 保存在数据库里的图书信息,划分了一些门类。下面的查询显示不同的门类包含着哪些图书: SELECT catName,title FROM titles,categories WHERE titles.catID=categories.catID ORDER BY catName,title 如果要显示没被归入任何门类的图书,即想显示所有的图书,则须使用下列关联查询: title FROM titles LEFT JOIN categories ON titles.catID=categories.catID

6.7.1 统计函数 GROUP BY name语法可以按一个给定数据列的每个成员对查询结果进行分组统计,最终看到的是一个分组汇总表。 SQL语言提供的各种统计函数可以配合GROUP BY语法实现这一功能,可以在SELECT命令里用COUNT(),SUM(),MIN()和MAX()等函数得出想看到的结果。

显示每个类型的图书有多少本: 列出所有图书门类,不管该类有没有图书: SELECT catName,COUNT(title) AS nrOfItems FROM titles,categories WHERE titles.catID=categories.catID GROUP BY catName ORDER BY catName 列出所有图书门类,不管该类有没有图书: FROM titles LEFT JOIN categories ON titles.catID=categories.catID ORDER BY nrOfItems DESC

6.7.2 统计函数GROUP_CONCAT() 统计函数GROUP_CONCAT()的作用是把一些字符串归为一个分组。 如下例所示:把作者人数在一个以上的图书列举出来,同时把作者们的姓名按字母顺序列出。 此处,ORDER BY指定作者姓名排序方式,SEPARATOR关键字明确指定一个作者姓名之间的分隔符。

SELECT title, GROUP_CONCAT(authName ORDER BY authname SEPARATOR ',') AS authors, COUNT(authors.authID) AS cnt FROM authors,titles,rel_title_author WHERE authors.authID=rel_title_author.authID AND titles.titleID=rel_title_author.titleID GROUP BY titles.titleID HAVING cnt>1 ORDER BY title

6.7.3 对多个数据列进行GROUP BY查询 GROUP BY还可以用来对多个数据列进行分组。如下按语言和图书门类对图书进行分组统计: SELECT langName,catName,COUNT(*) FROM titles,languages,categories WHERE titles.catID=categories.catID AND titles.langID=languages.langID GROUP BY langName,catName

6.7.4 GROUP BY…WITH ROLLUP 如果GROUP BY子句里只有一个数据列,则加上WITH ROLLUP关键字将在查询结果的最后一行自动增加一条总数统计记录。这条记录的ID字段取值或者说这条记录的名字永远是NULL。 SELECT langName,COUNT(*) FROM titles,languages WHERE titles.langID=languages.langID GROUP BY langName WITH ROLLUP

在多个数据列上使用WITH ROLLUP关键字,将为第一列分组统计“小计”,为全体记录统计“总计”; SELECT langName,catName,COUNT(*) FROM titles,languages,categories WHERE titles.catID=categories.catID AND titles.langID=languages.langID GROUP BY langName,catName WITH ROLLUP

6.8 修改数据 MySQL数据库主要提供以下三种操作: INSERT UPDATE DELETE

6.8.1 备份数据 1.为数据表制作一个副本 创建一个名为newtable的新数据表,并把table数据表里的数据全部拷贝到这个新数据表里去。 CREATE TABLE newtable SELECT * FROM table 新数据表的数据列定义与老数据表完全一样,但偶尔会发生意外。

2.用数据表副本恢复数据表 DELETE FROM table INSERT INTO table SELECT * FROM newtable 可以删去newtable DROP TABLE newtable

在一个shell或命令窗口里启动mysqldump 3.为整个数据库制作一个备份 在一个shell或命令窗口里启动mysqldump >mysqldump –u lginname –p dbname>backupfile 备份文件一般保存在C:\Documents and Settings\Administrator中,名为*.sql。

>mysql –u loginname –p dbname<backupfile 也可在交互模式下重建这个数据库: 4.用数据库备份恢复数据库 >mysql –u loginname –p dbname<backupfile 也可在交互模式下重建这个数据库: >mysql –u root –p mysql>CREATE DATABASE dbname; mysql>USE dbname; mysql>SOURCE backupfile;

6.8.2 插入数据记录 1. 用INSERT向一张表中插入记录 1.1 列出有关数据列的名字(有默认值,允许包含NULL,带有AUTO_INCREMENT属性的数据列不用列出),然后写出将被插入的数据: USE mylibrary; INSERT INTO titles(title,year) VALUES ('MySQL',2005);

1.2 不写出数据列的名字,则必须为所有的数据列按其顺序提供数据值。 INSERT INTO titles VALUES (NULL,'deleteme','',1,NULL,NULL,NULL,2005,NULL,NULL,NULL,NULL) AUTO_INCREMENT,TIMESTAMP类型的字段存入NULL值时,实际存入的并不是NULL。

1.3 用一条命令插入多条新的数据记录 INSERT INTO table (columnA,columnB,columnC) VALUES (‘a’,1,2),(‘b’,12,13),(‘c’,22,33),……

2.向关联数据表插入新记录 把一本新书收录到数据库里,Randy Yanger,Georage Reese,Tim King合著的MySQL & mSQL,O’Reilly出版公司1999年出版。 LAST_INSERT_ID()函数返回MySQL为上一条INSERT命令生成的AUTO_INCREMENT值。 它是面向连接的函数,只对本次连接会话有效。

INSERT INTO publishers (publName) VALUES ('0\'Reilly & Associates'); SELECT LAST_INSERT_ID() INSERT INTO authors (authName) VALUES ('Yarger R.'); SELECT LAST_INSERT_ID(); INSERT INTO authors (authName) VALUES (‘Reese G.');

INSERT INTO authors (authName) VALUES (‘King T.'); SELECT LAST_INSERT_ID(); INSERT INTO titles (title,publID,year) VALUES ('MySQL & mSQL',4,1999); INSERT INTO rel_title_author VALUES (112,90,NULL),(112,91,NULL),(112,92,NULL);

6.8.3 修改数据记录(UPDATE) UPDATE tablename SET column1=value1,column2=value2,… WHERE columnID=n Sample: UPDATE titles SET title='Linux,6th ed.' WHERE titleID=1

不带WHERE的UPDATE命令将对给定数据表里的全体数据记录作出修改: UPDATE titles SET year=2005 在UPDATE命令里还允许进行少数几种数学运算 UPDATE title SET price=price*1.05

1. 编辑排序清单里的数据记录(UPDATE…ORDER BY…LIMIT) UPDATE titles SET year=2007 ORDER BY titleID LIMIT 10 2. 更新关联数据表里的数据记录 UPDATE table1,table2 SET table1.columnA=table2.columnB WHERE table1.table1ID=table2.table1ID

6.8.4 删除数据记录(DELETE) DELETE FROM titles WHERE titleID=8 DROP TABLE

1.删除关联数据表中的数据记录 DELETE t1,t2 FROM t1,t2,t3 WHERE condition1 AND condition2 … 把数据表t1,t2里满足WHERE条件的所有数据记录全部删掉。

从title数据表中把作者‘Kofler Michael写的书全部删掉: DELETE titles FROM titles,rel_title_author,authors WHERE titles.titleID=rel_title_author.titleID AND authors.authID=rel_title_author.authID AND authors.authName='Kofler Michael'

DELETE命令里,可以用JOIN来关联。 只有FROM之前的数据表不一样。 DELETE titles,rel_title_author,authors FROM titles,rel_title_author,authors WHERE titles.titleID=rel_title_author.titleID AND authors.authID=rel_title_author.authID AND authors.authName='Kofler Michael‘ DELETE命令里,可以用JOIN来关联。

上面语句语法正确,但执行时会出现以下错误: Cannot delete or update a parent row: a foreign key constraint fails (`mylibrary`.`rel_title_author`, CONSTRAINT `rel_title_author_ibfk_1` FOREIGN KEY (`authID`) REFERENCES `authors` (`authID`))

解决方法 1). SET FOREIGN_KEY_CHECKS = 0命令暂时关闭MySQL的外键约束条件检查机制,等执行完DELETE命令之后,再用SET FOREIGN_KEY_CHECKS = 1重启该功能 (独立的SQL命令) 2). 定义外键约束条件时加上ON DELETE CASCADE选项 3). 彻底抛弃外键,或使用MyISAM数据表(MyISAM数据表不支持数据一致性规则)

2. 删除排序清单里的数据记录(DELETE…ORDER BY…LIMIT) DELETE FROM authors ORDER BY ts DESC LIMIT 1

7. 保护MySQL安装 1.以root身份登录MySQL服务器(DOS提示符) 如果root用户具有密码 >Mysql –u root 如果root用户具有密码 >Mysql –u root –p 2.使用mysql数据库(以下提示符均为mysql) mysql>Use mysql;

3.显示全体用户信息: 4.设置root密码 5.重新命名root用户 select user,host,password from user; 4.设置root密码 update user set password=password('secret') where user='root'; 5.重新命名root用户 Update user set user='myroot' where user='root';

6.删除匿名用户 7.为每一个用户设置密码 8.对可以从任何地方注册的用户的处理 delete from user where user=''; 7.为每一个用户设置密码 update user set password=password('secret') where password=''; 8.对可以从任何地方注册的用户的处理 select user ,host,password from user where host='%'; update user set host='%.sol' where host='%'; flush privileges;//刷新RAM中数据库副本

8. MySQL服务 开机自动启动服务: 命令加载和卸载 手动启动或停止 MySQLSystemTrayMonitor MySQL系统管理员 Windows System Control 命令加载和卸载 Mysqld –install mysql –defaults-file=“c:\mysql\my.ini” Mysqld –remove mysql 手动启动或停止 Net start mysql Net stop mysql

C:\>c:\mysql\bin\mysqld -install MySQL --defaults-file="c:\mysql\my C:\>c:\mysql\bin\mysqld -install MySQL --defaults-file="c:\mysql\my.ini" Service successfully installed. C:\>mysqld-nt install C:\>net start mysql MySQL 服务正在启动 . MySQL 服务已经启动成功。

C:\>net stop mysql MySQL 服务正在停止. MySQL 服务已成功停止。 C:\>mysqld-nt remove Service successfully removed.

9. 创建新的数据库和用户 创建数据库forum,用户forumadmin对这个数据库有不加限制的访问权限: mysql> create database forum; mysql> grant all on forum.* to forumadmin@localhost identified by 'XXX';

创建具有较少权限的数据库用户: mysql> GRANT select,insert,update,delete ON forum.* TO forumuser@localhost IDENTIFIED BY 'XXX';

MySQL提供的权限 权限 列 上下文 select Select_priv 表 insert Insert_priv update Update_priv delete Delete_priv index Index_priv alter Alter_priv create Create_priv 数据库、表或索引 drop Drop_priv 数据库或表 grant Grant_priv references References_priv reload Reload_priv 服务器管理 shutdown Shutdown_priv process Process_priv file File_priv 在服务器上的文件存取

10. 文字:怎么写字符串和数字 一个字符串是一个字符序列,由单引号(“'”)或双引号(“"”)字符(后者只有你不在ANSI模式运行)包围。例如: 'a string' "another string" 在字符串内,某个顺序有特殊的意义。这些顺序的每一个以一条反斜线(“\”)开始,称为转义字符。

MySQL转义字符 MySQL识别下列转义字符: \0 一个ASCII 0 (NUL)字符。 \n 一个新行符。 \t 一个定位符。 \r 一个回车符。 \b 一个退格符。 \' 一个单引号(“'”)符。 \" 一个双引号(“"”)符。 \\ 一个反斜线(“\”)符。 \% 一个“%”符。它用于在正文中搜索“%”的文字实例,否则这里“%”将解释为一个通配符。 \_ 一个“_”符。它用于在正文中搜索“_”的文字实例,否则这里“_”将解释为一个通配符。

有几种方法在一个字符串内包括引号: 一个字符串内用“'”加引号的“'”可以被写作为“''”。 一个字符串内用“"”加引号的“"”可以被写作为“""”。 你可以把一个转义字符(“\”)放在引号前面。 一个字符串内用“"”加引号的“'”不需要特殊对待而且不必被重复或转义。同理,一个字符串内用“'”加引号的与“"”也不需要特殊对待。

下面显示的SELECT演示引号和转义如何工作: mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello'; +-------+---------+-----------+--------+--------+ | hello | "hello" | ""hello"" | hel'lo | 'hello | mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello"; | hello | 'hello' | ''hello'' | hel"lo | "hello | mysql> SELECT "This\nIs\nFour\nlines"; +--------------------+ | This Is Four lines |

数字 整数表示为一个数字顺序。浮点数使用“.”作为一个十进制分隔符。这两种类型的数字可以前置“-”表明一个负值。 有效整数的例子: 1221 0 -32 有效浮点数的例子: 294.42 -32032.6809e+10 148.00 一个整数可以在浮点上下文使用;它解释为等值的浮点数。

用户变量 MySQL支持线程特定的变量,用@variablename句法。 一个变量名可以由当前字符集的数字字母字符和“_”、“$”和“.”组成。

你可以用SET句法设置一个变量: SET @variable= { integer expression | real expression | string expression } [,@variable= ...]. 你也可以用@variable:=expr句法在一个表达式中设置一个变量: select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

+------------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | | 5 | 5 | 1 | 4 | (这里,我们不得不使用:=句法,因为=是为比较保留的)

11. SQL句法 以下给出一些常用SQL句法参考

DATABASE句法 CREATE DATABASE db_name DROP DATABASE [IF EXISTS] db_name

CREATE TABLE句法 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement]

create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition] or PRIMARY KEY (index_col_name,...) or KEY [index_name] (index_col_name,...) or INDEX [index_name] (index_col_name,...) or UNIQUE [INDEX] [index_name] (index_col_name,...) or [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...) [reference_definition] or CHECK (expr)

type: TINYINT[(length)] [UNSIGNED] [ZEROFILL] or SMALLINT[(length)] [UNSIGNED] [ZEROFILL] or MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] or INT[(length)] [UNSIGNED] [ZEROFILL] or INTEGER[(length)] [UNSIGNED] [ZEROFILL] or BIGINT[(length)] [UNSIGNED] [ZEROFILL] or REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] or DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] or FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] or DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] or NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] or CHAR(length) [BINARY] or VARCHAR(length) [BINARY]

or DATE or TIME or TIMESTAMP or DATETIME or TINYBLOB or BLOB or MEDIUMBLOB or LONGBLOB or TINYTEXT or TEXT or MEDIUMTEXT or LONGTEXT or ENUM(value1,value2,value3,...) or SET(value1,value2,value3,...)

ALTER TABLE句法 ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...] ALTER TABLE允许你修改一个现有表的结构。例如,你可以增加或删除列、创造或消去索引、改变现有列的类型、或重新命名列或表本身。你也能改变表的注释和表的类型。

OPTIMIZE TABLE句法 OPTIMIZE TABLE tbl_name 如果你删除了一个表的大部分或如果你用变长的行对一个表(有VARCHAR、BLOB或TEXT列的表)做了改变,应该使用OPTIMZE TABLE。删除的记录以一个链接表维持并且随后的INSERT操作再次使用老记录的位置。你可以使用OPTIMIZE TABLE回收闲置的空间。

DROP TABLE句法 DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]

DELETE句法 DELETE [LOW_PRIORITY] FROM tbl_name [WHERE where_definition] [LIMIT rows] DELETE从tbl_name表中删除满足由where_definition给出的条件的行,并且返回删除记录的个数。

SELECT句法 select_expression,... [FROM table_references SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] [DISTINCT | DISTINCTROW | ALL] select_expression,... [INTO {OUTFILE | DUMPFILE} 'file_name' export_options] [FROM table_references [WHERE where_definition] [GROUP BY col_name,...] [HAVING where_definition] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...] [LIMIT [offset,] rows] [PROCEDURE procedure_name] ]

JOIN句法 table_reference, table_reference table_reference [CROSS] JOIN table_reference table_reference INNER JOIN table_reference table_reference STRAIGHT_JOIN table_reference table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr table_reference LEFT [OUTER] JOIN table_reference USING (column_list) table_reference NATURAL LEFT [OUTER] JOIN table_reference { oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }

INSERT句法 INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),... 或 INSERT [LOW_PRIORITY | DELAYED] [IGNORE] SELECT ... [INTO] tbl_name SET col_name=expression, col_name=expression, ...