MySQL学习笔记01

一、初识MySQL

1.什么是MySQL

MySQL 是由 David Axmark 、 Allan Larsson 和 Michael Widenius 3 名瑞典人于 20 世纪 90年代开发的一个关系型数据库 。进入 21 世纪, MySQL 的发展步入了快车道 。 MySQL 自 2001 年开始引入 InnoDB 存储引擎,并于 2002 年正式宣布 MySQL 全面支待事务,满足事务 ACID 属性 (Atomicity, 原子性; Consistent, 一致性; Isolation , 隔离性; Durable, 持久性),并支持外键约束,使 MySQL具备了支持关键应用的最基本特性 。
 

MySQL的优点:

(1)坚持性能优先原则,不为追求标准的符合性而牺牲性能。

(2)简单易管理维护,这是相对于Oracle来说的。

2.MySQL的安装与配置

2.1MySQL的下载

下载方式为官网下载,下载版本为MySQL8.0.36。

(1)MySQL下载官网https://www.mysql.com/cn/,可以更改网站语言为中文,无需注册登陆。

(2)点击下载,进入下载界面

(3)找到MySQL Community(GPL) Downloads,点进去。

(4)找到MySQL Installers for Windows,点进去。选择第二个安装包,即这个(mysql-installer-community-8.0.36.0.msi),可以更改安装包的保存位置,也可默认位置。

2.2MySQL的安装

下载完成后,双击下载得到的安装包mysql-installer-community-8.0.36.0.msi,进入安装界面。

(1)在Choosing a setup type界面,可以根据自己的需求选择安装哪个版本,我选择的是full版本的。

(2)点击next,进入Installation界面,点击Execute,等待安装完成。

(3)完成安装后,点击next,进入配置MySQL组件界面,全部选择默认配置,直接点击next即可。

(4)进入Accounts and Roles界面,设置MySQL Root Password,设置完点击next。

(5)进入Windows Service界面,不用更改任何配置,点击next。

(6)进入Server File Permissions界面,不用更改任何配置,点击next。

(7)进入Apply Configuration界面,不用更改任何配置,点击Execute,等待一会儿完成后,点击Finish。

(8)接下来进入Product Configuration界面,不更改任何东西,直接点击Finish。

(9)接下来进入Connect To Server界面,输入刚刚设置的MySQL Root Password,点击check,再点击next。

(10)接下来进入Apply Configuration界面。直接点击Execute。

(11)进入Product Configuration界面,不更改任何东西,直接点击next(或者Finish)。

(12)进入Installation Complete界面,不更改任何东西,直接点击Finish。

(13)配置完毕。

2.3MySQL的配置

对于2.2中采用的图形化的安装方式,MySQL也提供了一个图形化的实例配置向导,可以引导用户逐步进行实例参数化的设置。

(1)单击“开始”,找到MySQL Installer Community菜单,进入安装界面。

(2)选择MySQL Server,单击Reconfigure,进入选择配置类型界面,可以在这里根据需求来设置。此方法可以对一些重要实例参数进行设置。

(3)对于更详细的参数,常用方法为通过修改配置文件进行设置。

Windows中配置文件命名为my.ini,通常位于MySQL安装目录下,比如C:\ProgramFiles\MySQL\MySQL Server8.0\my.ini。

2.4启动和关闭MySQL服务

MySQL服务是一系列后台进程,而MySQL数据库是一系列的数据目录和数据文件,两者不同。MySQL数据库必须在MySQL服务启动之后再能进行访问。

(1)方法一(较麻烦):Windows的“开始”菜单,单击开始----控制面板----管理工具----服务,找到MySQL80服务,双击后进入界面,单击启动或者停止按钮来启动或关闭MySQL服务。

(2)方法二:在命令提示符中手动启动和关闭MySQL服务。

C:\WINDOWS\system32>net start mysql80
MySQL80 服务正在启动 .
MySQL80 服务已经启动成功。


C:\WINDOWS\system32>net stop mysql80
MySQL80 服务正在停止.
MySQL80 服务已成功停止。

注:如果遇到net start mysql80命令无法启动MySQL的问题时,解决方法:

(1)检查是否是以管理员身份运行的命令提示符;

(2)见博文MySQL 无服务以及服务无法启动的终极解决方案

二、SQL基础

1.SQL简介

SQL是Structure Query Language(结构化查询语言)的缩写,是使用关系模型的数据库应用语言。SQL标准的制定使得SQL作为标准关系数据库语言的地位得到加强,目前其标准几经修改,更趋完善。大多数关系型数据库系统都支持SQL语言,SQL已经成为多种平台进行交互操作的底层会话语言。

1.1SQL语句分类

(1)DDL语句:数据定义语言,定义了不同的数据段、数据库、表、列、索引等数据库对象。常用语句关键字create、drop、alter等。

(2)DML语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用语句关键字insert、delete、update、select等。

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

1.2 DDL语句

DDL是对数据库内部的对象进行创建、删除、修改等操作的语言。和DML语句的最大区别是DML语句只是操作表内部的数据,不涉及表的定义、结构的修改,也不会涉及其他对象。

DDL语句更多由数据库管理员(DBA)使用,开发人员一般很少使用。

MySQL中常用的DDL语句的使用方法:

1.2.1创建数据库

启动MySQL服务。

C:\WINDOWS\system32>net start mysql80
MySQL80 服务正在启动 .
MySQL80 服务已经启动成功。


 切换到MySQL Server所在文件夹中的bin目录。

C:\WINDOWS\system32>cd C:\Program Files\MySQL\MySQL Server 8.0\bin

输入命令mysql -h localhost -u root -p后,输入之前设置的MySQL Server密码,连接到MySQL服务器:。

C:\Program Files\MySQL\MySQL Server 8.0\bin>mysql -h localhost -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

在mysql>提示符后面输入所要执行的SQL语句,每个SQL语句以分号(;)或者“\g”结束,按回车键执行。

语句1:创建数据库:dbname表示创建的数据库的名字。

CREATE DATABASE dbname

示例:

mysql> CREATE DATABASE test1;
Query OK, 1 row affected (0.01 sec)

“Query OK”表示上面的命令执行成功。“1 row affected”表示操作只影响了数据库中一行的记录。“0.01 sec”记录了操作执行的时间。

语句2:查看系统中有哪些数据库

SHOW databases;

示例:

mysql> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| test1              |
| world              |
+--------------------+
7 rows in set (0.01 sec)

除test1外,其他数据库是安装MySQL时系统自动创建的,有其他功能。部分数据库的功能如下:

infonnation _ schema: 主要存储系统 中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等 。每个用户都可以查看这个数据库,但根据权限的不同看到的内 容不同。

performance _ schema: MySQL 5.5 引入的 系统库,用于存储系统性能相关的动态参数表。

sys: MySQL 5.7 引入的 系统库,本身不记录系 统数据,基于 information_schema 和performance _ schema 之上 ,封装了 一层更加 易于调优和诊断的系统视图。

mysql : 存储系统的用户权限信息。

语句3:选择要操作的数据库

USE dbname;
mysql> USE test1;
Database changed

语句4:查看数据库中创建的所有数据表

SHOW tables;

示例:查看mysql数据库中所有数据表

mysql> USE mysql;
Database changed
mysql> SHOW tables;
+------------------------------------------------------+
| Tables_in_mysql                                      |
+------------------------------------------------------+
| columns_priv                                         |
| component                                            |
| db                                                   |
| default_roles                                        |
| engine_cost                                          |
| func                                                 |
| general_log                                          |
| global_grants                                        |
| gtid_executed                                        |
| help_category                                        |
| help_keyword                                         |
| help_relation                                        |
| help_topic                                           |
| innodb_index_stats                                   |
| innodb_table_stats                                   |
| ndb_binlog_index                                     |
| password_history                                     |
| plugin                                               |
| procs_priv                                           |
| proxies_priv                                         |
| replication_asynchronous_connection_failover         |
| replication_asynchronous_connection_failover_managed |
| replication_group_configuration_version              |
| replication_group_member_actions                     |
| role_edges                                           |
| server_cost                                          |
| servers                                              |
| slave_master_info                                    |
| slave_relay_log_info                                 |
| slave_worker_info                                    |
| slow_log                                             |
| tables_priv                                          |
| time_zone                                            |
| time_zone_leap_second                                |
| time_zone_name                                       |
| time_zone_transition                                 |
| time_zone_transition_type                            |
| user                                                 |
+------------------------------------------------------+
38 rows in set (0.01 sec)
1.2.2删除数据库
DROP DATABASE dbname;

数据库删除后,里面的所有表数据会被全部删除。

示例:

mysql> DROP DATABASE test1;
Query OK, 0 rows affected (0.02 sec)

1.2.3创建表
CREATE TABLE tablename (
column_name_1 colunm_type_1 constraints,
column_name_2 colunm_type_2 constraints,
...
column_name_n colunm_type_n constraints)

 column_name是列的名字;colunm_type是列的数据类型;constraints是这个列的约束条件。

表创建完毕后,可以查看表的定义:

DESC tablename;

 示例:

mysql> CREATE TABLE emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));
Query OK, 0 rows affected, 1 warning (0.03 sec)

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

为了得到更全面的表定义信息,可以查看创建表的SQL语句:

mysql> SHOW CREATE TABLE emp \G;
*************************** 1. row ***************************
       Table: emp
Create Table: CREATE TABLE `emp` (
  `ename` varchar(10) DEFAULT NULL,
  `hiredate` date DEFAULT NULL,
  `sal` decimal(10,2) DEFAULT NULL,
  `deptno` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)

ERROR:
No query specified
 1.2.4删除表
DROP TABLE tablename;

示例:

mysql> DROP TABLE emp;
Query OK, 0 rows affected (0.01 sec)
1.2.5修改表

大多数情况下,表结构的更改都使用alter table语句。

(1)修改表类型

ALTER TABLE tablename MODIFY [COLUNM] colunm_definition [FIRST | AFTER col_name];

示例:将表emp的enamel字段定义中的varchar(10)更改为varchar(20)

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

mysql> ALTER TABLE emp MODIFY ename varchar(20);
Query OK, 0 rows affected (0.01 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           | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

(2)增加表字段

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

 示例:在表emp中新增字段age,类型为int(3);

mysql> ALTER TABLE emp ADD COLUMN age int(3);
Query OK, 0 rows affected, 1 warning (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 1

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           | YES  |     | NULL    |       |
| age      | int           | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

(3)删除表字段

ALTER TABLE tablename DROP [COLUMN] col_name;

 示例:删除age字段。

mysql> ALTER TABLE emp DROP COLUMN age;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

(4)字段改名

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

 示例:将age字段改为age1,并将字段类型改为int(4)。

mysql> ALTER TABLE emp CHANGE age age1 int(4);
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 1

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           | YES  |     | NULL    |       |
| age1     | int           | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

注:change和modify都可以修改表的定义,不同的是change后面需要写两次列名;change可以修改列名称,modify不能。

(5)修改字段排列顺序

前面语句中的可选项FIRST|AFTER column_name,可以用来修改字段在表中的位置。ADD增加的新字段默认加在表的最后位置,而CHANGE/MODIFY默认不会更改字段的位置。

实例:将新增字段birth(数据类型为date)加在ename之后;

mysql> ALTER TABLE emp ADD birth date AFTER ename;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

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

修改字段age1,将其放在最前面;

mysql> ALTER TABLE emp MODIFY age1 int(3) FIRST;
Query OK, 0 rows affected, 1 warning (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> DESC emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age1     | int           | YES  |     | NULL    |       |
| ename    | varchar(20)   | YES  |     | NULL    |       |
| birth    | date          | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int           | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
1.2.6更改表名
ALTER TABLE tablename RENAME [TO] new_tablename;

示例:将emp改名为emp1;

mysql> ALTER TABLE emp RENAME TO emp1;
Query OK, 0 rows affected (0.01 sec)

mysql> DESC emp;
ERROR 1146 (42S02): Table 'test1.emp' doesn't exist
mysql> DESC emp1;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age1     | int           | YES  |     | NULL    |       |
| ename    | varchar(20)   | YES  |     | NULL    |       |
| birth    | date          | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int           | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

1.3DML语句

DML操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select)。

1.3.1插入记录
INSERT INTO tablename (field1,field2,...,fieldn) VALUES(value1,value2,...,valuen);

示例,向表emp中插入记录。

mysql> CREATE TABLE emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> INSERT INTO emp(ename,hiredate,sal,deptno) values('zzxl','2001-01-01','2000',1);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO emp values('lisa','2003-02-03','3000',1);
Query OK, 1 row affected (0.00 sec)

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

含可空的字段、非空但是含有默认值的字段以及自增字段,可以不在insert后的字段列表中出现,values后面只写对应字段名称的值。没写的字段自动设置为NULL、默认值、自增的下一个数字。

mysql> INSERT INTO emp (ename,sal) values('dony',1000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2001-01-01 | 2000.00 |      1 |
| lisa  | 2003-02-03 | 3000.00 |      1 |
| dony  | NULL       | 1000.00 |   NULL |
+-------+------------+---------+--------+
3 rows in set (0.00 sec)

insert语句还可以一次性插入多条记录。

INSERT INTO tablename (field1,field2,...,fieldn)
VALUES
(record1_value1,record1_value2,...,record1_valuen),
(record2_value1,record2_value2,...,record2_valuen),
...
(recordn_value1,recordn_value2,...,recordn_valuen),
1.3.2更新记录

表里的记录值可以通过update命令进行更改。

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

示例:将表emp中ename为lisa的薪水sal更改为4000。

mysql> UPDATE emp SET sal=4000 WHERE ename='lisa';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2001-01-01 | 2000.00 |      1 |
| lisa  | 2003-02-03 | 4000.00 |      1 |
| dony  | NULL       | 1000.00 |   NULL |
+-------+------------+---------+--------+
3 rows in set (0.00 sec)

update命令也可以同时更新多个表中的数据,这个命令更多用于根据一个表的字段来动态更新另外一个表的字段。

UPDATA t1,t2,...,tn SET t1.field1=expr1,...,tn.fieldn=exprn [WHERE CONDITION];

示例:同时更改表emp和表dept中的数据。

mysql> CREATE TABLE dept(deptno int(5),deptname varchar(10));
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> INSERT INTO dept values(1,'tech'),(2,'sale'),(5,'fin');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      1 | tech     |
|      2 | sale     |
|      5 | fin      |
+--------+----------+
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, 1 row affected (0.00 sec)
Rows matched: 3  Changed: 1  Warnings: 0

mysql> SELECT * FROM emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2001-01-01 | 2000.00 |      1 |
| lisa  | 2003-02-03 | 4000.00 |      1 |
| dony  | NULL       | 1000.00 |   NULL |
+-------+------------+---------+--------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      1 | zzxl     |
|      2 | sale     |
|      5 | fin      |
+--------+----------+
3 rows in set (0.00 sec)
1.3.3删除记录
DELETE FROM tablename [WHERE CONDITION]

示例,将表emp中enamel为‘dony’的记录删掉。

mysql> DELETE FROM emp WHERE ename='dony';
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2001-01-01 | 2000.00 |      1 |
| lisa  | 2003-02-03 | 4000.00 |      1 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

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

DELETE t1,t2,...tn FROM t1,t2,...tn [WHERE CONDITION];

如果from后面的表名用别名,则delete后面也要用相应的别名。

mysql> INSERT INTO dept values(3,'hr');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      1 | zzxl     |
|      2 | sale     |
|      5 | fin      |
|      3 | hr       |
+--------+----------+
4 rows in set (0.00 sec)

mysql> INSERT INTO emp values('bzshen','2005-05-03','300',3);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bzshen | 2005-05-03 |  300.00 |      3 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)

mysql> DELETE a,b FROM emp a,dept b where a.deptno=b.deptno and a.deptno=3;
Query OK, 2 rows affected (0.00 sec)

mysql> SELECT * FROM dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      1 | zzxl     |
|      2 | sale     |
|      5 | fin      |
+--------+----------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2001-01-01 | 2000.00 |      1 |
| lisa  | 2003-02-03 | 4000.00 |      1 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)
1.3.4查询记录

可以使用select命令进行各种各样的查询。

最简单的查询,将所有记录全部选出。

SELECT * FROM tablename;

(1)查询不重复的记录

用distinct关键字来实现:

mysql> SELECT * FROM emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)

mysql> SELECT distinct deptno from emp;
+--------+
| deptno |
+--------+
|      1 |
|      3 |
+--------+
2 rows in set (0.00 sec)

(2)条件查询

用where关键字实现:

mysql> SELECT * FROM emp WHERE deptno=1;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2001-01-01 | 2000.00 |      1 |
| lisa  | 2003-02-03 | 4000.00 |      1 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

where后面的条件可以使用>、<、>=、<=、!=等比较运算符,多个条件之间可以使用or、and等逻辑运算符进行多条件联合查询。

(3)排序和限制

对字段进行排序,利用关键字order by实现:

SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC], 
filed2 [DESC|ASC],...,fieldn [DESC|ASC]];

DESC和ASC是排序顺序关键字,DESC表示按照字段进行降序排列,ASC表示升序排列,不写此关键字默认是升序排列。

ORDER BY后面可以跟多个不同的排序字段,每个排序字段也可以有不同的排序顺序。

mysql> SELECT * FROM emp ORDER BY sal;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| bjguan | 2006-06-03 | 1500.00 |      3 |
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)

当排序字段的值一样时,值相同的字段会按照第二个排序字段进行排序,依次类推。

mysql> SELECT * FROM emp ORDER BY deptno,sal desc;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| lisa   | 2003-02-03 | 4000.00 |      1 |
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)

对于排序后的记录,如果只希望显示一部分,可以使用LIMIT关键字来实现。

SELECT * FROM tablename ... [LIMIT offset_start,row_count];

offset_start表示记录的起始偏移量,row_count表示显示的行数。默认情况下,其实偏移量为0。

显示表按sal排序后的两条记录: 

mysql> SELECT * FROM emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM emp ORDER BY sal LIMIT 2;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| bjguan | 2006-06-03 | 1500.00 |      3 |
| zzxl   | 2001-01-01 | 2000.00 |      1 |
+--------+------------+---------+--------+
2 rows in set (0.00 sec)

mysql>

 显示表emp按sal排列后第二条记录开始的2条记录:

mysql> SELECT * FROM emp ORDER BY sal LIMIT 1,2;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| zzxl  | 2001-01-01 | 2000.00 |      1 |
| lisa  | 2003-02-03 | 4000.00 |      1 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)

mysql>

注:limit属于MySQL扩展SQL92后的语法,其他数据库上不一定能通用。

(4)聚合

对数据进行汇总操作时,要用到SQL的聚合操作。

SELECT [field1,field2,...,fieldn] fun_name
FROM tablename
[WHERE where_condition]
[GROUP BY filed1,field2,...,fieldn [WITH ROLLUP]]
[HAVING where_condition]

fun_name表示要做的聚合操作,也就是聚合函数,常用的有sum、count、avg(平均值)、max、min等。

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

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

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

注:HAVING和WHERE的区别在于,HAVING是对聚合后的结果进行条件的过滤,而WHERE是在聚合前就对记录进行过滤。

示例:

在表emp中统计公司总人数:

mysql> SELECT COUNT(1) from emp;
+----------+
| COUNT(1) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

mysql>

统计各个部门的人数:


mysql> SELECT deptno,count(1) from emp GROUP BY deptno;
+--------+----------+
| deptno | count(1) |
+--------+----------+
|      1 |        2 |
|      3 |        1 |
+--------+----------+
2 rows in set (0.00 sec)

mysql>

 既要统计各部门人数,又要统计总人数:

mysql> SELECT deptno,count(1) FROM emp GROUP BY deptno WITH ROLLUP;
+--------+----------+
| deptno | count(1) |
+--------+----------+
|      1 |        2 |
|      3 |        1 |
|   NULL |        3 |
+--------+----------+
3 rows in set (0.00 sec)

mysql>

统计人数大于1的部门:

mysql> SELECT deptno,count(1) FROM emp GROUP BY deptno HAVING count(1)>1;
+--------+----------+
| deptno | count(1) |
+--------+----------+
|      1 |        2 |
+--------+----------+
1 row in set (0.00 sec)

mysql>

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

mysql> SELECT * FROM emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT sum(sal),max(sal),min(sal) FROM emp;
+----------+----------+----------+
| sum(sal) | max(sal) | min(sal) |
+----------+----------+----------+
|  7500.00 |  4000.00 |  1500.00 |
+----------+----------+----------+
1 row in set (0.00 sec)

mysql>

(5)表连接

当需要同时显示多个表中的字段时,可以用表连接来实现。

表连接可分为内连接和外连接,两者之间的主要区别是,内连接仅选出两张表中相互匹配的记录,而外连接会选出其他不匹配的记录。内连接比较常用。

示例:查询出所有雇员的名字和所在部门。

mysql> SELECT * FROM dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      3 | hr       |
|      1 | tech     |
|      2 | sale     |
+--------+----------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)

mysql> SELECT ename,deptname FROM emp,dept WHERE emp.deptno= dept.deptno;
+--------+----------+
| ename  | deptname |
+--------+----------+
| bjguan | hr       |
| lisa   | tech     |
| zzxl   | tech     |
+--------+----------+
3 rows in set (0.00 sec)

mysql>

外连接分为左连接和右连接:

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

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

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

mysql> SELECT * FROM emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
| dony   | 2005-02-05 | 4500.00 |      4 |
+--------+------------+---------+--------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      3 | hr       |
|      1 | tech     |
|      2 | sale     |
+--------+----------+
3 rows in set (0.00 sec)

mysql> SELECT ename,deptname FROM emp LEFT JOIN dept ON emp.deptno=dept.deptno;
+--------+----------+
| ename  | deptname |
+--------+----------+
| zzxl   | tech     |
| lisa   | tech     |
| bjguan | hr       |
| dony   | NULL     |
+--------+----------+
4 rows in set (0.00 sec)

左连接和右连接可以相互转化。

下述右连接等价于上面的左连接。

mysql> SELECT ename,deptname FROM dept RIGHT JOIN emp ON dept.deptno=emp.deptno;
+--------+----------+
| ename  | deptname |
+--------+----------+
| zzxl   | tech     |
| lisa   | tech     |
| bjguan | hr       |
| dony   | NULL     |
+--------+----------+
4 rows in set (0.00 sec)

(6)子查询

当查询时,需要的条件是另外一个select语句的结果,这是要用到子查询。

用于子查询的关键字主要包括in、not in、=、!=、exsits、not exists等。

示例:从表emp中查询出所有部门在表dept中的记录:

mysql> SELECT * FROM emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
| dony   | 2005-02-05 | 4500.00 |      4 |
+--------+------------+---------+--------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      3 | hr       |
|      1 | tech     |
|      2 | sale     |
+--------+----------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM emp where deptno in(SELECT deptno FROM dept);
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)

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

mysql> SELECT * FROM emp WHERE deptno=(SELECT deptno from dept);
ERROR 1242 (21000): Subquery returns more than 1 row
mysql> SELECT * FROM emp WHERE deptno=(SELECT deptno from dept LIMIT 1);
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| bjguan | 2006-06-03 | 1500.00 |      3 |
+--------+------------+---------+--------+
1 row in set (0.00 sec)

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

mysql> SELECT * FROM emp WHERE deptno in(SELECT deptno FROM dept);
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)

mysql> SELECT emp.* FROM emp,dept WHERE emp.deptno=dept.deptno;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
+--------+------------+---------+--------+
3 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,去除重复记录后的结果。

mysql> SELECT * FROM emp;
+--------+------------+---------+--------+
| ename  | hiredate   | sal     | deptno |
+--------+------------+---------+--------+
| zzxl   | 2001-01-01 | 2000.00 |      1 |
| lisa   | 2003-02-03 | 4000.00 |      1 |
| bjguan | 2006-06-03 | 1500.00 |      3 |
| dony   | 2005-02-05 | 4500.00 |      4 |
+--------+------------+---------+--------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      3 | hr       |
|      1 | tech     |
|      2 | sale     |
+--------+----------+
3 rows in set (0.00 sec)

mysql> SELECT deptno FROM emp UNION ALL SELECT deptno FROM dept;
+--------+
| deptno |
+--------+
|      1 |
|      1 |
|      3 |
|      4 |
|      3 |
|      1 |
|      2 |
+--------+
7 rows in set (0.00 sec)

mysql> SELECT deptno FROM emp UNION SELECT deptno FROM dept;
+--------+
| deptno |
+--------+
|      1 |
|      3 |
|      4 |
|      2 |
+--------+
4 rows in set (0.00 sec)

1.4DCL语句

DCL语句主要是DBA用来管理系统中的对象权限时使用,一般开发人员很少使用。

后续章节再学习这部分内容。

2.使用“帮助”

当使用MySQL时,遇到问题,可以查找MySQL的官方文档,也可以是用MySQL安装后自带的帮助文档。

2.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
   Components
   Compound Statements
   Contents
   Data Definition
   Data Manipulation
   Data Types
   Functions
   Geographic Features
   Help Metadata
   Language Structure
   Loadable Functions
   Plugins
   Prepared Statements
   Replication Statements
   Storage Engines
   Table Maintenance
   Transactions
   Utility

采用“? 类别名称”进一步查看感兴趣的内容,如:

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: https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html

()2.2快速查阅“帮助”

实际应用中,需快速查阅某项语法时,可以使用关键字进行快速查询,如想知道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 | CHARSET} [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]
SHOW EVENTS
SHOW FUNCTION CODE func_name
SHOW FUNCTION STATUS [like_or_where]
SHOW GRANTS FOR user
SHOW INDEX FROM tbl_name [FROM db_name]
SHOW MASTER STATUS
SHOW OPEN TABLES [FROM db_name] [like_or_where]
SHOW PLUGINS
SHOW PROCEDURE CODE proc_name
SHOW PROCEDURE STATUS [like_or_where]
SHOW PRIVILEGES
SHOW [FULL] PROCESSLIST
SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n]
SHOW PROFILES
SHOW RELAYLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW {REPLICAS | SLAVE HOSTS}
SHOW {REPLICA | SLAVE} STATUS [FOR CHANNEL channel]
SHOW [GLOBAL | SESSION] STATUS [like_or_where]
SHOW TABLE STATUS [FROM db_name] [like_or_where]
SHOW [FULL] TABLES [FROM db_name] [like_or_where]
SHOW TRIGGERS [FROM db_name] [like_or_where]
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]
SHOW WARNINGS [LIMIT [offset,] row_count]

like_or_where: {
    LIKE 'pattern'
  | WHERE expr
}

If the syntax for a given SHOW statement includes a LIKE 'pattern'
part, 'pattern' is a string that can contain the SQL % and _ wildcard
characters. The pattern is useful for restricting statement output to
matching values.

Several SHOW statements also accept a WHERE clause that provides more
flexibility in specifying which rows to display. See
https://dev.mysql.com/doc/refman/8.0/en/extended-show.html.

In SHOW statement results, user names and host names are quoted using
backticks (`).

URL: https://dev.mysql.com/doc/refman/8.0/en/show.html

3.查询元数据

MySQL5.0后提供了一个新的数据库information_schema,用来记录MySQL中的元数据信息。

元数据是指数据的数据,比如表名、列名、列类型、索引名等表的各种属性名称。这个数据库是一个虚拟数据库,物理上不存在相关的目录和文件,库里的show tables显示的各种“表”也不是实际存在的物理表,而全部是视图。

一些常用的视图:

(1)SCHEMATA:该表提供 了当前 MySQL 实 例 中 所有数据库的信息,show databases的结果取之此表。

(2)TABLES:该表提供了关于数据库中的表的信息(包括视图),详细表述了某个表属于哪个 schema、表类型、表引擎、创建时间等信息 。 show tables from schemaname的结果取之此表。

(3)COLUMNS:该表提供了表中的列信息 ,详细表述了某张表的所有列以及每个列的信息 。 show columns from schemaname.tablename 的结果取之此表 。

(4)STATISTICS: 该表提供了关于表索引的信息 。 show index from schemaname .tablename的结果取之此表。

  • 30
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值