第3章 使用MySql
3.1 连接
3.2 选择数据库
首先在登录数据库情况,可以先使用 show databases;展示出有哪些数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| 9 |
| book |
| bookstore |
| db_9griddiary |
| db_database13 |
| hibernate |
| hwp_db |
| jdbc01 |
| mysql |
| onlinexam |
| performance_schema |
| test |
+--------------------+
13 rows in set (0.06 sec)
输入 USE book
输出 Database changed
表示选中了book数据库;
3.3 了解数据库和表
SHOW TABLES; 返回当前选择的数据库内可用表的列表。
输入 SHOW TABLES;
输出
mysql> SHOW TABLES;
+------------------+
| Tables_in_book |
+------------------+
| book_info |
| product_tb |
| tb_studnet_batch |
+------------------+
SHOW也可以用来显示表列:
输入 SHOE COLUMNS FROM book_info;
输出
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(200) | NO | | NULL | |
| price | double | NO | | NULL | |
| bookCount | int(11) | NO | | NULL | |
| author | varchar(45) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
**SHOE COLUMNS ** 要求给出一个表名,它对应每个字段返回一行,行中包含字段名、数据类型、是否允许NULL、键信息、默认值以及其他信息(如字段id的auto_incerement)。
其他的SHOW语句还有:
SHOW STATUS ,用于显示广泛的服务器状态信息;
SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安全权限;
SHOW ERRORS和SHOW WARNINGS,用来显示服务器错误或警告消息;
第4章 检索数据
4.1 SELECT 语句
4.2 检索单个列
输入
SELECT name FROM book_info;
上述语句利用SELECT语句从book_info表中检索一个名name的列。所需的列名在SELECT关键字之后给出,FROM关键字指出从其中检索数据的表名。此语句的输出如下所示:
+----------------------+
| name |
+----------------------+
| JAVAWeb |
| 1111 |
| 名称一 |
| 或者 |
| 名称一 |
| 山月不知心底事 |
| 致我们终将逝去的青春 |
| 平凡的世界 |
| aj |
| 我是作者 |
+----------------------+
未排序数据“如果读者自己试验这个查询,可能会发现显示输出的数据顺序与这里的不同。出现这种情况很正常。如果没有明确排序查询结果(下一章介绍),则返回的数据的顺序没有特殊意义。返回数据的顺序可能是数据被添加到表中的顺序,
也可能不是。只要返回相同数目的行,就是正常的。
结束SQL语句多条SQL语叶心须以分号(;)分隔、MySQL如同多数DBMS一样,不需要在单条SQL语句后加分号。但特定的DBMS可能必须在单条SQL语叶后加上分号。当然,如果愿意可以总是加上分号。事实上,即使不一定需要,但加上分号肯定没有坏处。如果你使用的是mySq1l命令行,必须加上分号来结束SQL语句。
SQL语句和大小写 请注意,SQL语句不区分大小写,因此SELECT与select是相同的.同样,写成Select也没有关系。许多SQL开发人员喜欢对所有SQL关键字使用大写,而对所有列和表名使用小写,这样做使代码更易于阅读和调试
使用空格 在处理SQL语句时,其中所有空格都被忽略。SQL语句可以在一行上给出,也可以分成许多行.多数SQL开发人员认为将SQL语句分成多行更容易阅读和调试。
4.3 检索多个列
要想从一个表中检索多个列,使用相同的SELECT语句。唯一的不同是必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。
当心逗号在选择多个列时,一定要在列名之间加上逗号,但_
最后一个列名后不加。如果在最后一个列名后加了迎号,将出
现错误。
输入
SELECT name ,author FROM book_info;
输出
+----------------------+-----------+
| name | author |
+----------------------+-----------+
| JAVAWeb | b |
| 1111 | c |
| 名称一 | 我的作者 |
| 或者 | 余华 |
| 名称一 | 安安 |
| 山月不知心底事 | 辛夷坞 |
| 致我们终将逝去的青春 | 辛夷坞 |
| 平凡的世界 | 路遥 |
| aj | back back |
| 我是作者 | 中文测试 |
+----------------------+-----------+
4.4 检索所有列
输入 select * from book_info;
分析 如果给定一个通配符(*),则返回表中所有列。列的顺序一般是列在表定义中出现的顺序。但有时候并不是这样的,表的模式的变化(如添加或删除列)可能会导致顺序的变化。
4.5 检索不同的行
使用DISTINCT关键字,返回不同值的列表
输入 SELECT DISTINCT price FROM book_info;
分析 SELECT DISTINCT price告诉MYSQL 只返回不同的price行。
输出
+-------+
| price |
+-------+
| 20.6 |
| 30 |
| 80 |
| 30.5 |
| 35 |
| 40 |
| 58 |
+-------+
4.6 限制结果
SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。
输入 SELECT price FROM book_info LIMIT 5;
分析 此语句使用SELECT语句检索单个列。LIMIT5指示MySQL返回不多于5行
为得出下一个5行,可指定要检索的开始行和行数:
输入 SELECT price FROM book_info LIMIT 5,5;
分析 LIMIT5,5指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数。
索引从0开始~ 在行数不够时,有多少返回多少!
4.7 使用完全限定的表名
使用完全限定的名字来引用列(同时使用表名和列字)
输入 SELECT book_info.name FROM book_info;
表名也可以是完全限定的:
SELECT book_info.name FROM book.book_info;
第5章 排序检索数据
5.1 排序数据
为了明确地排序用SELECT语句检索出的数据,可使用0RDER BY子句。0RDER BY子句取一个或多个列的名字,据此对输出进行排序
输入 select book_info.name FROM book_info ORDER BY name;
输出
+----------------------+
| name |
+----------------------+
| 1111 |
| aj |
| JAVAWeb |
| 名称一 |
| 名称一 |
| 山月不知心底事 |
| 平凡的世界 |
| 我是作者 |
| 或者 |
| 致我们终将逝去的青春 |
+----------------------+
ORDER BY使用非检索的列排序数据是完全合法的。
5.2 按多个列排序
输入 SELECT name ,price,author FROM book_info ORDER BY price,author;
输出
+----------------------+-------+-----------+ | name | price | author | +----------------------+-------+-----------+ | JAVAWeb | 20.6 | b | | 1111 | 30 | c | | 或者 | 30 | 余华 | | 名称一 | 30.5 | 安安 | | 山月不知心底事 | 35 | 辛夷坞 | | 稳稳当当 | 40 | A | | 平凡的世界 | 40 | 路遥 | | 致我们终将逝去的青春 | 40 | 辛夷坞 | | 测试 | 40.5 | 中 | | aj | 58 | back back | | 我是作者 | 58 | 中文测试 | | 名称一 | 80 | 我的作者 | +----------------------+-------+-----------+
上诉例子表示,仅在多个具有相同的price值时才对书本按autor进行排序,如果price列中所有的值都是唯一的,则不会按author排序。
5.3 指定方向排序
数据有升序和降序,为了进行降序排序,必须指定DESC关键字。
输入 SELECT name ,price,author FROM book_info ORDER BY author DESC;
输出
+----------------------+-------+-----------+
| name | price | author |
+----------------------+-------+-----------+
| 致我们终将逝去的青春 | 40 | 辛夷坞 |
| 山月不知心底事 | 35 | 辛夷坞 |
| 平凡的世界 | 40 | 路遥 |
| 名称一 | 80 | 我的作者 |
| 名称一 | 30.5 | 安安 |
| 或者 | 30 | 余华 |
| 我是作者 | 58 | 中文测试 |
| 测试 | 40.5 | 中 |
| 1111 | 30 | c |
| aj | 58 | back back |
| JAVAWeb | 20.6 | b |
| 稳稳当当 | 40 | A |
+----------------------+-------+-----------+
在多列上降序排序 如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。
使用ORDER BY 和LIMIT组合,,能够找出一个列中最高或最低的值。
输入 SELECT price FROM book_info ORDER BY price DESC LIMIT 1;
输出
+-------+
| price |
+-------+
| 80 |
+-------+
分析price DESC保证行是按照由最昂贵到最便宜检索的,而LIMIT1告诉MySQL仅返回一行。
0RDER BY子句的位置“在给出O0RDER BY二句时,应该保证它位于FROM十句之后.如果使用tIMIT,它处须位于0RDER BY之后。使用子句的次序不对将产生错误消息。
第6章 过滤数据
6.1 使用WHERE语句
输入 SELECT name,price,author FROM book_info WHERE price=30;
输出
+------+-------+--------+
| name | price | author |
+------+-------+--------+
| 1111 | 30 | c |
| 或者 | 30 | 余华 |
+------+-------+--------+
分析
这条语句从book_info 表中检索三个列,但不返回所有行,只返回price值为30的行。
WHERE子句的位置在同时使用ORDER BY和WHERE子句时,应该让0RDERBY位于WHERE之后,否则将会产生错误。
6.2 WHERE 语句子句操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | |
!= | |
< | |
<= | |
> | |
>= | |
BETAEEN | |
-
6.2.1 检查单个值
输入
SELECT name,price,author FROM book_info WHERE price <=30;
-
6.2.2 不匹配检查
输入
SELECT name,price,author FROM book_info WHERE price <> 40;
输出
+----------------+-------+-----------+ | name | price | author | +----------------+-------+-----------+ | JAVAWeb | 20.6 | b | | 1111 | 30 | c | | 名称一 | 80 | 我的作者 | | 或者 | 30 | 余华 | | 名称一 | 30.5 | 安安 | | 山月不知心底事 | 35 | 辛夷坞 | | aj | 58 | back back | | 我是作者 | 58 | 中文测试 | | 测试 | 40.5 | 中 | +----------------+-------+-----------+
-
6.2.3 范围值检查
检查范围值,可使用 BETWEEN关键字
输入
SELECT name,price,author FROM book_info WHERE price BETWEEN 20 AND 40;
输出
+----------------------+-------+--------+ | name | price | author | +----------------------+-------+--------+ | JAVAWeb | 20.6 | b | | 1111 | 30 | c | | 或者 | 30 | 余华 | | 名称一 | 30.5 | 安安 | | 山月不知心底事 | 35 | 辛夷坞 | | 致我们终将逝去的青春 | 40 | 辛夷坞 | | 平凡的世界 | 40 | 路遥 | | 稳稳当当 | 40 | A | +----------------------+-------+--------+
- 6.2.4 空值检查
输入
SELECT name,price,author FROM book_info WHERE name IS NULL;
第7章 数据过滤
7.1
7.1.1 AND操作符
输入
SELECT name,price,author,bookCount FROM book_info WHERE bookCount < 40 AND price <50;
输出
+----------------------+-------+--------+-----------+
| name | price | author | bookCount |
+----------------------+-------+--------+-----------+
| JAVAWeb | 20.6 | b | 10 |
| 名称一 | 30.5 | 安安 | 20 |
| DD | 35 | 辛夷坞 | 10 |
| 致我们终将逝去的青春 | 40 | 辛夷坞 | 0 |
| 平凡的世界 | 40 | 路遥 | 0 |
+----------------------+-------+--------+-----------+
7.2 IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
输入
SELECT name,author FROM book_info WHERE price in (30,40,58) ORDER BY name;
输出
+----------------------+-----------+
| name | author |
+----------------------+-----------+
| 1111 | c |
| aj | back back |
| 平凡的世界 | 路遥 |
| 我是作者 | 中文测试 |
| 或者 | 余华 |
| 稳稳当当 | A |
| 致我们终将逝去的青春 | 辛夷坞 |
+----------------------+-----------+
分析
此SELECT语句价格为30、40、58的所有书本信息。IN操作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号中。(IN并不是数学中的区间概念,如30、40、58仅仅是30,40,58)
IN和OR功能相同,如下
输入
SELECT name,author FROM book_info WHERE price=30 OR price=40 OR price=58 ORDER BY name;
IN操作符的优点:
- 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
- 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
- IN操作符一般比0R操作符清单执行更快。
- IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。
7.3 NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所
跟的任何条件。
输入
SELECT name,author FROM book_info WHERE price NOT IN (30,40,58) ORDER BY name;
输出
+---------+----------+
| name | author |
+---------+----------+
| DD | 辛夷坞 |
| JAVAWeb | b |
| 名称一 | 我的作者 |
| 名称一 | 安安 |
| 测试 | 中 |
+---------+----------+
第8章 用通配符进行过滤
8.1 LIKE操作符
8.1.1 百分号(%)通配符
最常使用的通配符是百分号(%)。在搜索中,%表示任何字符出现任意次数。例如,为了找出所有以词名起头的产品,可使用以下SELECT语句:
输入
SELECT * FROM book_info WHERE name LIKE '名%';
输出
+----+--------+-------+-----------+-----------+
| id | name | price | bookCount | author |
+----+--------+-------+-----------+-----------+
| 3 | 名称二 | 80 | 77 | 我的作者 |
| 5 | 名称一 | 30.5 | 20 | 安安 |
| 9 | 名称三 | 58 | 60 | back back |
+----+--------+-------+-----------+-----------+
通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。下面的例子使用两个通配符,它们位于模式的两端:
输入
SELECT * FROM book_info WHERE name LIKE '%的%';
输出
+----+----------------------+-------+-----------+--------+
| id | name | price | bookCount | author |
+----+----------------------+-------+-----------+--------+
| 7 | 致我们终将逝去的青春 | 40 | 0 | 辛夷坞 |
| 8 | 平凡的世界 | 40 | 0 | 路遥 |
+----+----------------------+-------+-----------+--------+
8.1.2 下划线(_)通配符
另一个有用的通配符是下划线(_)。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。
8.2 使用通配符的技巧
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该
使用其他操作符。 - 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用
在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起
来是最慢的。 - 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
第9章 用正则表达式进行搜索
9.1 正则表达式介绍
9.2 使用MySql正则表达式
9.2.1 基本字符匹配
9.2.2 进行OR匹配
输入
SELECT * FROM book_info WHERE bookCount REGEXP '20|60|50' ORDER BY name;
输出
+----+----------+-------+-----------+-----------+
| id | name | price | bookCount | author |
+----+----------+-------+-----------+-----------+
| 2 | 1111 | 30 | 50 | c |
| 5 | 名称一 | 30.5 | 20 | 安安 |
| 9 | 名称三 | 58 | 60 | back back |
| 14 | 我是作者 | 58 | 60 | 中文测试 |
+----+----------+-------+-----------+-----------+
9.2.3 匹配几个字符之一
9.2.4 匹配范围
输入
SELECT * FROM book_info WHERE name REGEXP '[1-6]书名' ORDER BY name;
输出
+----+---------+-------+-----------+--------+
| id | name | price | bookCount | author |
+----+---------+-------+-----------+--------+
| 18 | 2书名字 | 50 | 200 | 作者B |
| 19 | 3书名 | 20 | 63 | 作者C |
| 21 | 5书名 | 20 | 60 | 作者4 |
+----+---------+-------+-----------+--------+
9.2.5 匹配特色字符
例如想找出包含.字符的值,该怎样搜索
输入
SELECT * FROM book_info WHERE name REGEXP '\\.' ORDER BY name;
注意:使用.匹配需要使用两个\进行转义;
9.2.6 匹配字符类
类 | 说明 |
---|---|
[alnum:] | 任意孛母和数子(同[a-ZA-Z0-9]) |
[:alpha:] | 任意字符(同[a-zA-Z]) |
[:blank:] | 空格和制表(同[V\t] |
[:cntrl:] | ASCII控制字符(ASCII0到31和127) |
[:digit:] | 任意数字(同[0-9]) |
[:graph:1] | 与[:print:]相同,但不包括空格 |
[:Lower:] | 任意小写字母(同[a-z]) |
[:print:] | 任意可打印字符 |
[:punct:] | 既不在[:alnum:]又不在[:cntr1l:]中的任意字符 |
9.2.7 匹配多个实例
9.2.8 定位符
第10章 创建计算字段
10.1 计算字段
10.2 拼接字段
在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列。
输入
SELECT Concat(name,'(',price,')') FROM book_info ;
输出
+----------------------------+
| Concat(name,'(',price,')') |
+----------------------------+
| JAVAWeb(20.6) |
| 1111(30) |
| 名称二(80) |
| 或者(30) |
| 名称一(30.5) |
| DD(35) |
| 致我们终将逝去的青春(40) |
| 平凡的世界(40) |
| 名称三(58) |
| 我是作者(58) |
| 稳稳当当(40) |
| 测试(40.5) |
| 1 书名(30) |
| 2书名字(50) |
| 3书名(20) |
| 9书名(37) |
| 5书名(20) |
| 书.名(15) |
+----------------------------+
Rtrim()可以删除数据右侧多余的空格
输入
SELECT Concat(Rtrim(name),'(',Rtrim(price),')') FROM book_info ;
10.3 执行算术计算
total_price 包含单价和数量乘积。
输入
SELECT name,price ,bookCount ,price*bookCount AS total_price FROM book_info;
输出
+----------------------+-------+-----------+-------------+
| name | price | bookCount | total_price |
+----------------------+-------+-----------+-------------+
| JAVAWeb | 20.6 | 10 | 206 |
| 1111 | 30 | 50 | 1500 |
| 名称二 | 80 | 77 | 6160 |
| 或者 | 30 | 40 | 1200 |
| 名称一 | 30.5 | 20 | 610 |
| DD | 35 | 10 | 350 |
| 致我们终将逝去的青春 | 40 | 0 | 0 |
| 平凡的世界 | 40 | 0 | 0 |
| 名称三 | 58 | 60 | 3480 |
| 我是作者 | 58 | 60 | 3480 |
| 稳稳当当 | 40 | 100 | 4000 |
| 测试 | 40.5 | 100 | 4050 |
| 1 书名 | 30 | 60 | 1800 |
| 2书名字 | 50 | 200 | 10000 |
| 3书名 | 20 | 63 | 1260 |
| 9书名 | 37 | 50 | 1850 |
| 5书名 | 20 | 60 | 1200 |
| 书.名 | 15 | 66 | 990 |
+----------------------+-------+-----------+-------------+