MySQL的使用和学习(二)

本文介绍了MySQL数据库的基础操作,包括查看数据库、表、表结构,显示创建表的语句,执行查询,以及如何利用自增长、外键、变量等功能进行高效数据管理。通过实例演示了如何使用SQL进行复杂查询,如按条件筛选、分组聚合数据等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值