mysql随笔

1.sql 分类

        SQL 语句主要可以划分为以下 3 个类别。

         DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、 数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter 等。

         DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查 询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和 select 等。

         DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和 访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的 语句关键字包括 grant、revoke 等。

2. ddl语句

2.1.创建数据库

语法:

create database dbname;

创建test;

create database test;

查看字符集

show character set;

指定字符集建库

 create database nis_gbk character set gbk collate gbk_chinese_ci;

切换数据库

use dbname;  #切换数据库

2.2删除数据库

2.2.1.只删除表数据,不删除表结构

truncate table table_name;  

语法:

drop database dbname;

语句:

drop database test;

2.2.2建表

语法:

CREATE TABLE tablename (column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints , ……column_name_n column_type_n
constraints)

语句:

mysql> create table nmp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));

2.3 alter

2.3.1修改数据类型

语法:

CREATE TABLE tablename (column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints , ……column_name_n column_type_n
constraints)

语句:

mysql> alter table  nmp modify name varchar(20);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc nmp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name     | varchar(20)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(4)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

2.3.2 增加字段

语法:

ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]

语句:

mysql> alter table nmp add column age int(3);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc nmp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name     | varchar(20)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(4)        | YES  |     | NULL    |       |
| age      | int(3)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

2.3.3 删除字段

ALTER TABLE tablename DROP [COLUMN] col_name

语句:

alter table nmp drop column age;

2.3.4 字段改名

ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]

语句:

mysql> alter table nmp change sal sals decimal(10,2);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc nmp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name     | varchar(20)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sals     | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(4)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

2.3.5 修改字段排列顺序

       字段增加和修改语法(ADD/CNAHGE/MODIFY)中,都有一个可选项 first|after column_name,这个选项可以用来修改字段在表中的位置,默认 ADD 增加的新字段是加在 表的最后位置,而 CHANGE/MODIFY 默认都不会改变字段的位置

mysql> alter table nmp add birth date after name;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc nmp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name     | varchar(20)   | YES  |     | NULL    |       |
| birth    | date          | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sals     | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(4)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

修改字段 deptno,将它放在最前面:

mysql> alter table nmp modify deptno int(4) first;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc nmp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| deptno   | int(4)        | YES  |     | NULL    |       |
| name     | varchar(20)   | YES  |     | NULL    |       |
| birth    | date          | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sals     | decimal(10,2) | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> alter table emp modify deptno int(4) after sal;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc emp ;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename    | varchar(20)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(4)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

注意:CHANGE/FIRST|AFTER COLUMN 这些关键字都属于 MySQL 在标准 SQL 上的扩展,在 其他数据库上不一定适用。

2.3.6 表改名

ALTER TABLE tablename RENAME [TO] new_tablename

语句:

mysql> alter table nmp rename emp;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| emp            |
+----------------+
1 row in set (0.00 sec)

3. DML语句

                DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作。下面将依次对它们进 行介绍。

3.1 插入记录

INSERT INTO tablename (field1,field2,……fieldn) VALUES(value1,value2,……valuesn);

向表 emp 中插入以下记录:name 为 zzx1,hiredate 为 2000-01-01,sals为 2000,deptno为1 

mysql> insert into emp (name,hiredate,sals,deptno) values('zzxl','2019-08-28','2000',1);

也可以不用指定字段名称,但是 values 后面的顺序应该和字段的排列顺序一致:

insert into emp values('2','lisa','2019-8-28','2300');

        对于含可空字段、非空但是含有默认值的字段、自增字段,可以不用在 insert 后的字段列表 里面出现,values 后面只写对应字段名称的 value,这些没写的字段可以自动设置为 NULL、 默认值、自增的下一个数字,这样在某些情况下可以大大缩短 SQL 语句的复杂性。 

insert into emp (name,sals) values('tont',1000);

查看插入值

mysql> select * from emp;
+--------+------+------------+---------+
| deptno | name | hiredate   | sals    |
+--------+------+------------+---------+
|      1 | zzxl | 2019-08-28 | 2000.00 |
|      2 | lisa | 2019-08-28 | 2300.00 |
|   NULL | tont | NULL       | 1000.00 |
+--------+------+------------+---------+
3 rows in set (0.00 sec)

insert 语句,可以一次性插入多条记录,语法如下:

INSERT INTO tablename (field1, field2,……fieldn)
VALUES
(record1_value1, record1_value2,……record1_valuesn),
(record2_value1, record2_value2,……record2_valuesn),
……
(recordn_value1, recordn_value2,……recordn_valuesn)
;

对表 dept 一次插入两条记录:

mysql> create table dept (depto int(2),deptname varchar(16));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into dept values(5,'dept5'),(6,'dept6');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from dept;
+-------+----------+
| depto | deptname |
+-------+----------+
|     5 | dept5    |
|     6 | dept6    |
+-------+----------+
2 rows in set (0.00 sec)

3.2. 更新记录

可以通过 update 命令进行更改,语法如下

UPDATE tablename SET field1=value1,field2.=value2,……fieldn=valuen [WHERE CONDITION]

将表 emp 中 name 为“lisa”的薪水(sal)从 2300 更改为 3000:

mysql> update emp set sals=3000 where name="lisa";
mysql> update emp set deptno=3,hiredate='2019-8-28' where name="tont";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from emp;
+--------+------+------------+---------+
| deptno | name | hiredate   | sals    |
+--------+------+------------+---------+
|      1 | zzxl | 2019-08-28 | 2000.00 |
|      2 | lisa | 2019-08-28 | 3000.00 |
|      3 | tont | 2019-08-28 | 1000.00 |
+--------+------+------------+---------+
3 rows in set (0.00 sec)
mysql> update emp a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      6 | dept6    |
+--------+----------+
1 row in set (0.00 sec)

mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
| lisa  | 2019-08-28 | 3000.00 |      2 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

3.3 删除记录

记录不再需要,可以用 delete 命令进行删除

DELETE FROM tablename [WHERE CONDITION]

在 emp 中将 ename 为‘tont’的记录全部删除

mysql> delete from emp where ename='tont';
Query OK, 1 row affected (0.00 sec)

mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
| lisa  | 2019-08-28 | 3000.00 |      2 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

在 MySQL 中可以一次删除多个表的数据

DELETE t1,t2…tn FROM t1,t2…tn [WHERE CONDITION]

如果 from 后面的表名用别名,则 delete 后面的也要用相应的别名,否则会提示语法错误。

将表 emp 和 dept 中 deptno 为 3 的记录同时都删除:

mysql> select * from dept;
+-------+----------+
| deptno | deptname |
+-------+----------+
|     5 | dept5    |
|     6 | dept6    |
+-------+----------+
2 rows in set (0.00 sec)

mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
| lisa  | 2019-08-28 | 3000.00 |      2 |
| tony  | 2019-08-28 | 2300.00 |      5 |
+-------+------------+---------+--------+
3 rows in set (0.00 sec)

mysql> delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=5;
Query OK, 2 rows affected (0.02 sec)

mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
| lisa  | 2019-08-28 | 3000.00 |      2 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      6 | dept6    |
+--------+----------+
1 row in set (0.00 sec)

3.4 查询记录

数据插入到数据库中后,就可以用 SELECT 命令进行各种各样的查询,使得输出的结果符合 我们的要求

SELECT * FROM tablename [WHERE CONDITION]

查询最简单的方式是将记录全部选出,在下面的例子中,将表 emp 中的记录全部查询出来

mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
| lisa  | 2019-08-28 | 3000.00 |      2 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

其中“*”表示要将所有的记录都选出来,也可以用逗号分割的所有字段来代替,例如,以 下两个查询是等价的:

mysql> select ename,hiredate,sal,deptno from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
| lisa  | 2019-08-28 | 3000.00 |      2 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

(1)查询不重复的记录

有时需要将表中的记录去掉重复后显示出来,可以用 distinct 关键字来实现

mysql> select distinct deptno from emp;
+--------+
| deptno |
+--------+
|      1 |
|      2 |
+--------+
2 rows in set (0.03 sec)

(2)条件查询。

在很多情况下,用户并不需要查询所有的记录,而只是需要根据限定条件来查询一部分数据, 用 where 关键字可以来实现这样的操作。

mysql> select * from emp where deptno=1;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
+-------+------------+---------+--------+
1 row in set (0.00 sec)

     结果集中将符合条件的记录列出来。上面的例子中,where 后面的条件是一个字段的‘=’ 比较,除了‘=’外,还可以使用>、=、<=、!=等比较运算符;多个条件之间还可以使 用 or、and 等逻辑运算符进行多条件联合查询,运算符会在以后章节中详细讲解。 以下是一个使用多字段条件查询的例子

mysql> select * from emp where deptno=1 and sal<3000;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
+-------+------------+---------+--------+
1 row in set (0.00 sec)

(3)排序和限制。

        我们经常会有这样的需求,取出按照某个字段进行排序后的记录结果集,这就用到了数据库 的排序操作,用关键字 ORDER BY 来实现,

SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC] , field2
[DESC|ASC],……fieldn [DESC|ASC]]

其中,DESC 和 ASC 是排序顺序关键字,DESC 表示按照字段进行降序排列,ASC 则表示升序 排列,如果不写此关键字默认是升序排列。ORDER BY 后面可以跟多个不同的排序字段,并 且每个排序字段可以有不同的排序顺序。

mysql> select * from emp order by sal;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
| lisa  | 2019-08-28 | 3000.00 |      2 |
+-------+------------+---------+--------+
2 rows in set (0.01 sec)

如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,以此类推。如果只 有一个排序字段,则这些字段相同的记录将会无序排列。

mysql> select * from emp order by deptno;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
| lisa  | 2019-08-28 | 3000.00 |      2 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

对于 deptno 相同的前两条记录,如果要按照工资由高到低排序,

mysql> select * from emp order by deptno,sal desc;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
| lisa  | 2019-08-28 | 3000.00 |      2 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

对于排序后的记录,如果希望只显示一部分,而不是全部,这时,就可以使用 LIMIT 关键字 来实现,

SELECT ……[LIMIT offset_start,row_count]

其中 offset_start 表示记录的起始偏移量,row_count 表示显示的行数。 在默认情况下,起始偏移量为 0,只需要写记录行数就可以,这时候,显示的实际就是前 n 条记录

mysql> select * from emp order by sal limit 1;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2019-08-28 | 2000.00 |      1 |
+-------+------------+---------+--------+
1 row in set (0.00 sec)

如果要显示 emp 表中按照 sal 排序后从第二条记录开始,显示 3 条记录

mysql> select * from emp order by sal limit 1,3;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| lisa  | 2019-08-28 | 3000.00 |      2 |
+-------+------------+---------+--------+
1 row in set (0.00 sec)

limit 经常和 order by 一起配合使用来进行记录的分页显示

(4)聚合。

很多情况下,我们需要进行一些汇总操作,比如统计整个公司的人数或者统计每个部门的人 46 数,这个时就要用到 SQL 的聚合操作。 

SELECT [field1,field2,……fieldn] fun_name
FROM tablename
[WHERE where_contition]
[GROUP BY field1,field2,……fieldn
[WITH ROLLUP]]
[HAVING where_contition]

对其参数进行以下说明。 

fun_name 表示要做的聚合操作,也就是聚合函数,常用的有 sum(求和)、count(*)(记 录数)、max(最大值)、min(最小值)。

GROUP BY 关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门 就应该写在 group by 后面。 

 WITH ROLLUP 是可选语法,表明是否对分类聚合后的结果进行再汇总。

 HAVING 关键字表示对分类后的结果再进行条件的过滤。

注意:having 和 where 的区别在于 having 是对聚合后的结果进行条件的过滤,而 where 是在聚 合前就对记录进行过滤,如果逻辑允许,我们尽可能用 where 先过滤记录,这样因为结果 集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用 having 进行再过滤。

要 emp 表中统计公司的总人数

mysql> select count(1) from emp;
+----------+
| count(1) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

在此基础上,要统计各个部门的人数:

mysql> select deptno,count(1) from emp group by deptno;
+--------+----------+
| deptno | count(1) |
+--------+----------+
|      1 |        1 |
|      2 |        1 |
+--------+----------+
2 rows in set (0.00 sec)

更细一些,既要统计各部门人数,又要统计总人数

mysql> select deptno,count(1) from emp group by deptno with rollup;
+--------+----------+
| deptno | count(1) |
+--------+----------+
|      1 |        1 |
|      2 |        1 |
|   NULL |        2 |
+--------+----------+
3 rows in set (0.00 sec)

统计人数大于 1 人的部门:

mysql> select deptno,count(1) from emp group by deptno having count(1)>1;
Empty set (0.00 sec)

mysql> select deptno,count(1) from emp group by deptno having count(1)>=1;
+--------+----------+
| deptno | count(1) |
+--------+----------+
|      1 |        1 |
|      2 |        1 |
+--------+----------+
2 rows in set (0.00 sec)

最后统计公司所有员工的薪水总额、最高和最低薪水:

mysql> select sum(sal),max(sal),min(sal) from emp;
+----------+----------+----------+
| sum(sal) | max(sal) | min(sal) |
+----------+----------+----------+
|  5000.00 |  3000.00 |  2000.00 |
+----------+----------+----------+
1 row in set (0.00 sec)

(5)表连接。

当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。 从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中 互相匹配的记录,而外连接会选出其他不匹配的记录。我们最常用的是内连接。

例如,查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表 emp 和 dept 中,因此,需要使用表连接来进行查询:

mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      6 | dept6    |
|      1 | tech     |
|      2 | sale     |
|      3 | hr       |
+--------+----------+
4 rows in set (0.00 sec)

mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;
+--------+----------+
| ename  | deptname |
+--------+----------+
| zzxl   | tech     |
| xiaozi | tech     |
| lisa   | sale     |
| nis    | hr       |
+--------+----------+
4 rows in set (0.00 sec)

mysql> select * from emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2019-08-28 | 2000.00 |      1 |
| lisa   | 2019-08-28 | 3000.00 |      2 |
| nis    | 2019-08-29 | 4000.00 |      3 |
| xiaozi | 2019-08-29 | 5500.00 |      1 |
+--------+------------+---------+--------+
4 rows in set (0.00 sec)

外连接有分为左连接和右连接,具体定义如下。

 左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录

 右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录

查询 emp 中所有用户名和所在部门名称:

mysql> select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
+--------+----------+
| ename  | deptname |
+--------+----------+
| zzxl   | tech     |
| xiaozi | tech     |
| lisa   | sale     |
| nis    | hr       |
| tony   | NULL     |
+--------+----------+
5 rows in set (0.00 sec)

比较这个查询和上例中的查询,都是查询用户名和部门名,两者的区别在于本例中列出了所 有的用户名,即使有的用户名(tony)并不存在合法的部门名称(部门号为 4,在 dept 中 没有这个部门);而上例中仅仅列出了存在合法部门的用户名和部门名称。 右连接和左连接类似,两者之间可以互相转化,例如,上面的例子可以改写为如下的右连接:

mysql> select ename,deptname from dept right join emp on dept.deptno=emp.deptno;
+--------+----------+
| ename  | deptname |
+--------+----------+
| zzxl   | tech     |
| xiaozi | tech     |
| lisa   | sale     |
| nis    | hr       |
| tony   | NULL     |
+--------+----------+
5 rows in set (0.00 sec)

(6)子查询。

某些情况下,当我们查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就 要用到子查询。用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists 等。 例如,从 emp 表中查询出所有部门在 dept 表中的所有记录:

mysql> select * from emp where deptno in (select deptno from dept);
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2019-08-28 | 2000.00 |      1 |
| lisa   | 2019-08-28 | 3000.00 |      2 |
| nis    | 2019-08-29 | 4000.00 |      3 |
| xiaozi | 2019-08-29 | 5500.00 |      1 |
| tony   | 2019-08-29 | 6400.00 |      4 |
+--------+------------+---------+--------+
5 rows in set (0.00 sec)

如果子查询记录数唯一,还可以用=代替 in:

mysql> select * from emp where deptno = (select deptno from dept limit 1);
Empty set (0.00 sec)

某些情况下,子查询可以转化为表连接,

mysql> select * from emp where deptno in (select deptno from dept);
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2019-08-28 | 2000.00 |      1 |
| lisa   | 2019-08-28 | 3000.00 |      2 |
| nis    | 2019-08-29 | 4000.00 |      3 |
| xiaozi | 2019-08-29 | 5500.00 |      1 |
| tony   | 2019-08-29 | 6400.00 |      4 |
+--------+------------+---------+--------+
5 rows in set (0.00 sec)
转换为表链接后
mysql> select emp.* from emp,dept where emp.deptno=dept.deptno;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2019-08-28 | 2000.00 |      1 |
| xiaozi | 2019-08-29 | 5500.00 |      1 |
| lisa   | 2019-08-28 | 3000.00 |      2 |
| nis    | 2019-08-29 | 4000.00 |      3 |
| tony   | 2019-08-29 | 6400.00 |      4 |
+--------+------------+---------+--------+
5 rows in set (0.00 sec)

(7)记录联合。

我们经常会碰到这样的应用,将两个表的数据按照一定的查询条件查询出来后,将结果合并 到一起显示出来,这个时候,就需要用 union 和 union all 关键字来实现这样的功能

SELECT * FROM t1
UNION|UNION ALL
SELECT * FROM t2
……
UNION|UNION ALL
SELECT * FROM tn;

UNION 和 UNION ALL 的主要区别是 UNION ALL 是把结果集直接合并在一起,而 UNION 是将 UNION ALL 后的结果进行一次 DISTINCT,去除重复记录后的结果

将 emp 和 dept 表中的部门编号的集合显示出来:

mysql> select * from emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2019-08-28 | 2000.00 |      1 |
| lisa   | 2019-08-28 | 3000.00 |      2 |
| nis    | 2019-08-29 | 4000.00 |      3 |
| xiaozi | 2019-08-29 | 5500.00 |      1 |
| tony   | 2019-08-29 | 6400.00 |      4 |
+--------+------------+---------+--------+
5 rows in set (0.00 sec)

mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      6 | dept6    |
|      1 | tech     |
|      2 | sale     |
|      3 | hr       |
|      4 | fin      |
+--------+----------+
5 rows in set (0.00 sec)

mysql> select deptno from emp union all select deptno from dept;
+--------+
| deptno |
+--------+
|      1 |
|      2 |
|      3 |
|      1 |
|      4 |
|      6 |
|      1 |
|      2 |
|      3 |
|      4 |
+--------+
10 rows in set (0.00 sec)

将结果去掉重复记录后显示:

mysql> select deptno from emp union select deptno from dept;
+--------+
| deptno |
+--------+
|      1 |
|      2 |
|      3 |
|      4 |
|      6 |
+--------+
5 rows in set (0.00 sec)

4.DCL语句

DCL 语句主要是 DBA 用来管理系统中的对象权限时所使用

创建一个数据库用户 z1,具有对 test数据库中所有表的 SELECT/INSERT 权限:

mysql> grant select,insert on test.* to 'z1'@'localhost' identified by '123456';

由于权限变更,需要将 z1 的权限变更,收回 INSERT,只能对数据进行 SELECT 操作

revoke insert on test.* from 'z1'@'localhost';

授予所有权

grant all privileges on *.* to server@'%' identified by '123456' with grant option;  

4.1 按照层次看帮助 如果不知道帮助能够提供些什么,可以用“?contents”命令来显示所有可供查询的的分类,

mysql> ? contents
You asked for help about help category: "Contents"
For more information, type 'help <item>', where <item> is one of the following
categories:
   Account Management
   Administration
   Compound Statements
   Data Definition
   Data Manipulation
   Data Types
   Functions
   Functions and Modifiers for Use with GROUP BY
   Geographic Features
   Help Metadata
   Language Structure
   Plugins
   Procedures
   Storage Engines
   Table Maintenance
   Transactions
   User-Defined Functions
   Utility

对于列出的分类,可以使用“? 类别名称”的方式针对用户感兴趣的内容做进一步的查看。

想看看 MySQL 中都支持哪些数据类型,可以执行“? data types”命令:

mysql> ? data types
You asked for help about help category: "Data Types"
For more information, type 'help <item>', where <item> is one of the following
topics:
   AUTO_INCREMENT
   BIGINT
   BINARY
   BIT
   BLOB
   BLOB DATA TYPE
   BOOLEAN
   CHAR
   CHAR BYTE
   DATE
   DATETIME
   DEC
   DECIMAL
   DOUBLE
   DOUBLE PRECISION
   ENUM
   FLOAT
   INT
   INTEGER
   LONGBLOB
   LONGTEXT
   MEDIUMBLOB
   MEDIUMINT
   MEDIUMTEXT
   SET DATA TYPE
   SMALLINT
   TEXT
   TIME
   TIMESTAMP
   TINYBLOB
   TINYINT
   TINYTEXT
   VARBINARY
   VARCHAR
   YEAR DATA TYPE

上面列出了此版本支持的所有数据类型,如果想知道 int 类型的具体介绍,也可以利用上面 的方法,做进一步的查看:

mysql> ? int 
Name: 'INT'
Description:
INT[(M)] [UNSIGNED] [ZEROFILL]

A normal-size integer. The signed range is -2147483648 to 2147483647.
The unsigned range is 0 to 4294967295.

URL: http://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html

想 知道 show 命令都能看些什么东西,可以用如下命令

mysql> ? show 
Name: 'SHOW'
Description:
SHOW has many forms that provide information about databases, tables,
columns, or status information about the server. This section describes
those following:

SHOW {BINARY | MASTER} LOGS
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW CHARACTER SET [like_or_where]
SHOW COLLATION [like_or_where]
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where]
SHOW CREATE DATABASE db_name
SHOW CREATE EVENT event_name
SHOW CREATE FUNCTION func_name
SHOW CREATE PROCEDURE proc_name
SHOW CREATE TABLE tbl_name
SHOW CREATE TRIGGER trigger_name
SHOW CREATE VIEW view_name
SHOW DATABASES [like_or_where]
SHOW ENGINE engine_name {STATUS | MUTEX}
SHOW [STORAGE] ENGINES
SHOW ERRORS [LIMIT [offset,] row_count]
....

想参看 CREATE TABLE 的语法,可以使用以下命令

mysql> ? create table
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }

create_definition:
    col_name column_definition
  | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
      [index_option] ...
  | {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
      [index_name] [index_type] (index_col_name,...)
      [index_option] ...
  | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] FOREIGN KEY
      [index_name] (index_col_name,...) reference_definition
  | CHECK (expr)

小结

1.修改密码

SET PASSWORD FOR 'root'@'%' = PASSWORD("123456");  

1.1

[root@mysql ~]# mysqladmin  -uroot -p123 password '123456'

1.2

UPDATE mysql.user SET  password=password("123456") where user = "root" and host = "localhost";

2.忘记密码   #跳过登录密码

[root@mysql ~]# mysqld_safe --skip-grant-table &

3.查看用户

select user,host.password from mysql.user;  

 

4. 查看版本

select version();  

 

5. 删除用户

drop user 'user'@'host'
delete from mysql.user where user="**" and host="**";

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值