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>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 | |
+---------+-------------+------+-----+---------+-------+
把数据加载到表中
- 创建一个文本文件 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未启用本地文件功能
- 如果要一次添加一条新记录,可以用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 |
如果发现有错误
- 编辑文件 pet.txt 以更正错误,然后清空表并使用 DELETE 和 重新加载它 LOAD DATA
mysql> delete from pet
mysql>load data local infile 'pet.txt' INTO TABLE pet;
- 使用UPDATE语句仅修复错误的记录
mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
- 选择特定行
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'); - 选择特定列
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'; - 排序行
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;