Skip to content

Mysql

  • SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。

SHOW DATABASES; 列出所有数据库,末尾的分号要加上

其中,information_schemamysqlperformance_schemasys是系统库,不要去改动它们。其他的是用户创建的数据库。

  • 创建一个新数据库: CREATE DATABASE test;
  • 删除一个数据库: DROP DATABASE test;,删除一个数据库将导致该数据库的所有表全部被删除。
  • 切换为当前数据库:USE test;

  • 列出当前数据库的所有表: SHOW TABLES;
  • 查看一个表的结构: DESC students;
  • 查看创建表的SQL语句:SHOW CREATE TABLE students;
  • 删除表: DROP TABLE students;
sql
CREATE TABLE `students` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`class_id` bigint(20) NOT NULL,
`name` varchar(100) NOT NULL,
`gender` varchar(1) NOT NULL,
`score` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

  • 增加列:给students表新增一列birth: ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL;
  • 修改列:把列名改为birthday,类型改为VARCHAR(20):ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL;
  • 删除列: ALTER TABLE students DROP COLUMN birthday;

DISTINCT

SELECT DISTINCT columns FROM table_name WHERE where_conditions;

sql
mysql> SELECT DISTINCT age FROM student;
+------+
| age  |
+------+
|   10 |
|   12 |
|   11 |
| NULL |
+------+
4 rows in set (0.01 sec)

DISTINCT 关键词用于返回唯一不同的值。放在查询语句中的第一个字段前使用,且作用于主句所有列。

如果列具有NULL值,并且对该列使用DISTINCT子句,MySQL将保留一个NULL值,并删除其它的NULL值,因为DISTINCT子句将所有NULL值视为相同的值。

distinct多列去重

distinct多列的去重,则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。

sql
SELECT DISTINCT column1,column2 FROM table_name WHERE where_conditions;
mysql> SELECT DISTINCT sex,age FROM student;
+--------+------+
| sex    | age  |
+--------+------+
| male   |   10 |
| female |   12 |
| male   |   11 |
| male   | NULL |
| female |   11 |
+--------+------+
5 rows in set (0.02 sec)

group by

对于基础去重来说,group by的使用和distinct类似:

SELECT columns FROM table_name WHERE where_conditions GROUP BY columns;

sql
mysql> SELECT age FROM student GROUP BY age;
+------+
| age  |
+------+
|   10 |
|   12 |
|   11 |
| NULL |
+------+
4 rows in set (0.02 sec)

多列去重:

SELECT columns FROM table_name WHERE where_conditions GROUP BY columns;

sql
mysql> SELECT sex,age FROM student GROUP BY sex,age;
+--------+------+
| sex    | age  |
+--------+------+
| male   |   10 |
| female |   12 |
| male   |   11 |
| male   | NULL |
| female |   11 |
+--------+------+
5 rows in set (0.03 sec)

两者的语法区别在于,group by可以进行单列去重,group by的原理是先对结果进行分组排序,然后返回每组中的第一条数据。且是根据group by的后接字段进行去重的。

在大多数例子中,DISTINCT可以被看作是特殊的GROUP BY,它们的实现都基于分组操作,且都可以通过松散索引扫描、紧凑索引扫描来实现。

distinct vs group

  • 在语义相同,有索引的情况下:group bydistinct都能使用索引,效率相同。
  • 在语义相同,无索引的情况下:distinct效率高于group by。原因是distinctgroup by都会进行分组操作,但group by可能会进行排序,触发filesort,导致sql执行效率低下。

In case I don't see you. Good afternoon, good evening, and good night.