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 | [email protected] | 21 | 2010-01-01 | 2010-10-10 | | ovan | 123456 | [email protected] | 23 | 2012-03-15 | NULL | | kevin | 123456 | [email protected] | 22 | 2012-03-18 | NULL | | kvan | 123456 | [email protected] | 18 | 2012-02-15 | NULL | | kvan | 123456 | [email protected] | 26 | 2012-04-18 | NULL | | NULL | 111111 | [email protected] | 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 | [email protected] | 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 | [email protected] | 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 | [email protected] | 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 | [email protected] | 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 | [email protected] | 21 | 2010-01-01 | 2010-10-10 | | ovan | 123456 | [email protected] | 23 | 2012-03-15 | NULL | | kevin | 123456 | [email protected] | 22 | 2012-03-18 | NULL | | kvan | 123456 | [email protected] | 18 | 2012-02-15 | NULL | | kvan | 123456 | [email protected] | 26 | 2012-04-18 | NULL | | NULL | 111111 | [email protected] | 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 | [email protected] | 21 | | ovan | 123456 | [email protected] | 23 | | kevin | 123456 | [email protected] | 22 | | kvan | 123456 | [email protected] | 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 | [email protected] | 18 | 2012-02-15 | NULL | | kvan | 123456 | [email protected] | 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)