事先给出官方文档的地址,文中没有提到或者还有疑惑的可以直接看文档。3.1 Connecting to and Disconnecting from the Serverdev.mysql.com
1.连接和断开服务器
shell> mysql -h host -u user -p
Enter password: ********
host和user表示运行MySQL服务器的主机名和MySQL帐户的用户名。替换适合您的设置的值。该********代表你的密码;当Enter password:提示时输入它。
如果您在运行MySQL的同一台计算机上登录,则可以省略主机,只需使用以下命令:
# user我会直接写为root
shell> mysql -u user -p
shell> mysql -uroot -p
成功连接后,您可以通过在提示符下键入QUIT(或\q)来随时断开连接mysql>:
mysql> QUIT
Bye
2. 输入查询
这是一个简单的查询,要求服务器告诉您它的版本号和当前日期。按照mysql>提示输入如下所示输入,然后按Enter键。
mysql> SELECT VERSION(), CURRENT_DATE;
值得一提的是,我们可以在一行中输入多个语句。用分号结束每一个
mysql> SELECT VERSION(); SELECT NOW();
如果您决定不想执行正在输入的查询,请键入\c以下内容取消它,c要小写。
3.使用数据库和分配权限创建一个数据库
创建一个表
将数据加载到表中
以各种方式从表中检索数据
使用多个表
3.1 查找当前存在的数据库
mysql> SHOW DATABASES;
您可能应该要求您的MySQL管理员允许使用您自己的数据库。
3.2 给数据库分配用户,分配权限,由于库中已经存在用户,就不再新建用户及权限了,然后root这个用户拥有数据库所有权限:
# test是数据库名,root是用户名,1234567是用户密码
mysql>grant all privileges on test.* to 'root'@'%' identified by '1234567'with grant option;
#对用户做了权限变更之后,一定记得重新加载一下权限,将权限信息从内存中写入数据库。
mysql> flush privileges;
3.3 给具体用户分配数据库具体数据表的权限
mysql>grant update on test.table to 'root'@'%';
Query OK,0 rows affected (0.08 sec)
3.4 新建用户
mysql>create user 'newuser'@'%' identified by '12345678';
Query OK,0 rows affected (0.08 sec)
4.创建和选择数据库
mysql> CREATE DATABASE menagerie;
数据库名称是区分大小写的。
创建数据库不会选择它使用; 你必须明确地这样做。要创建menagerie当前数据库,请使用以下语句:
mysql> USE menagerie
Database changed
您的数据库只需创建一次,但每次开始
shell> mysql -h host -u user -p menagerie
Enter password: ********
您可以随时查看当前选择使用哪个数据库。
SELECT DATABASE();
5.创建表
创建数据库很容易,但此时它是空的
mysql> SHOW TABLES;
Empty set (0.00 sec)
更难的部分是决定数据库的结构应该是什么:您需要哪些表以及每个表中应该包含哪些列。下面由我们来创建一张新的表,新建一张表之前很有必要想清楚存储再数据库中的数据最好能够避免重复修改,例如我们可以将纪录年龄代替为记录出生日期。
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
因为列值的长度不同。这些列定义中的长度不必全部相同,也不必相同。
要验证您的表是否按预期方式创建,请使用以下
mysql>DESCRIBE pet;
您可以随时使用
6.将数据加载到表中
您可以创建一个文本文件pet.txt ,每行包含一个记录,其值由制表符分隔,并按照NULL 值。要在文本文件中表示这些,请使用 \N(反斜杠,大写-N)。例如,惠斯勒鸟的记录看起来像这样(值之间的空格是单个制表符):
Whistler Gwen bird \N 1997-12-09 \N
要将文本文件加载pet.txt到 pet表中,请使用以下语句:
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
个人认为导入大量数据还是使用管理工具比较好,像我用的是navicat。
如果要一次添加一条新记录,该
mysql> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
NULL直接插入以表示缺失值。
7.从表中检索信息
select from where group by having order by这个可以当做搜索命令从简单到复杂的顺序吧。
7.1 选择所有数据
mysql> SELECT * FROM pet;使用
7.2 选择特定行
mysql> SELECT * FROM pet WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
字符串比较通常不区分大小写,因此您可以将名称指定为'bowser','BOWSER'等等。查询结果是一样的。
直接举例出多种搜索方式
mysql> SELECT * FROM pet WHERE birth >= '1998-1-1'; #1998年或之后出生的动物
mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f'; #定位雌性狗
mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';#or操作
mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')
-> OR (species = 'dog' AND sex = 'f');
and并且 or可以混合,但 and优先级高于or。如果您同时使用这两个运算符,最好使用括号明确指出条件应如何分组。
7.3 选择特定列
# 如果您想知道您的动物何时出生,请选择name和birth列:
mysql>SELECT name, birth FROM pet;
要找出谁拥有宠物,请使用此查询:
mysql> SELECT owner FROM pet
查询只是owner从每条记录中检索列,其中一些列出现不止一次。要最小化输出,请通过添加关键字检索每个唯一的输出记录一次DISTINCT:
mysql> SELECT DISTINCT owner FROM pet;
您可以使用WHERE子句将行选择与列选择组合在一起。例如,要仅获取狗和猫的出生日期,请使用以下查询:
mysql> SELECT name, species, birth FROM pet
-> WHERE species = 'dog' OR species = 'cat';
7.4 排序行
mysql> SELECT name, birth FROM pet ORDER BY birth;
默认排序顺序为升序,首先是最小值。要按反向(降序)顺序排序,请将DESC关键字添加到要排序的列的名称:
mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
可以针对多个列进行排序,并且可以按不同方向对不同列进行排序。
mysql> SELECT name, species, birth FROM pet
-> ORDER BY species, birth DESC;
该DESC关键字仅适用于紧邻其前面的列名(birth);它不会影响species列排序顺序。
7.8 日期计算
mysql> SELECT name, birth, CURDATE(),
-> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
-> FROM pet;
查询有效,但如果以某种顺序显示行,则可以更轻松地扫描结果。这可以通过添加一个ORDER BY name子句来按名称对输出进行排序来完成:
mysql> SELECT name, birth, CURDATE(),
-> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
-> FROM pet ORDER BY name;
提取日期中的年月日
YEAR(), MONTH()和DAYOFMONTH()
mysql> SELECT name, birth, MONTH(birth) FROM pet;
我们也可以换种思路来找到5月分出生的动物。
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
7.9模式匹配
MySQL提供标准的SQL模式匹配以及基于类似于Unix实用程序(如vi,grep和sed)使用的扩展正则表达式的模式匹配形式。在MySQL中,SQL模式默认情况下不区分大小写。这里显示了一些例子。不要使用=或<>使用SQL模式时。请改用
like关键词的使用
要查找以下开头的名称b:
mysql> SELECT * FROM pet WHERE name LIKE 'b%';
要查找以以下结尾的名称fy:
mysql> SELECT * FROM pet WHERE name LIKE '%fy';
要查找包含名称w:
mysql> SELECT * FROM pet WHERE name LIKE '%w%';
要查找包含五个字符的name,请使用_模式字符的五个实例:
mysql> SELECT * FROM pet WHERE name LIKE '_____';
扩展正则表达式
MySQL提供的另一种模式匹配使用扩展的正则表达式。以下列表描述了扩展正则表达式的一些特征:. 匹配任何单个字符。
字符类[...]匹配括号内的任何字符。例如, [abc]匹配a, b或c。要命名一系列字符,请使用短划线。[a-z] 匹配任何字母,而[0-9] 匹配任何数字。
*匹配前面的事物的零个或多个实例。例如,x* 匹配任意数量的x字符, [0-9]*匹配任意数量的数字,并.*匹配任意数量的任何数字。
如果模式匹配正在测试的值中的任何位置,则正则表达式模式匹配成功。(这与
锚定的图案,使得它必须在值的开头或结尾匹配正在测试中,使用^在一开始或$在图案的端部。
要查找以...开头的名称b,请使用^以匹配名称的开头:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');
要强制将正则表达式比较区分大小写,请使用区分大小写的排序规则,或使用c匹配控制字符。这些查询中的每b一个在名称的开头仅匹配小写:
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);
SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');
要查找以?结尾的名称fy,请使用$以匹配名称的结尾:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');
要查找包含a的名称w,请使用以下查询:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w');
统计行
count(*)计算行数
mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+
GROUP BY跟COUNT(*)配合使用
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Benny | 2 |
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+--------+----------+
使用多个表
该pet表记录了您拥有的宠物。如果您想记录有关它们的其他信息,例如生活中的事件,例如兽医的访问或者出生时,您需要另一张桌子。这张桌子应该是什么样的?它需要包含以下信息:宠物名称,以便您了解每个事件所属的动物。
日期,以便您知道事件发生的时间。
描述事件的字段。
如果您希望能够对事件进行分类,则为事件类型字段。
鉴于这些注意事项, 表的CREATE_TABLE语句event可能如下所示:
mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
-> type VARCHAR(15), remark VARCHAR(255));
与pet表一样,最简单的方法是通过创建包含以下信息的制表符分隔文本文件来加载初始记录。
mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;
根据您从pet表中运行的查询中学到的内容,您应该能够对event表中的记录执行检索;原则是一样的。但是,event表格本身何时不足以回答您可能会问的问题?
假设你想要找出每只宠物的窝的年龄。我们之前看到过如何计算两个日期的年龄。母亲的垃圾日期在event表格中,但要计算她在该日期的年龄,您需要她的出生日期,该日期存储在pet表格中。这意味着查询需要两个表:
mysql> SELECT pet.name,
-> TIMESTAMPDIFF(YEAR,birth,date) AS age,
-> remark
-> FROM pet INNER JOIN event
-> ON pet.name = event.name
-> WHERE event.type = 'litter';
+--------+------+-----------------------------+
| name | age | remark |
+--------+------+-----------------------------+
| Fluffy | 2 | 4 kittens, 3 female, 1 male |
| Buffy | 4 | 5 puppies, 2 female, 3 male |
| Buffy | 5 | 3 puppies, 3 female |
+--------+------+-----------------------------+
有关此查询的注意事项有以下几点:
该FROM子句连接两个表,因为查询需要从两个表中提取信息。
组合(连接)来自多个表的信息时,需要指定一个表中的记录如何与另一个表中的记录匹配。这很容易,因为它们都有一个name列。该查询使用ON子句根据值匹配两个表中的记录name。
该查询使用a INNER JOIN来组合表。一个INNER JOIN或者从表许可证行当且仅当两个表满足所规定的条件,以显示在结果 ON子句。在这个例子中, ON子句指定 name列中的 pet表必须的匹配 name列 event表。如果名称出现在一个表中但不出现在另一个表中,则该行不会出现在结果中,因为该ON 子句中的条件失败。
由于name列出现在两个表中,因此您必须具体说明引用该列时的表。这是通过将表名添加到列名称来完成的。
您不需要两个不同的表来执行连接。如果要将表中的记录与同一表中的其他记录进行比较,有时将表连接到自身会很有用。例如,要在您的宠物中找到繁殖对,您可以pet自己加入表格,以生成类似物种的男性和女性候选对:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
-> FROM pet AS p1 INNER JOIN pet AS p2
-> ON p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm';
+--------+------+--------+------+---------+
| name | sex | name | sex | species |
+--------+------+--------+------+---------+
| Fluffy | f | Claws | m | cat |
| Buffy | f | Fang | m | dog |
| Buffy | f | Bowser | m | dog |
+--------+------+--------+------+---------+
在此查询中,我们为表名指定别名以引用列,并保持每个列引用与表关联的表的实例。
更深入的会另开一章
happy hacking!