mysql连接和断开

mysql -h host -u user -p********   /*建议不要在命令行中输入密码,因为这样做会使其暴露给在您的计算机上登录的其他用户窥探*/
  mysql  -u user -p********          /*登陆自己主机上的服务器*/   
  mysql                              /*允许匿名访问*/

host:主机名
user:用户名
****:密码

出现:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)就是服务器没开

断开输入quit 或者\q

输入查询

mysql>SELECT VERSION();            /*查询版本号*/
  mysql>SELECT CURRENT_DATE;         /*查询时间*/

关键字不区分大小写
mysql 通过查找终止分号来确定语句的结束位置,而不是查找输入行的结尾
/c中断

mysql库支持创建多少表_mysql库支持创建多少表

创建和使用数据库

查询当前存在的数据库

mysql>show databases;
  Database changed

如果您没有该 SHOW DATABASES 权限 ,则不会显示您没有权限的数据库 。

创建一个数据库

mysql>create database mytest;          /*数据库名字区分大小写mytest和MYTEST不一样*/

如果出现 ERROR 1044 (42000): Access denied for user 'micah'@'localhost' to database 'menagerie' 说明你没有权限区创建一个数据库

选择一个数据库来使用

mysql>use test      /*假设计算机存在test数据库*/

当然也可以在调用命令行时选择要使用的数据库,如下

mysql -h host -u user -p mytest********

可以随时查看当前选择使用哪个数据库

mysql>SELECT DATABASE();

创建表

创建表后,可以查看数据库中有几个表

mysql>show tables;

使用 CREATE TABLE 语句指定表的布局:

mysql>create table pet (name VARCHAR(20), owner VARCHAR(20),
  mysql>species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

查看表的格式,可以使用DESCRIBE语句:

mysql>DESCRIBE pet;
  +---------+-------------+------+-----+---------+-------+
  | Field   | Type        | Null | Key | Default | Extra |
  +---------+-------------+------+-----+---------+-------+
  | name    | varchar(20) | YES  |     | NULL    |       |
  | owner   | varchar(20) | YES  |     | NULL    |       |
  | species | varchar(20) | YES  |     | NULL    |       |
  | sex     | char(1)     | YES  |     | NULL    |       |
  | birth   | date        | YES  |     | NULL    |       |
  | death   | date        | YES  |     | NULL    |       |
  +---------+-------------+------+-----+---------+-------+

把数据加载到表中

  1. 创建一个文本文件 pet.txt ,每行包含一个记录,其值由制表符(tab)分隔,并按照 CREATE TABLE 语句 中列出的顺序给出 。 对于缺失值(例如未知性别或仍然生活的动物的死亡日期),使用 NULL 值。 要在文本文件中表示这些,请使用 \N 反斜杠,大写N(用表格记录宠物们的状况)
    文本文件格式
    xiaohong xiaoniao bird \N 1997-12-09 \N

要将文本文件pet.txt加载到pet表中,如下。

mysql> load data local infile '/path/pet.txt' INTO TABLE pet;(linux环境,windows环境可能会出问题)

如果在linux下还是失败了,则可能是默认情况下MySQL未启用本地文件功能

  1. 如果要一次添加一条新记录,可以用INSERT

假设xiaoming得到了一只名为 “ xiaohong ” 的新小狗 。

mysql> insert into pet
         values ('xiaoming','xiaohong','dog','f','1999-03-30',NULL);

字符串和日期值在此处指定为带引号的字符串。 此外, INSERT 可以 NULL 直接 插入 以表示缺失值。

从表中检索信息

select语句用于从表中提取信息。语句的一般形式为:
SELECT what_to_select /指示您要查看的内容。这可以是列的列表,也可以是表示“所有列”。/
FROM which_table /
指示从哪个表里面检索数据/
WHERE conditions_to_satisfy /
需要满足什么条件*/

选择数据

最简单的形式 SELECT 从表 中 检索所有内容:

mysql> SELECT * FROM pet;

  mysql> SELECT * FROM pet;
  +----------+--------+---------+------+------------+------------+
  | name     | owner  | species | sex  | birth      | death      |
  +----------+--------+---------+------+------------+------------+
  | Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
  | Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
  | Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
  | Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |

如果发现有错误

  1. 编辑文件 pet.txt 以更正错误,然后清空表并使用 DELETE 和 重新加载它 LOAD DATA
    mysql> delete from petmysql>load data local infile 'pet.txt' INTO TABLE pet;
  2. 使用UPDATE语句仅修复错误的记录
    mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
  3. 选择特定行
    mysql>select * from pet where name = 'Bowser';
    可以在任何列上指定条件,而不仅仅是 name
    mysql>select * from pet where birth >= '1998-1-1';
    也可以结合条件来定位雌性狗
    mysql>select * from pet where species = 'dog' and sex = 'f';
    有and就有or
    mysql>select * from pet where species = 'dog' or species = 'snake';
    AND 和 OR 可以混合,但 AND 优先级高于 OR 。 如果同时使用这两个运算符,最好使用括号明确指出条件应如何分组
    mysql>select * from pet where (species = 'cat' AND sex = 'm')
    OR (species = 'dog' AND sex = 'f');
  4. 选择特定列
    mysql>SELECT name, birth FROM pet;
    要找出谁拥有宠物,
    mysql>SELECT owner FROM pet;
    加关键字检索每个唯一的输出记录一次 DISTINCT
    mysql>SELECT DISTINCT owner FROM pet;
    可以使用 WHERE 子句将行选择与列选择组合在一起,例如,要仅获取狗和猫的出生日期,请使用以下查询
    mysql>SELECT birth from pet where pieces = 'dog' or pieces = 'cat';
  5. 排序行
    mysql>select name, birth from pet order by birth; //升序排列
    mysql>select name,birth from pet order by birth DESC; //降序排列
    可以对多个列进行排序,并且可以按不同方向对不同列进行排序。 例如,要按动物类型按升序排序,然后按动物类型中的出生日期按降序排序(同种动物最年轻的动物首先)
    mysql>select name ,birth from pet order by speces ,birth desc;

日期计算

TIMESTAMPDIFF() 它的参数是你想要表达结果的单位,以及两个可以取得差异的日期。例子显示了每只宠物的出生日期,当前日期和年龄。 一个 别名age是用来制造最终输出列标签

mysql> SELECT name, birth, CURDATE(),TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
         FROM pet;

还可以通过添加一个 ORDER BY 子句来对输出进行排序

mysql>SELECT name, birth, CURDATE(),TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
  FROM pet 
  ORDER BY name;

可以使用类似的查询来确定已经死亡的动物的死亡年龄。您可以通过检查死亡值是否为NULL来确定这些动物是哪些。然后,对于那些具有非NULL值的人,计算有生之年:

mysql:SELECT name, birth, death,TIMESTAMPDIFF(YEAR,birth,death) AS age
  FROM pet 
  WHERE death IS NOT NULL 
  ORDER BY age;

MySQL提供了用于提取日期的部分,如一些功能 YEAR() , MONTH() 和 DAYOFMONTH()

mysql>SELECT name, birth, MONTH(birth) FROM pet;

查看下个月生日的宠物(今天是1.27)

mysql>SELECT name ,birth FROM pet WHERE MONTH(birth) = 2;

当然也可以在使用模函数(MOD)将月份值包装为0(如果当前值为12)之后,将当前月份后的下个月加1,以得到下个月:

myql>SELECT name, birth FROM petWHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;

NULL值的使用

测试NULL请使用 IS NULL 和 IS NOT NULL 运算符

模式匹配

SQL模式匹配使您可以使用 _ 匹配任何单个字符并 % 匹配任意数量的字符(包括零个字符)。 在MySQL中,SQL模式默认情况下不区分大小写。

要查找以 b 下列 开头的名称

SELECT * FROM pet where name LIKE 'b%';

要查找以以下结尾的名称 fy

SELECT * FROM pet where name LIKE '%fy';

要查找包含名称 w

SELECT * FROM pet where name LIKE '%w%';

要查找包含五个字符的名称

SELECT * FROM pet where name LIKE '_____';

MySQL提供的另一种模式匹配使用扩展的正则表达式

MySQL提供的另一种模式匹配使用扩展的正则表达式。在测试此类型的模式是否匹配时,请使用REGEXP_LIKE()函数(或REGEXP或RLIKE运算符,它们是REGEXP_LIKE()的同义词)。

* . 匹配任何单个字符。

* 字符类 [...] 匹配括号内的任何字符。 例如, [abc] 匹配 a , b 或 c 。 要命名一系列字符,请使用短划线。 [a-z] 匹配任何字母,而 [0-9] 匹配任何个位数。

* * 匹配前面事物的零个或多个实例。 例如, a* 匹配任意数量的 a 字符, [0-9]* 匹配任意数量的数字,并 .* 匹配任意数量的任何数字。

* 如果模式匹配正在测试的值中的任何位置,则正则表达式模式匹配成功。 (这与 LIKE 模式匹配 不同, 模式匹配仅在模式与整个值匹配时才会成功。)

* 要锚定模式以使其必须与要测试的值的开头或结尾匹配,请使用模式 ^ 的开头或 $ 结尾。

要查找 以b开头的名称

mysql>SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');

要强制将正则表达式比较区分大小写,请使用区分大小写的排序规则,或使用 BINARY 关键字使其中一个字符串成为二进制字符串,或指定 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_LINE(name.'fy$');

要查找包含a的名称

mysql>SELECT * FROM pet WHERE REGEXP_LINE(name.'a');

要查找包含五个字符的名称

mysql>SELECT * FROM pet WHERE REGEXP_LINE(name.'^.....$');

计数行

如果想知道拥有多少只宠物,或者每个所有者拥有多少只宠物,或者您可能进行动物普查操作。COUNT(*)计算行数,因此用于计算动物数量的查询如下所示:

mysql>SELECT COUNT(*) FROM pet;

如果您想知道每个主人有多少宠物,GROUP BY 对每个记录进行分组 owner

mysql>SELECT owner , COUNT(*) FROM pet GROUP BY owner;

动物普查

mysql>SELECT species, COUNT(*) FROM pet GROUP BY species;

性别普查

mysql>SELECT sex, COUNT(*) FROM pet GROUP BY sex;

每种物种和性别组合的动物数量

mysql>SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;

对猫和狗进行人口普查

mysql>SELECT species, sex, COUNT(*) 
  FROM pet
  WHERE species = 'dog' OR species = 'cat'
  GROUP BY species, sex;

使用多个表

宠物发生的事件event

name 	date 	type 	remark
Fluffy 	1995-05-15 	litter 	4 kittens, 3 female, 1 male
Buffy 	1993-06-23 	litter 	5 puppies, 2 female, 3 male
Buffy 	1994-06-19 	litter 	3 puppies, 3 female
Chirpy 	1999-03-21 	vet 	needed beak straightened
Slim 	1997-08-03 	vet 	broken rib
Bowser 	1991-10-12 	kennel 	
Fang 	1991-10-12 	kennel 	
Fang 	1998-08-28 	birthday 	Gave him a new chew toy
Claws 	1998-03-17 	birthday 	Gave him a new flea collar
mysql>CREATE TABLE event (name VARCHAR(20), date DATE,type VARCHAR(15), remark VARCHAR(255));

  mysql>load data local infile 'event.txt' into table event;

  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';
  • 该 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 p1.death IS NULLAND p2.sex = 'm' 
  AND p2.death IS NULL;

获得有关数据库和表的信息

SELECT DATABASE();            //展示目前所选的数据库

  SHOW DATABASE();              //列出所有的数据库

  DESCRIBE pet;                 //描述一个表

查询

建立一个商城可能会用到的表

CREATE TABLE shop (
  article INT UNSIGNED  DEFAULT '0000' NOT NULL,
  dealer  CHAR(20)      DEFAULT ''     NOT NULL,
  price   DECIMAL(16,2) DEFAULT '0.00' NOT NULL,
  PRIMARY KEY(article, dealer));
  INSERT INTO shop VALUES
  (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
  (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

建立表后有以下内容

SELECT * FROM shop ORDER BY article;

  SELECT * FROM shop ORDER BY article;+---------+--------+-------+

| article | dealer | price |
+---------+--------+-------+
|       1 | A      |  3.45 |
|       1 | B      |  3.99 |
|       2 | A      | 10.99 |
|       3 | B      |  1.45 |
|       3 | C      |  1.69 |
|       3 | D      |  1.25 |
|       4 | D      | 19.95 |
+---------+--------+-------+

最大的项目编号

select max(article)as article from shop;

查找最贵商品的数量,经销商和价格

mysql>SELECT article, dealer, price
  FROM shop
  WHERE price=(SELECT MAX(price) FROM shop);

找到每个编号商品的最高价格。

SELECT article, MAX(price) AS price
  FROM   shop
  GROUP BY article
  ORDER BY article;

对于每篇文章,找到价格最贵的经销商或经销商。

SELECT article, dealer, price
  FROM   shop s1
  WHERE  price=(SELECT MAX(s2.price)
  FROM shop s2
  WHERE s1.article = s2.article)
  ORDER BY article;