1.查看数据库, 查看表, 查看表结构
mysql> show databases;
mysql> use newtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select DATABASE();
+------------+
| DATABASE() |
+------------+
| newtest |
+------------+
1 row in set (0.00 sec)
mysql> show tables;
mysql> desc 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 | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.04 sec)
对表结构中出现的列字段的解释:
1.Field 表示列名, Type表示列的数据类型
2.NULL表示是否这个列能够包含值为NULL的数据
3.key表示是否在这个列上建立索引,当我们创建表的时候,制定某一列为主键自增长,那么将自动会为这列加上索引。
4.Default指定列的默认值
5.Extra表示列的特殊信息,如果创建一个列使用
AUTO_INCREMENT(自增长)选项,那么这列的此处值为
auto_increment,而不是空。
2.显示创建表的语句
mysql> show create table pet\G;
*************************** 1. row ***************************
Table: pet
Create Table: CREATE TABLE `pet` (
`name` varchar(20) DEFAULT NULL,
`owner` varchar(20) DEFAULT NULL,
`species` varchar(20) DEFAULT NULL,
`sex` char(1) DEFAULT NULL,
`birth` date DEFAULT NULL,
`death` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
执行这个命令,你需要有操作表的权限,还可以这样写
mysql> show create table pet;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| pet | CREATE TABLE `pet` (
`name` varchar(20) DEFAULT NULL,
`owner` varchar(20) DEFAULT NULL,
`species` varchar(20) DEFAULT NULL,
`sex` char(1) DEFAULT NULL,
`birth` date DEFAULT NULL,
`death` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
3.mysql在批处理中的使用(Using mysql in batch mode)
shell脚本的使用(稍后会补上)
4.mysql的查询
mysql> select * from person;
+-------+----------+--------------------+------+------------+------------+
| name | password | email | age | createTime | deleteTime |
+-------+----------+--------------------+------+------------+------------+
| evan | 123456 | 12345678@qq.com | 21 | 2010-01-01 | 2010-10-10 |
| ovan | 123456 | 23456789@qq.com | 23 | 2012-03-15 | NULL |
| kevin | 123456 | 34567890@qq.com | 22 | 2012-03-18 | NULL |
| kvan | 123456 | 34567890@qq.com | 18 | 2012-02-15 | NULL |
| kvan | 123456 | 34567890@qq.com | 26 | 2012-04-18 | NULL |
| NULL | 111111 | 345678901@sina.com | 24 | 2014-01-10 | NULL |
+-------+----------+--------------------+------+------------+------------+
6 rows in set (0.02 sec)
mysql> select max(age) AS age from person;
+------+
| age |
+------+
| 26 |
+------+
1 row in set (0.03 sec)
mysql> select min(age) AS age from person;
mysql> select avg(age) AS age from person;
mysql> select sum(age) AS age from person;
1)找出person表中年龄最大的那一条记录的信息
//使用子查询的方式实现
mysql> select * from person
-> where age = ( select max(age) from person);
+------+----------+-----------------+------+------------+------------+
| name | password | email | age | createTime | deleteTime |
+------+----------+-----------------+------+------------+------------+
| kvan | 123456 | 34567890@qq.com | 26 | 2012-04-18 | NULL |
+------+----------+-----------------+------+------------+------------+
1 row in set (0.00 sec)
//使用左外连接的方式实现
mysql> select p1.*
-> from person p1 left join person p2 on p1.age < p2.age
-> where p2.age is null;
+------+----------+-----------------+------+------------+------------+
| name | password | email | age | createTime | deleteTime |
+------+----------+-----------------+------+------------+------------+
| kvan | 123456 | 34567890@qq.com | 26 | 2012-04-18 | NULL |
+------+----------+-----------------+------+------------+------------+
1 row in set (0.00 sec)
//对age降序排序,取第一条记录
mysql> select * from person
-> order by age desc
-> limit 1;
+------+----------+-----------------+------+------------+------------+
| name | password | email | age | createTime | deleteTime |
+------+----------+-----------------+------+------------+------------+
| kvan | 123456 | 34567890@qq.com | 26 | 2012-04-18 | NULL |
+------+----------+-----------------+------+------------+------------+
1 row in set (0.00 sec)
//使用group by 完成
mysql> select p1.name,p1.password,p1.email,p1.age,p1.createTime,p1.deleteTime
-> from person p1, person p2 -> group by p1.name,p1.password,p1.email,p1.age,p1.createTime,p1.deleteTime
-> having max(p2.age) = p1.age;+------+----------+-----------------+------+------------+------------+
| name | password | email | age | createTime | deleteTime |
+------+----------+-----------------+------+------------+------------+
| kvan | 123456 | 34567890@qq.com | 26 | 2012-04-18 | NULL |
+------+----------+-----------------+------+------------+------------+
1 row in set (0.02 sec)
*上面第三种方式实现,当年龄最大的人不止一位的时候,它只能取出一条记录
2)找出每一组的最大列
mysql> select * from person;
+-------+----------+--------------------+------+------------+------------+
| name | password | email | age | createTime | deleteTime |
+-------+----------+--------------------+------+------------+------------+
| evan | 123456 | 12345678@qq.com | 21 | 2010-01-01 | 2010-10-10 |
| ovan | 123456 | 23456789@qq.com | 23 | 2012-03-15 | NULL |
| kevin | 123456 | 34567890@qq.com | 22 | 2012-03-18 | NULL |
| kvan | 123456 | 34567890@qq.com | 18 | 2012-02-15 | NULL |
| kvan | 123456 | 34567890@qq.com | 26 | 2012-04-18 | NULL |
| NULL | 111111 | 345678901@sina.com | 24 | 2014-01-10 | NULL |
+-------+----------+--------------------+------+------------+------------+
6 rows in set (0.00 sec)
mysql> select name,max(age) from person
-> group by name;
+-------+----------+
| name | max(age) |
+-------+----------+
| NULL | 24 |
| evan | 21 |
| kevin | 22 |
| kvan | 26 |
| ovan | 23 |
+-------+----------+
5 rows in set (0.00 sec)
3)不使用groupby,列出所有字段(The Rows Holding the Group-wise Maximum of a Certain Column)
mysql> select name,password,email,age from person p1 where age = (select max(p2.age) from person p2 where p1.name = p2.name);
+-------+----------+-----------------+------+
| name | password | email | age |
+-------+----------+-----------------+------+
| evan | 123456 | 12345678@qq.com | 21 |
| ovan | 123456 | 23456789@qq.com | 23 |
| kevin | 123456 | 34567890@qq.com | 22 |
| kvan | 123456 | 34567890@qq.com | 26 |
+-------+----------+-----------------+------+
4 rows in set (0.00 sec)
*和2)结果实现的差异是name是否为null的区别其它实现的方式,上述实现的方式使用的相关子查询的方式,但是这种方式的查询效率比较低,下面两种方式的查询效率高于上面的相关子查询
//使用from子句实现
mysql> select p1.name,p1.password,p1.age
-> from person p1
-> join(
-> select name,max(age) as age from person group by name ) As p2
-> on p1.name = p2.name and p1.age =p2.age;
+-------+----------+------+
| name | password | age |
+-------+----------+------+
| evan | 123456 | 21 |
| ovan | 123456 | 23 |
| kevin | 123456 | 22 |
| kvan | 123456 | 26 |
+-------+----------+------+
4 rows in set (0.00 sec)
//使用左外连接的方式实现
mysql> select p1.name,p1.password,p1.age from person p1 left join person p2 on p1.name = p2.name and p1.age < p2.age where p2.name is null and p1.name is not null;
+-------+----------+------+
| name | password | age |
+-------+----------+------+
| evan | 123456 | 21 |
| ovan | 123456 | 23 |
| kevin | 123456 | 22 |
| kvan | 123456 | 26 |
+-------+----------+------+
4 rows in set (0.00 sec)
5.mysql中使用用户自定义的变量
可以使用MySQL用户变量,而不必在客户端用临时变量存储结果。
mysql> select @min_age:=min(age),@max_age:=max(age) from person;
+--------------------+--------------------+
| @min_age:=min(age) | @max_age:=max(age) |
+--------------------+--------------------+
| 18 | 26 |
+--------------------+--------------------+
1 row in set (0.02 sec)
mysql> select * from person where age = @min_age or age = @max_age;
+------+----------+-----------------+------+------------+------------+
| name | password | email | age | createTime | deleteTime |
+------+----------+-----------------+------+------------+------------+
| kvan | 123456 | 34567890@qq.com | 18 | 2012-02-15 | NULL |
| kvan | 123456 | 34567890@qq.com | 26 | 2012-04-18 | NULL |
+------+----------+-----------------+------+------------+------------+
2 rows in set (0.00 sec)
它也可以在用户变量中存储数据库的对象,例如表或列,然后在SQL语句中使用这个变量的名字;然而,这需要一个准备好的声明中使用。
6.使用外键
mysql> CREATE TABLE people (
-> id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
-> name CHAR(60) NOT NULL,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TABLE shirt (
-> id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
-> style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
-> color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
-> owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.11 sec)
mysql> INSERT INTO people VALUES (NULL, 'Antonio Paz');
Query OK, 1 row affected (0.04 sec)
mysql> SELECT @last := LAST_INSERT_ID();
+---------------------------+
| @last := LAST_INSERT_ID() |
+---------------------------+
| 1 |
+---------------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO shirt VALUES
-> (NULL, 'polo', 'blue', @last),
-> (NULL, 'dress', 'white', @last),
-> (NULL, 't-shirt', 'blue', @last);
Query OK, 3 rows affected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> INSERT INTO people VALUES (NULL, 'Lilliana Angelovska');
Query OK, 1 row affected (0.04 sec)
mysql> SELECT @last := LAST_INSERT_ID();
+---------------------------+
| @last := LAST_INSERT_ID() |
+---------------------------+
| 2 |
+---------------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO shirt VALUES
-> (NULL, 'dress', 'orange', @last),
-> (NULL, 'polo', 'red', @last),
-> (NULL, 'dress', 'blue', @last),
-> (NULL, 't-shirt', 'white', @last);
Query OK, 4 rows affected (0.04 sec)
Records: 4 Duplicates: 0 Warnings: 0
查询插入的数据mysql> select * from people;
+----+---------------------+
| id | name |
+----+---------------------+
| 1 | Antonio Paz |
| 2 | Lilliana Angelovska |
+----+---------------------+
2 rows in set (0.00 sec)
mysql> select * from shirt;
+----+---------+--------+-------+
| id | style | color | owner |
+----+---------+--------+-------+
| 1 | polo | blue | 1 |
| 2 | dress | white | 1 |
| 3 | t-shirt | blue | 1 |
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
| 7 | t-shirt | white | 2 |
+----+---------+--------+-------+
7 rows in set (0.00 sec)
使用外键实现查询mysql> SELECT s.*
-> FROM people p INNER JOIN shirt s ON s.owner = p.id
-> WHERE p.name LIKE 'Lilliana%' AND s.color <> 'white';
+----+-------+--------+-------+
| id | style | color | owner |
+----+-------+--------+-------+
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
+----+-------+--------+-------+
3 rows in set (0.00 sec)
显示建表语句
mysql> SHOW CREATE TABLE shirt\G
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`style` enum('t-shirt','polo','dress') NOT NULL,
`color` enum('red','blue','orange','white','black') NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
7.searching on two keys
or 和 union 和union all的区别
//使用or关键字来实现查询and的操作
SELECT field1_index, field2_index
FROM test_table
WHERE field1_index = '1' OR field2_index = '1'
//使用union查询,默认会去出掉重复的记录
SELECT field1_index, field2_index
FROM test_table WHERE field1_index = '1'
UNION
SELECT field1_index, field2_index
FROM test_table WHERE field2_index = '1';
//不会去除重复的记录,得到的结果是笛卡尔积
SELECT field1_index, field2_index
FROM test_table WHERE field1_index = '1'
UNION ALL
SELECT field1_index, field2_index
FROM test_table WHERE field2_index = '1';
8.计算每天的访问量(Calculating Visits Per Day)
mysql> CREATE TABLE t1 (
-> year YEAR(4),
-> month INT(2) UNSIGNED ZEROFILL,
-> day INT(2) UNSIGNED ZEROFILL
-> );
Query OK, 0 rows affected (0.11 sec)
mysql> INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
-> (2000,2,23),(2000,2,23);
Query OK, 6 rows affected (0.04 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+------+-------+------+
| year | month | day |
+------+-------+------+
| 2000 | 01 | 01 |
| 2000 | 01 | 20 |
| 2000 | 01 | 30 |
| 2000 | 02 | 02 |
| 2000 | 02 | 23 |
| 2000 | 02 | 23 |
+------+-------+------+
6 rows in set (0.01 sec)
表包含的值代表年月日访问用户页面。确定在每个月这些访问发生多少天,使用此查询:
mysql> SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days
-> FROM t1
-> GROUP BY year,month;
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+------+
2 rows in set (0.01 sec)
mysql> SELECT year, month, COUNT(DISTINCT day) AS days
-> FROM t1
-> GROUP BY year,month;
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+------+
2 rows in set (0.00 sec)
9.使用自增长
mysql> CREATE TABLE animals (
-> id MEDIUMINT NOT NULL AUTO_INCREMENT,
-> name CHAR(30) NOT NULL,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.15 sec)
mysql> INSERT INTO animals (name) VALUES
-> ('dog'),('cat'),('penguin'),
-> ('lax'),('whale'),('ostrich');
Query OK, 6 rows affected (0.06 sec)
Records: 6 Duplicates: 0 Warnings: 0
*即使插入的字段没有id,MySQL 会自动分配序列号。我们也可以指定从0开始来生成序列号。因为id字段被声明为not null,因此可以指派null来生成序列号
mysql> select * from animals;
+----+---------+
| id | name |
+----+---------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
| 7 | cat |
+----+---------+
7 rows in set (0.00 sec)
mysql> insert into animals values (null,'peck');
Query OK, 1 row affected (0.03 sec)
mysql> select * from animals;
+----+---------+
| id | name |
+----+---------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
| 7 | cat |
| 8 | peck |
+----+---------+
8 rows in set (0.00 sec)
可以用last_insert_id() SQL函数或mysql_insert_id() C API函数获取最新的auto_increment值。这些功能是特定连接的,所以它们的返回值不会被另一个连接并且执行执行插入操作的影响。mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 8 |
+------------------+
1 row in set (0.00 sec)