MySQL5.5从零开始学(2013-12-18 16:22:52)

20160907添加:
MySQL有一个存储引擎概念
C:\Users\DELL->mysql -u root -pmysql55
mysql> show engines;
mysql> show variables like 'table_type';
只学MyISAM和InnoDB两个表类型
MyISAM表类型
表空间占用相对小,读取速度快、
支持全文索引
不支持外键约束、数据行锁定、事务处理
InnoDB表类型
表空间占用相对大
支持外键约束、数据行锁定、事务处理
不支持全文索引
MyISAM表类型有3个文件
frm存储表结构
myd存储表数据内容
myi存储表索引
InnoDB表类型有1个文件
frm
mysql> show character set;
mysql> show collation like 'gbk%';
_ci结尾表示大小写不敏感
_cs结尾表示大小写敏感
_bin结尾表示大小写敏感

01 MySQL数据库管理系统概述
C:\Users\DELL->mysql -h localhost -u root -pmysql55
mysql> \s
mysql> show variables like 'port';
mysql> show databases;
mysql> create database xsphpdb;
mysql> drop database xsphpdb;
mysql> drop database if exists xsphpdb;
mysql> create database if not exists xsphpdb;
mysql> create table xsphpdb.users(id int,name char(30),age int,sex char(3));
mysql> use xsphpdb;
mysql> show tables;
mysql> desc users;
mysql> drop table if exists users;
mysql> create table if not exists users(id int,name char(30),age int,sex char(3));
mysql> insert into users values('2','lisi','20','nv');
mysql> insert into users(id,name,age) values('1','wangwu','10');
mysql> select * from users;
20160716添加:
MySQL数据库入门
传智播客高教产品研发部 编著
2015年3月第1版
1.4 MySQL的使用
1.4.1启动MySQL服务
1、通过Windows服务管理器启动MySQL服务
2、通过DOS命令启动MySQL服务
net start mysql
net stop mysql
1.4.2登录MySQL数据库
1、使用相关命令登录
mysql -h 192.168.0.254 -u root -p
C:\Users\DELL->mysql -h 192.168.0.254 -u root -p
Enter password: *******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.28 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2、使用MySQL Command Line Client登录
Enter password: *******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.28 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
chap3添加、更新与删除数据
2、UPDATE更新全部数据
在UPDATE语句中如果没有使用WHERE子句,则会将表中所有记录的指定字段都进行更新。
UPDATE room_info SET RoomTeltComIp=16777343,RoomUnicomIp=16777343,RoomMobileIp=16777343,OnlyReadDbIp=16777343

14.3 MySQL的相关命令
从服务器获取MySQL的状态信息
mysql> status
--------------
C:\Program Files\MySQL\MySQL Server 5.5\bin\mysql.exe  Ver 14.14 Distrib 5.5.28,
 for Win64 (x86)
Connection id:          3
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.5.28 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 42 min 38 sec
Threads: 2  Questions: 17  Slow queries: 0  Opens: 34  Flush tables: 1  Open tab
les: 0  Queries per second avg: 0.006
--------------
mysql>
或者
mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.5.28, for Win64 (x86)
Connection id:          2
Current database:
Current user:           root@DELL
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.5.28 MySQL Community Server (GPL)
Protocol version:       10
Connection:             192.168.0.254 via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 41 min 46 sec
Threads: 2  Questions: 15  Slow queries: 0  Opens: 34  Flush tables: 1  Open tab
les: 0  Queries per second avg: 0.005
--------------
mysql>
该命令显示了MySQL当前的版本,字符集编码以及端口号等信息。
上述的4个字符集编码分别为数据库服务器的编码、数据库的编码、客户端的编码、建立连接使用的编码。
用另一个数据库,数据库名称作为参数
mysql> \u test
Database changed
mysql>
或者
mysql> use test
Database changed
mysql>
8.1数据库的备份与还原
mysqldump命令可以备份单个数据库、多个数据库和所有数据库。
8.2数据库的还原
mysql> show databases;
mysql> create database six_divisions;
mysql> use six_divisions;
mysql> source D:\Hanxiaohua\sysg20131228\20131226-99.sql
表里面的IP改为192.168.0.254
mysql> UPDATE room_info SET RoomTeltComIp=-33511232,RoomUnicomIp=-33511232,RoomM
obileIp=-33511232,OnlyReadDbIp=-33511232 WHERE roomid>1000;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 11  Changed: 0  Warnings: 0
测试帐号
SELECT * FROM user_info WHERE PASSWORD='202cb962ac59075b964b07152d234b70'
SELECT Money FROM user_info WHERE (userid=7542 OR userid=7543 OR userid=7548);
SELECT * FROM user_wealth WHERE (userid=7542 OR userid=7543 OR userid=7548);
UPDATE user_info SET NAME='hxh001',Nickname='hxh001' WHERE userid=7542;
UPDATE user_info SET NAME='hxh002',Nickname='hxh002' WHERE userid=7543;
UPDATE user_info SET NAME='hxh003',Nickname='hxh003' WHERE userid=7548;
UPDATE user_wealth SET Gold=50000000000,Experience=4000000 WHERE (userid=7542 OR userid=7543 OR userid=7548);
UPDATE user_info SET NAME='hxh004',Nickname='hxh004' WHERE userid=7552;
UPDATE user_info SET NAME='hxh005',Nickname='hxh005' WHERE userid=7565;
UPDATE user_info SET NAME='hxh006',Nickname='hxh006' WHERE userid=7575;
UPDATE user_info SET NAME='hxh007',Nickname='hxh007' WHERE userid=7578;
UPDATE user_info SET NAME='hxh008',Nickname='hxh008' WHERE userid=7581;
UPDATE user_info SET NAME='hxh009',Nickname='hxh009' WHERE userid=7582;
UPDATE user_wealth SET Gold=300000000,Experience=20000 WHERE (userid=7552 OR userid=7565 OR userid=7575 OR userid=7578 OR userid=7581 OR userid=7582);

1.等于运算符=
例如:
SELECT     CITY_ID, CITY_NAME, PROVINCE_CODE
FROM         T_CITY
WHERE     (PROVINCE_CODE = '001')
3.不等于运算符<>或者!=
例如:
SELECT DISTINCT(CITY_ID),CITY_NAME
FROM T_CITY
WHERE PROVINCE_CODE <>''
8.ISNULL(ISNULL),IS NOT NULL运算符
例如:
SELECT
CUSTOMER_ID AS 顧客番号
,CUSTOMER_NAME AS 顧客名
,TEL AS 電話番号
,PLACE AS 住所
FROM T_CUSTOMER_VIEW
WHERE CUSTOMER_ID is null
 
13.LIKE
LIKE运算符用来匹配字符串。
例如:
SELECT
CUSTOMER_ID AS 顧客番号
,CUSTOMER_NAME AS 顧客名
,TEL AS 電話番号
,PLACE AS 住所
FROM T_CUSTOMER_VIEW
WHERE CUSTOMER_NAME like '%王%' and TEL like '%0451%' and PLACE like '%黑龙江%'
ORDER BY CUSTOMER_ID
6.5条件判断函数
条件判断函数也称为控制流程函数,根据满足的条件的不同,执行相应的流程。MySQL中进行条件判断的函数有IF、IFNULL和CASE。本节将介绍各个函数的用法。
6.5.1 IF(expr,v1,v2)函数
IF(expr,v1,v2)如果表达式expr是TRUE(expr<>0 and expr<>NULL),则IF()的返回值为v1;否则返回值为v2。IF()的返回值为数字值或字符串值,具体情况视其所在语境而定。
6.5.2 IFNULL(v1,v2)函数
IFNULL(v1,v2)假如v1不为NULL,则IFNULL()的返回值为v1;否则其返回值为v2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所在的语境。
6.5.3 CASE函数
CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END
该函数表示,如果expr值等于某个vn,则返回对应位置THEN后面的结果。如果与所有值都不相等,则返回ELSE后面的rn。
例如:
2. 报修快速检索
⑴SELECT     RECEPTION_NUMBER AS 受理编号, CUSTOMER_NAME AS 顾客姓名, SITUATION AS 状況, RECEPTION_DATE AS 受理日期, CASE CUSTOMER_SURVEY_FLG WHEN 1 THEN '○' ELSE '' END AS 评价实施, CUSTOMER_ID AS 顾客编号, SITUATION_ID AS 状況ID
FROM         T_AFTER_VIEW
WHERE     (RECEPTION_NUMBER = '060407036')
⑵SELECT     RECEPTION_NUMBER AS 受理编号, CUSTOMER_NAME AS 顾客姓名, NULL AS 状況, RECEPTION_DATE AS 受理日期, NULL AS 评价实施, NULL                       AS 顾客编号, NULL AS 状況ID
FROM         T_ADVISORY
WHERE     (RECEPTION_NUMBER = '060407036')
7.2.4带IN关键字的查询
IN关键字用来查询满足指定范围内的条件的记录,使用IN操作符,将所有检索条件用括号括起来,检索条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项。
相反的,可以使用关键字NOT来检索不在条件范围内的记录。
例如:
⑷今天未完成
SELECT     COUNT(*) AS Expr1
FROM         T_AFTER
WHERE     (SITUATION_ID NOT IN ('090', '100'))
SELECT     RECEPTION_NUMBER, SITUATION_ID
FROM         T_AFTER
WHERE     (SITUATION_ID NOT IN ('090', '100'))
7.2.10查询结果不重复
例如:
SELECT DISTINCT(CITY_ID),CITY_NAME
FROM T_CITY
WHERE PROVINCE_CODE ='003'
7.2.11对查询结果排序
1.单列排序
例如:
14. 解除锁定
SELECT     RECEPTION_NUMBER AS 受理编号, USER_NAME AS 作業者, LOCK_TIME AS LOCK時間
FROM         T_LOCK_INFO
ORDER BY RECEPTION_NUMBER
Select PROVINCE_CODE AS 省ID,PROVINCE_NAME AS 省名
From T_PROVINCE
order by PROVINCE_CODE
2.多列排序
3.指定排序方向
例如:
15. 用户登陆
SELECT *
FROM T_USER
WHERE SUSPENSION_FLG=0 AND USER_ID='100' AND PASSWORD='1122'
Select * From T_USER
where SUSPENSION_FLG = '0'
order by USER_ID DESC
7.2.12分组查询
分组查询是对数据按照某个或多个字段进行分组,MySQL中使用GROUP BY关键字对数据进行分组,基本语法形式为:
[GROUP BY 字段][HAVING<条件表达式>]
字段值为进行分组时所依据的列名称;“HAVING<条件表达式>”指定满足表达式限定条件的结果将被显示。
1.创建分组
GROUP BY关键字通常和集合函数一起使用,例如:MAX()、MIN()、COUNT()、SUM()、AVG()。
例如:
SELECT     SITUATION_ID
FROM         T_AFTER
GROUP BY SITUATION_ID
010受理,020(维修未结束)处理中,030日程調整中,040顾客完成,060已派维修单,070未完成回复,
080结果回复,090取消,100
完成
负责人,回访人:001赵中华,002王莺歌,003易少娟,004张玉华,005熊金桥,006曾小琴,007张洪杰,008余柳春,
009黄成武,010曾琳琳,100石川和孝,101敖源
2.使用HAVING过滤分组
GROUP BY可以和HAVING一起限定显示记录所需满足的条件,只有满足条件的分组才会被显示。
7.3使用集合函数查询
7.3.1 COUNT()函数
COUNT()函数统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数。其使用方法有两种:
COUNT(*)计算表中总的行数,不管某列有数值或者为空值。
COUNT(字段名)计算指定列下总的行数,计算时将忽略空值的行。
例如:
3. 总体状况
⑴今天受理
SELECT     COUNT(*) AS Expr1
FROM         T_AFTER
WHERE     (CONVERT(varChar, RECEPTION_DATE, 112) = '2007-11-22')
7.3.4 MAX()函数
MAX()返回指定列中的最大值。
例如:
5. 新顾客登记
⑴SELECT MAX(CUSTOMER_ID_DOWN) AS DOWN_MAX
FROM T_CUSTOMER
WHERE CUSTOMER_ID_TOP='071123'
SELECT     CUSTOMER_ID_TOP
, CUSTOMER_ID_DOWN
, CUSTOMER_NAME
, POSTCODE
, PROVINCE_CODE
, CITY_CODE
, ADDRESS
, TEL
, TEL2
, NOTE
, REMARK
, REGISTRATION_DAY
, REG_PERSON
, REFIX_DAY
, REF_PERSON
FROM         T_CUSTOMER
WHERE     (CUSTOMER_ID_TOP = '071123')
7.4.1内连接查询
7.4.2外连接查询
1.LEFT JOIN左连接
10. 产品信息修改
SELECT
PRODUCT_ID AS 产品编号
,C.PRODUCT_CATEGORY AS 产品类别
,D.T_PRODUCT_NAME AS 产品名称
,B.FACTORY_NAME AS 工厂名称
FROM T_PRODUCT AS A
LEFT OUTER JOIN T_FACTORY AS B
ON A.FACTORY_CODE=B.FACTORY_CODE
LEFT OUTER JOIN T_PRODUCT_CATEGORY AS C
ON A.CATEGORY_ID=C.PRODUCT_CATEGORY_ID
LEFT OUTER JOIN T_PRODUCT_NAME AS D
ON A.NAME_ID=D.T_PRODUCT_NAME_ID
7.4.3复合条件连接查询
例如:
7. 维修公司登记
SELECT MAX(A.CHARGE_CODE) AS MAX_CHARGE ,MAX(B.AFFILIATION_CODE) AS MAX_AFFILIATION
FROM T_CHARGE AS A,T_CHARGE AS B
WHERE A.AFFILIATION_CODE=B.CHARGE_CODE AND A.CHARGE_DIVISION= '4'
 
SELECT     MAX(A.CHARGE_CODE) AS MAX_CHARGE
, MAX(B.AFFILIATION_CODE) AS MAX_AFFILIATION
FROM         T_CHARGE AS A INNER JOIN
T_CHARGE AS B ON A.AFFILIATION_CODE = B.CHARGE_CODE
WHERE     (A.CHARGE_DIVISION = '4')
7.7.2为字段取别名
为字段取别名的基本语法格式为:
列名 [AS] 列别名
“列名”为表中字段定义的名称,“列别名”为字段新的名称,AS关键字为可选参数。
例如:
1. 顾客检索
SELECT     CUSTOMER_ID AS 顧客编号, CUSTOMER_NAME AS 顾客姓名, TEL AS 电话, TEL2 AS 电话2, PLACE AS 住址, REMARK
FROM         T_CUSTOMER_VIEW
WHERE     (CUSTOMER_NAME LIKE '%王%')
8.1.1为表的所有字段插入数据
使用基本的INSERT语句插入数据要求指定表名称和插入到新记录中的值。基本语法格式为:
INSERT INTO table_name(column_list) VALUES(value_list);
例如:
⑵INSERT INTO T_CUSTOMER (CUSTOMER_ID_TOP,CUSTOMER_ID_DOWN,CUSTOMER_NAME,POSTCODE,PROVINCE_CODE,CITY_CODE,ADDRESS,TEL,TEL2,NOTE,REMARK,REGISTRATION_DAY,REG_PERSON) VALUES ('071123','003','hsq','432303','003','003003','某地址','139','135','你好', '', '2007-11-23 0:00:00','石川和孝')
INSERT INTO T_PRODUCT
                      (PRODUCT_ID, FACTORY_CODE, CATEGORY_ID, NAME_ID)
VALUES     ('zzxx', '06', '08', '08001')// 电子产品,卫洗丽,TSC
INSERT INTO T_CHARGE
                      (CHARGE_CODE//维修公司编号
, CHARGE_DIVISION
, CHARGE_NAME//维修公司名称
, AFFILIATION_CODE
, PERSON_CHARGE//负责人
, TEL//电话
, TEL_PORTABLE//手机
, FAX//传真
, E_MAIL//电子邮件
, NOTE//备注
, INPUT_FLG//WEB可修改
, REQ_MAIL//不用发报修单
, CLOSE_FLG//现不属于TOTO公司
, SUSPENSION_FLG)
VALUES     ('22002', '2', '某维修公司', '22002', ' 某负责人 ', '0712', '135', '0755', ' han@163.com', ' 某备注', 1, 0, 0, 0)
VALUES     ('11333', '2', '某维修公司', '11333', ' 某负责人 ', '0712', '135', '0755', ' han@163.com', ' 某备注', 1, 0, 0, 0)
8.2更新数据
例如:
UPDATE    T_PRODUCT
SET              FACTORY_CODE = '06', CATEGORY_ID = '08', NAME_ID = '08003'
WHERE     (PRODUCT_ID = 'zzxx')// 电子产品,埋入感应式大便冲水阀,TSC
8.3删除数据
从数据库中删除数据使用DELETE语句,DELETE语句允许WHERE子句指定删除条件。
DELETE FROM table_name[WHERE<condition>];
例如:
DELETE FROM T_PRODUCT
WHERE     (PRODUCT_ID = 'zzxx')
chap9索引
索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻数据文件,而不必查看所有数据。
9.1.1索引的含义和特点
索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个或多个列中有一特定值的行。所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。
所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。大多数存储引擎有更高的限制。MySQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关:MyISAM和InnoDB存储引擎只支持BTREE索引:MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。
9.1.2索引的分类
MySQL的索引可以分为以下几类:
1.普通索引和唯一索引
普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。
唯一索引,索引值的列必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主索引是一种特殊的唯一索引,不允许有空值。
2.单列索引和组合索引
http://www.docin.com/p-587421358.html

范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。 目前关系数据库有六种范式: 第一范式1NF,第二范式2NF,第三范式3NF,第四范式4NF,第五范式5NF,第六范式6NF。满足最低要求的范式是第一范式1NF。一般说来,数据库只需满足第三范式3NF就行了。
第一范式1NF:无重复的列
不满足第一范式的数据库就不是关系数据库。
第二范式2NF:属性完全依赖于主键
要求数据库表中的每个实例或行必须可被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
第三范式3NF:属性不依赖于其它非主属性
范式说明:
1NF是对属性的原子性约束,要求属性具有原子性,不可再分解。
2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性。
3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
5.3.5位运算符
位运算符是用来对二进制字节中的位进行测试、移位或者测试处理,MySQL中提供的位运算有按位或|,按位与&,按位异或^,按位异或^,按位左移<<,按位右移>>,按位取反~。
1.位或运算符|
mysql> select 10|15,9|4|2;
+-------+-------+
| 10|15 | 9|4|2 |
+-------+-------+
|    15 |    15 |
+-------+-------+
1 row in set (0.00 sec)
10的二进制数值为1010,15的二进制数值为1111,按位或运算之后,结果为1111,即整数15;
9的二进制数值为1001,4的二进制数值为0100,2的二进制数值为0010,按位或运算之后,结果为1111,即也是整数15,其结果为一个64位无符号整数。
2.位与运算符&
mysql> select 10 & 15,9&4&2
    -> ;
+---------+-------+
| 10 & 15 | 9&4&2 |
+---------+-------+
|      10 |     0 |
+---------+-------+
1 row in set (0.00 sec)
1010和1111按位与运算之后,结果为1010,即整数10;
1001和0100和0010按位与运算之后,结果为0000,即整数0。其结果为一个64位无符号整数。
3.位异或运算符^
mysql> select 10^15,1^0,1^1
    -> ;
+-------+-----+-----+
| 10^15 | 1^0 | 1^1 |
+-------+-----+-----+
|     5 |   1 |   0 |
+-------+-----+-----+
1 row in set (0.00 sec)
4.位左移运算符<<
mysql> select 1<<2,4<<2;
+------+------+
| 1<<2 | 4<<2 |
+------+------+
|    4 |   16 |
+------+------+
1 row in set (0.00 sec)
5.位右移运算符>>
mysql> select 1>>1,16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
|    0 |     4 |
+------+-------+
1 row in set (0.00 sec)
6.位取反运算符~
mysql> select 5&~1
    -> ;
+------+
| 5&~1 |
+------+
|    4 |
+------+
1 row in set (0.00 sec)
逻辑运算5&~1中,由于位取反运算符'~'的级别高于位与运算符'&',因此先对1取反操作,得到1110,然后再与0101进行与运算,结果为0100,即整数4.
提示:MySQL经过位运算之后的数值是一个64位的无符号整数,1的二进制数值表示为最右边为1,其他位均为0。
mysql> select ~1,BIN(~1);
+----------------------+--------------------------------------------------------
----------+
| ~1                   | BIN(~1)
          |
+----------------------+--------------------------------------------------------
----------+
| 18446744073709551614 | 1111111111111111111111111111111111111111111111111111111
111111110 |
+----------------------+--------------------------------------------------------
----------+
1 row in set (0.00 sec)
chap7查询数据
7.2单表查询
7.2.1查询所有字段
1.在SELECT语句中使用星号“*”通配符查询所有字段
2.在SELECT语句中指定所有字段
提示:一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符“*”。获取不需要的列数据通常会降低查询和所使用的应用程序的效率。
7.2.2查询指定字段
1.查询单个字段
2.查询多个字段
提示:MySQL中的SQL语句是不区分大小写的。
7.2.3查询指定记录
通过WHERE子句可以对数据进行过滤。
7.2.4带IN关键字的查询
7.2.5带BETWEEN AND的范围查询
7.2.6带LIKE的字符匹配查询
1.百分号通配符'%',匹配任意长度的字符,甚至包括零字符
2.下划线通配符'_',一次只能匹配任意一个字符
7.2.7查询空值
7.2.8带AND的多条件查询
7.2.9带OR的多条件查询
提示:AND的优先级高于OR。
7.2.10查询结果不重复
7.2.11对查询结果排序
1.单列排序
2.多列排序
3.指定排序方向
提示:与DESC相反的是ASC(升序排序),在排序的时候ASC是作为默认的排序方式,所以加不加都可以。
7.2.12分组查询
7.2.13使用LIMIT限制查询结果的数量
7.3使用集合函数查询
7.4连接查询
连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。
7.4.1内连接查询
内连接使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。也就是说,在内连接查询中,只有满足条件的记录才能出现在结果关系中。
使用INNER JOIN语法进行内连接查询的时候,连接的条件使用ON子句给出而不是WHERE,ON和WHERE后面指定的条件相同。
提示:INNER JOIN语法是ANSI SQL标准规范。
7.4.2外连接查询
1.LEFT JOIN左连接
2.RIGHT JOIN右连接
7.4.3复合条件连接查询
7.5子查询
7.6合并查询结果
7.7为表和字段取别名
7.7.1为表取别名
提示:在为表取别名时,要保证不能与数据库中的其他表的名称冲突。
7.7.2为字段取别名
7.8使用正则表达式查询
http://www.docin.com/p-48705454.html

数据库系统需求
数据库系统主要完成登录服务器,大厅服务器,游戏服务器,数据库服务器与数据库之间的交互。
其主要分为两大块:登录服务器与数据库的交互,大厅服务器与数据库的交互。
系统需求大致可叙述为:
1.用户通过游戏客户端登陆游戏服务器,服务器通过传递过来的用户到数据库中验证,如果验证通过即可登陆游戏,否则提示用户、密码错误。
2.通过验证后,从数据库中读取出用户的个人资料如账户名,同时读取用户的游戏资料如积分、等级、金钱等参数。
3.用户选择游戏大厅进行游戏。在大厅可进行查收礼物、购买物品、配置自己的物品等操作。
4.在用户一局游戏后,用户的游戏信息会改变。
2.3用户用例分析
3个包:显示包,操作包,设置包
显示包用户用例:
1.显示用户信息:显示在线用户状态
2.显示大厅信息,包括人数
操作包用户用例:
登陆游戏,退出游戏
选择大厅,更换大厅
激活物品,丢弃物品,购买物品
赠送礼物,接收礼物,丢弃礼物
3.2数据库概念设计
根据需求,我们可设计出如下的表
1.Account:存储用户账号信息。用户注册时产生这些信息,每局游戏结束后将更新相应信息。用户可在游戏大厅中相应界面看到这些信息。
PK:AccountId用户账号Id
2.Thing:存储道具信息。用户买入、接收道具以及对道具进行各种操作时,这些数据将更新。用户可在游戏大厅中相应界面看到这些信息。
PK:ThingId用户物品id
AccountId用户物品所属用户Id
3.HSGCVerifyCode:临时存储用户登陆验证信息。 用户登陆时产生这些信息,用于用户进入、更换大厅时使用,用户退出游戏后,产生的这些信息将被删除。
PK:HSGCVerityCodeId登陆验证Id。
AccountId登陆用户的Id
VerifyCode验证码
4.Gift:存储用户礼物信息。用户赠送礼物时,会产生相应信息,被赠送用户会在相应界面看到这些信息。
PK:GiftId礼物的id
AccountId接收礼物用户的id
以上表的实体关系图
3.3数据库逻辑设计
在数据库概念设计完成之后,我们可进行数据库逻辑设计。
1.创建数据库ocean
在MySQL Command Line Client中执行如下命令:
create database ocean;
执行完毕后,数据库ocean创建成功。
2.然后连接数据库ocean
在MySQL Command Line Client中执行如下命令:
use ocean;
执行完毕后,提示数据库连接成功。
3.在数据库ocean中创建表account。
在MySQL Command Line Client中执行如下命令:
create table `account`(`AccountId` int(10) unsigned NOT NULL auto_increment,`UserName` varchar(45) character set latin1 NOT NULL,PRIMARY KEY(`AccountId`))ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
执行完毕后,表account创建成功。

mysql> create database ocean;
Query OK, 1 row affected (0.00 sec)
mysql> use ocean;
Database changed
mysql> create table 'account'('AccountId' int(10) unsigned NOT NULL auto_increme
nt,'UserName' varchar(45) character set latin1 NOT NULL,PRIMARY KEY('AccountId')
)ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ''acco
unt'('AccountId' int(10) unsigned NOT NULL auto_increment,'UserName' varcha' at
line 1
mysql> create table `account`(`AccountId` int(10) unsigned NOT NULL auto_increme
nt,`UserName` varchar(45) character set latin1 NOT NULL,PRIMARY KEY(`AccountId`)
)ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

4.1系统架构设计与分析
根据分析,我们设计出系统架构图。  
【登陆器LC】启动【游戏客户端GC】  
【登陆器】登陆、版本更新,连接【登陆服务器LS】---- LC登陆LS流程图
【游戏客户端】选择大厅、更换大厅、查询、操作、房间内游戏调配,连接【大厅服务器HS】----GC登陆HS流程图、用户更换大厅流程图  
【游戏客户端】游戏逻辑交互,连接【游戏服务器GS】
【登陆服务器】登陆验证,连接【数据库处理服务器DS】
【大厅服务器】房间维护,连接【数据库处理服务器】
【大厅服务器】游戏开始通知房间信息,游戏结束返回结果【游戏服务器】
【数据库处理服务器】数据库操作,返回结果【数据库DB】
登陆登陆服务器和登陆大厅服务器时,均需要连接数据库服务器执行登陆验证操作
游戏服务器没有直接与数据库服务器进行交互。
C API通过两个组件实现:
头文件:mysql.h包含结构和功能说明
Mysql库:libmysqlclient(Unix)或mysqlclient.lib(Windows),包括C的实际功能。
C API描述:
初始化MYSQL结构:mysql_init
建立到服务器连接mysql_real_connect
选择数据库mysql_select_db
查询实施mysql_query
对Select查询返回的结果集处理:
1.mysql_store_result将查询的结果保持到变量result。每次检索一行记录:mysql_use_result
2.检验结果集行数mysql_num_rows
3.检验结果集列数mysql_num_fields
4.从结果集读取一行记录mysql_fetch_row
5.返回字段属性详细信息,如字段名,类型,长度mysql_fetch_field
6.返回MYSQL_FIELD结构的数组,每个字段针对一个结果集合mysql_fetch_fields
7.使用完后,要释放结果集变量空间mysql_free_result
INSERT、UPDATE、DELETE等操作的结果处理:
返回受影响的记录数mysql_affected_rows
涉及结果集处理的辅助函数:
跳至该具体行mysql_row_seek
跳至该行具体列mysql_field_seek
返回字段列表中字段游标当前位置mysql_row_tell
返回结果集中行游标当前位置mysql_field_tell
当前行的字段值长度mysql_fetch_lengths
返回产生AUTO_INCREMENT字段的最后ID
错误处理:
错误号mysql_errno
错误信息mysql_error
关闭连接:mysql_close
4.2.2封装C API
我们分别使用Database类、DBInterface类、Field类、QueryResult类、QueryResultMysql类封装了MySQL数据库的功能。
Database类:主要负责初始化MySQL结构以及建立到服务器的连接。
DBInterface类:是Database类的子类,负责初始化MySQL结构以及建立到服务器的连接。
Field类:主要负责对数据库白表中内容的操作。
QueryResult类:主要负责对查询结果的存储以及操作。
QueryResultMysql类:是QueryResult类的子类,负责对查询结果的存储以及操作。
MySQL性能测试
ODBC API
通过索引读取200万行:528秒
插入35万行:750秒
C API
通过索引读取200万行:412秒
插入35万行:435秒
其它数据库(以MS_SQl为例,WINNT环境)
通过索引读取200万行:1634秒
插入35万行:4012秒
注:以上数据是多次测量的平均值,不可避免一定的误差,仅供参考。
chap5数据类型和运算符
5.1MySQL数据类型介绍
MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。
5.1.1整数类型
MySQL中的数值类型:
类型名称,说明,存储需求
TINYINT,很小的整数,1个字节
SMALLINT,小的整数,2个字节
MEDIUMINT,中等大小的整数,3个字节
INT(INTEGER),普通大小的整数,4个字节
BIGINT,大整数,8个字节
不同整数类型的取值范围:
数值类型,有符号,无符号
TINYINT,-128~127,0~255
SMALLINT,-32768~32767,0~65535
MEDIUMINT,-8388608~8388607,0~16777215
INT(INTEGER),-2147483648~2147483647,0~4294967295
BIGINT,-9223372036854775808~9223372036854775807,0~18446744073709551615
显示宽度和数据类型的取值范围是无关的。
5.1.2浮点数类型和定点数类型
MySQL中使用浮点数和定点数来表示小数。
MySQL中的小数类型:
类型名称,说明,存储需求
FLOAT,单精度浮点数,4个字节
DOUBLE,双精度浮点数,8个字节
DECIMAL(M,D),DEC,压缩的“严格”定点数,M+2个字节
5.1.3日期和时间类型
5.1.4字符串类型
还可以存储其他数据,比如图片和声音的二进制数据。
MySQL中的字符串数据类型
类型名称,说明,存储需求
CHAR(M),固定长度非二进制字符串
VARCHAR(M),变长非二进制字符串
5.1.5二进制类型
第6章 嵌入式MySQL
6.3.2最常用的函数
MySQL C API支持的函数至少有65个。其中有一部分已经过时了。
MySQL C API(libmysqld)里最常用的函数
函数,说明
mysql_server_init,对嵌入式服务器库进行初始化
mysql_init,启动服务器
mysql_options用来改变或设置服务器选项
mysql_debug启用调试跟踪文件(DBUG)
mysql_rel_connect与嵌入式服务器建立连接
mysql_query发出一个查询命令(SQL语句),其格式为一个以空字符(null)结尾的字符串
mysql_store_results检索最后一个查询命令的结果
mysql_fetch_row返回结果集里的某一行
mysql_num_fields返回结果集里的列(字段)个数
mysql_num_rows返回结果集里的行(记录)个数
mysql_error返回一条出错消息(字符串),它描述的是最近发生的那个错误
mysql_errno返回一个出错代码,它对应于最近发生的那个错误
mysql_free_result释放分配给指定结果集的内存
mysql_close关闭与服务器的连接
mysql_server_end对嵌入式服务器库进行关机处理,然后关闭服务器
MySQL C API
数据类型包括:
数据库连接句柄MYSQL
查询返回结果集MYSQL_RES
行集MYSQL_ROW
字段信息MYSQL_FIELD
字段表的偏移量MYSQL_FIELD_OFFSET
自定义的无符号整型数my_ulonglong
函数包括:
mysql_query最为重要,能完成绝大部分的数据库操控
CDatabase类
建立初始化MySQL对象
构造函数mysql_init(&mysql)
私有成员MYSQL mysql;数据库连接句柄
结构体Database_Param中存放数据库参数,包括主机名、用户名、密码、数据库名等。
mysql_real_connect
返回值表示连接成功还是失败
对数据库进行加锁、解锁
LOCK TABLES
UNLOCK TABLES
mysql_query
数据库操作
增insert into
mysql_query
关闭数据库连接
析构函数
if(query)
mysql_free_result(query);
mysql_close(&mysql);
MYSQL_RES *query;结果集


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值