show create database 数据库名;和 show create table 表名;分别用来显示创建特定数据库或表的MySQL语句;
show grants;用来显示授权用户(所有用户或特定用户)的安全权限;
show errors;和show warnings;用来显示服务器错误或警告消息;
忘记一条SQL指令用法时,使用help 指令名来进行帮助!!!!
MySQL5支持一个新的INFORMATION_SCHEMA命令,可以用它来获得和过滤模式信息。information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。用法:select * from INFORMATION_SCHEMA.TABLES;
mysql> SELECT *
-> FROM caiji;
+------+--------+------+-------+-------+
| id | name | age | score | grade |
+------+--------+------+-------+-------+
| 1 | Curry | 31 | 96 | 09年 |
| 2 | Durant | 30 | 97 | 08年 |
| 3 | James | 34 | 99 | 03年 |
| 4 | Zion | 19 | 81 | 新秀 |
+------+--------+------+-------+-------+
4 rows in set (0.00 sec)
5.检索不同的行
mysql> SELECT name
-> FROM caiji;
+--------+
| name |
+--------+
| Curry |
| Durant |
| James |
| Zion |
| Curry |
+--------+
5 rows in set (0.00 sec)
mysql> SELECT DISTINCT name
-> FROM caiji;
+--------+
| name |
+--------+
| Curry |
| Durant |
| James |
| Zion |
+--------+
4 rows in set (0.06 sec)
mysql> SELECT name
-> FROM caiji
-> LIMIT 1, 4;
+--------+
| name |
+--------+
| Durant |
| James |
| Zion |
| Curry |
+--------+
4 rows in set (0.00 sec)
mysql> SELECT caiji.name
-> FROM caiji;
+--------+
| name |
+--------+
| Curry |
| Durant |
| James |
| Zion |
| Curry |
+--------+
5 rows in set (0.00 sec)
mysql> SELECT caiji.name
-> FROM dalao.caiji;
+--------+
| name |
+--------+
| Curry |
| Durant |
| James |
| Zion |
| Curry |
+--------+
5 rows in set (0.00 sec)
第五章 排序检索数据
1.排序数据
下面的SQL语句返回某个数据库表的单个列,注意看到它的输出并没特定的顺序。
mysql> SELECT age
-> FROM njust;
+------+
| age |
+------+
| 12 |
| 15 |
| 14 |
| 13 |
| 12 |
+------+
5 rows in set (0.00 sec)
mysql> SELECT name, age
-> FROM njust
-> WHERE age = 12;
+------+------+
| name | age |
+------+------+
| 小明 | 12 |
| 小度 | 12 |
+------+------+
2 rows in set (0.09 sec)
检查WHERE name = "小明"语句,它返回name的值是“小明”的行。MySQL在执行匹配时默认不区分大小写,所以A与a相同的。
mysql> SELECT name, age
-> FROM njust
-> WHERE name = "小明"
+------+------+
| name | age |
+------+------+
| 小明 | 12 |
+------+------+
1 row in set (0.05 sec)
下面的例子是列出年龄age大于12的所有同学:
mysql> SELECT name, age
-> FROM njust
-> WHERE age > 12;
+------+------+
| name | age |
+------+------+
| 大雄 | 15 |
| 静香 | 14 |
| 胖虎 | 13 |
+------+------+
3 rows in set (0.00 sec)
2.2 不匹配检查
下面的例子是列出年龄age不是18岁的所有同学:
mysql> SELECT name, age
-> FROM njust
-> WHERE age <> 18; // <>与!=等价的!
+------+------+
| name | age |
+------+------+
| 小明 | 12 |
| 大雄 | 15 |
| 静香 | 14 |
| 胖虎 | 13 |
| 小度 | 12 |
+------+------+
5 rows in set (0.00 sec)
mysql> SELECT name, age
-> FROM njust
-> WHERE age = 12 AND id <= 3;
+------+------+
| name | age |
+------+------+
| 小明 | 12 |
+------+------+
1 row in set (0.09 sec)
mysql> SELECT id, name, age
-> FROM njust
-> WHERE id = 1 OR id = 3;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小明 | 12 |
| 3 | 静香 | 14 |
+----+------+------+
2 rows in set (0.00 sec)
mysql> SELECT id, name, age
-> FROM njust
-> WHERE id = 2 or id = 3 AND age < 12;
+----+------+------+
| id | name | age |
+----+------+------+
| 2 | 大雄 | 15 |
+----+------+------+
1 row in set (0.00 sec)
mysql> SELECT id, name, age
-> FROM njust
-> WHERE id IN (1, 3)
-> ORDER BY name;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小明 | 12 |
| 3 | 静香 | 14 |
+----+------+------+
2 rows in set (0.00 sec)
mysql> SELECT id, name, age
-> FROM njust
-> WHERE id = 1 OR id = 3
-> ORDER BY name;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 小明 | 12 |
| 3 | 静香 | 14 |
+----+------+------+
2 rows in set (0.00 sec)
mysql> SELECT id, name, age
-> FROM njust
-> WHERE id NOT IN (1,3)
-> ORDER BY name;
+----+------+------+
| id | name | age |
+----+------+------+
| 2 | 大雄 | 15 |
| 5 | 小度 | 12 |
| 4 | 胖虎 | 13 |
+----+------+------+
3 rows in set (0.00 sec)
mysql> SELECT name
-> FROM caiji
-> WHERE name LIKE '%ur%';
+--------+
| name |
+--------+
| Curry |
| Durant |
| Curry |
+--------+
3 rows in set (0.00 sec)
通配符也可出现在搜索模式的中间,但是这样做不太有用。注意除了一个或多个字符外,%还可以匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。注意尾空格,尾部空格可能会干扰通配符的匹配。例如在保存词curry时,如果它后面有一个或多个空格,则子句WHERE name LIKE '%curry’将不会匹配它们,因为在最后的y后有多余的字符。解决的方法是在搜索模式后加一个%。
注意NULL,**虽然似乎%通配符可以匹配任何东西,但是也有例外,即NULL。**即使是WHERE name LIKE '%'也不能匹配用值为NULL的行。
mysql> SELECT name
-> FROM caiji
-> WHERE name REGEXP 'Curry'
-> ORDER BY name;
+-------+
| name |
+-------+
| Curry |
| Curry |
+-------+
2 rows in set (0.04 sec)
mysql> SELECT name
-> FROM caiji
-> WHERE name REGEXP '.ur';
+--------+
| name |
+--------+
| Curry |
| Durant |
| Curry |
+--------+
3 rows in set (0.00 sec)
mysql> SELECT name
-> FROM caiji
-> WHERE name LIKE 'ur';
Empty set (0.00 sec)
REGEXP语句
mysql> SELECT name
-> FROM caiji
-> WHERE name REGEXP 'ur';
+--------+
| name |
+--------+
| Curry |
| Durant |
| Curry |
+--------+
3 rows in set (0.00 sec)
匹配不区分大小写,MySQL中的正则表达式匹配不区分大小写,为了区分大小写,可以使用BINARY关键字,如WHERE name REGEXP BINARY ‘UR.’;
2.2 进行OR匹配
为了搜索两个串之一(或者这个,或者另一个串),使用|,如下所示:
mysql> SELECT name
-> FROM caiji
-> WHERE name REGEXP 'ur|me' // 中间不能有空格!!!
-> ORDER BY name;
+--------+
| name |
+--------+
| Curry |
| Curry |
| Durant |
| James |
+--------+
4 rows in set (0.00 sec)
2.3 匹配几个字符之一
匹配任何单一字符。但是,只想匹配特定的字符时。可以通过指定一组用[]括起来的字符来完成。如下所示:
mysql> SELECT name
-> FROM caiji
-> WHERE name REGEXP '[CDZ]'
-> ORDER BY name;
+--------+
| name |
+--------+
| Curry |
| Curry |
| Durant |
| Zion |
+--------+
4 rows in set (0.00 sec)
mysql> SELECT Concat(name, ' (',score, ')') AS player_info
-> FROM caiji
-> ORDER BY name;
+-------------+
| player_info |
+-------------+
| Curry (96) |
| Curry (78) |
| Durant (97) |
| James (99) |
| Zion (81) |
+-------------+
5 rows in set (0.05 sec)
4.执行算术计算
计算字段的另一个常见的用途:是对检索出来的数据进行算术计算。
mysql> SELECT name, age, score, age * score AS total
-> FROM caiji
-> WHERE id = 1;
+-------+------+-------+-------+
| name | age | score | total |
+-------+------+-------+-------+
| Curry | 31 | 96 | 2976 |
+-------+------+-------+-------+
1 row in set (0.11 sec)
// Upper()函数:将文本转换成大写
mysql> SELECT name, UPPER(name) AS name_upper
-> FROM caiji
-> ORDER BY name;
+--------+------------+
| name | name_upper |
+--------+------------+
| Curry | CURRY |
| Curry | CURRY |
| Durant | DURANT |
| James | JAMES |
| Zion | ZION |
+--------+------------+
5 rows in set (0.06 sec)
// SQL中年月日的写法:2005-09-01
SELECT id, num
FROM orders
WHERE DATE(order_date) = '1992-10-21';
如果你想要查询2005年9月的所有订单,可以使用下面两种SQL语句:
SELECT id, num
FROM orders
WHERE DATE(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
// 或者
SELECT id, num
FROM orders
WHERE Year(order_date) = 2005 AND
Month(order_date) = 9;
mysql> SELECT AVG(age) AS age_avg
-> FROM caiji;
+---------+
| age_avg |
+---------+
| 28.4000 |
+---------+
1 row in set (0.12 sec)
mysql> SELECT AVG(age) AS age_avg
-> FROM caiji
-> WHERE id = 1;
+---------+
| age_avg |
+---------+
| 31.0000 |
+---------+
1 row in set (0.00 sec)
1.2 COUNT()函数
a.COUNT(*):对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
b.COUNT(column):对特定列中具有值得行进行计数,忽略值为NULL的行。
mysql> SELECT COUNT(*) AS num
-> FROM caiji;
+-----+
| num |
+-----+
| 5 |
+-----+
1 row in set (0.06 sec)
mysql> SELECT COUNT(age) AS num_age
-> FROM caiji;
+---------+
| num_age |
+---------+
| 5 |
+---------+
1 row in set (0.00 sec)
1.3 MAX()函数
MAX():返回指定列中最大的值,忽略值为NULL的行。
mysql> SELECT MAX(age) AS max_age
-> FROM caiji;
+---------+
| max_age |
+---------+
| 34 |
+---------+
1 row in set (0.11 sec)
1.4 MIN()函数
MIN():返回指定列中最小的值,忽略列值为NULL的行。
mysql> SELECT MIN(score) AS min_score
-> FROM caiji;
+-----------+
| min_score |
+-----------+
| 78 |
+-----------+
1 row in set (0.00 sec)
1.5 SUM()函数
SUM():用来返回指定列值的和(总计),SUM()函数忽略列值为NULL的行。
mysql> SELECT SUM(age) AS sum_age
-> FROM caiji
-> WHERE id = 1;
+---------+
| sum_age |
+---------+
| 31 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT SUM(age*score) AS num
-> FROM caiji
-> WHERE id = 1;
+------+
| num |
+------+
| 2976 |
+------+
1 row in set (0.08 sec)