MYSQL快速入门

  • 理解SQL 语句的执行过程
  • 掌握SQL 语句的基本语法
  • 掌握SQL 语句的增删改查操作

1.SQL 分类

MySQL 是关系型数据库系统 ,其中存储了大量的数据,通过SQL 管理数据库配置和数据。
结构化查询语言(SQL),对数据库进行操作的语句。

2.DDL 语句

数据定义语句(Data Definition Language,DDL),通过这类语言可以对数据库、表、列等元数据进行创建、删除、更改。

  • 数据库的创建、删除、属性修改;
  • 表的创建、删除、更新;
  • 列的更新,插入等操作。
    库表列叫做元数据

3.DML 语句

数据操纵语句(Data Manipulation Language,DML),用于添加(增)、删除(删)、更新(改)和查询(查)数据库记录并检查数据完整性。

4.DCL 语句

数据控制语句(Data Control Language,DCL),通过此类语句可以对数据库的相关权限进行设置。

  • 某一个用户是否可以从某一个地址登录数据库;
  • 某一个用户是否可以增删改查某一个数据库的表中数据。

5.DDL 语句

数据定义语句 。对数据库内部数据库、表、列进行创建、删除、修改等操作的语言,DDL 语句更多的是由数据库管理员DBA 使用。

|-----------------|------------------|-------------------------|
| 命令 | 解释 | 示例 |
| show databases; | 查看所有数据库列表 | |
| use ; | 进入数据库 切换数据库 | use information_schema; |
| show tables; | 查看数据库中表名 | |
| desc |查看表的定义 | desc mysql.user; | |

复制代码
bbs ----+
        |
        +-- user        # 存储用户信息
        |
        `-- message     # 存储用户留言

1.数据库操作

1.创建一个数据库,名为bbs。

复制代码
MariaDB [(none)]> create database bbs;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bbs                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]>

2.删除数据库

删库是一个非常危险的操作,请慎重!

复制代码
MariaDB [(none)]> drop database bbs;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]>

3.创建数据库的同时指定默认编码。

复制代码
MariaDB [(none)]> create database bbs default character set utf8;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bbs                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]>

4.切入数据库bbs。

复制代码
MariaDB [(none)]> use bbs;
Database changed
MariaDB [bbs]>

2.表操作

1.进行表的操作之前,需要确定表所在数据库。

复制代码
MariaDB [bbs]> select database();
+------------+
| database() |
+------------+
| bbs        |
+------------+
1 row in set (0.00 sec)

MariaDB [bbs]>

2.数据库规划,user 表:

复制代码
user            # 存储用户信息的
    id          # 用户id,主键,int(10)
    username    # 用户名,varchar(255)
    password    # 用户密码 varchar(255)
    imgpath     # 用户的头像 varchar(255)

3.创建user 表(create table user)

复制代码
MariaDB [bbs]> create table user(id int(10) not null auto_increment primary key, username varchar(255) not null, password varchar(255) not null, imgpath varchar(255));
Query OK, 0 rows affected (0.00 sec)

MariaDB [bbs]> show tables;
+---------------+
| Tables_in_bbs |
+---------------+
| user          |
+---------------+
1 row in set (0.00 sec)

MariaDB [bbs]> desc user;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(10)      | NO   | PRI | NULL    | auto_increment |
| username | varchar(255) | NO   |     | NULL    |                |
| password | varchar(255) | NO   |     | NULL    |                |
| imgpath  | varchar(255) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [bbs]> show create table user\G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `imgpath` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

MariaDB [bbs]>

注意:

  • \G 就是用来代替; 使用,以显示更多的内容。

4.数据库规划,message 表:

复制代码
message         # 存储用户留言信息
    id          # 留言的 ID,主键,int(10)
    uid         # 该条留言的主人的ID int(10)
    title       # 留言的标题 varchar(255)
    content     # 留言的内容 varchar(255)

5.创建message 表

复制代码
MariaDB [bbs]> create table message (id int(10) not null auto_increment primary key, uid int(10) not null, title varchar(255) not null, content varchar(255) not null);
Query OK, 0 rows affected (0.01 sec)

MariaDB [bbs]> show create table message\G
*************************** 1. row ***************************
       Table: message
Create Table: CREATE TABLE `message` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `uid` int(10) NOT NULL,
  `title` varchar(255) NOT NULL,
  `content` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

MariaDB [bbs]>

6.表的删除

删除操作要慎重,变通的方法是给表改名。

复制代码
MariaDB [bbs]> drop table user;
Query OK, 0 rows affected (0.00 sec)

MariaDB [bbs]> drop table message;
Query OK, 0 rows affected (0.00 sec)

MariaDB [bbs]>

7.更改表名

基本句式为alter table 表名 rename [to] 新的表名;,将表user 的名字改为users。

复制代码
MariaDB [bbs]> alter table user rename users;
Query OK, 0 rows affected (0.01 sec)

MariaDB [bbs]> show tables;
+---------------+
| Tables_in_bbs |
+---------------+
| message       |
| users         |
+---------------+
2 rows in set (0.00 sec)

MariaDB [bbs]>

3.列操作

1.查看表的定义

复制代码
MariaDB [bbs]> desc users;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(10)      | NO   | PRI | NULL    | auto_increment |
| username | varchar(255) | NO   |     | NULL    |                |
| password | varchar(255) | NO   |     | NULL    |                |
| imgpath  | varchar(255) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [bbs]>

2.修改表中列类型

基本句式为alter table 表名 modify [column] 列名 列定义 [first|after 列名];。将表user 中字段username 的类型修改为varchar(50),并将其移动到pasword 字段后面。

复制代码
MariaDB [bbs]> alter table users modify username varchar(50) not null after password;
Query OK, 0 rows affected (0.02 sec)               
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [bbs]> desc users;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(10)      | NO   | PRI | NULL    | auto_increment |
| password | varchar(255) | NO   |     | NULL    |                |
| username | varchar(50)  | NO   |     | NULL    |                |
| imgpath  | varchar(255) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [bbs]>字段

3.删除表列

基本句式为alter table 表名 drop [column] 列名;,将表user 中字段imgpath 删除。

复制代码
MariaDB [bbs]> alter table users drop imgpath;
Query OK, 0 rows affected (0.02 sec)               
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [bbs]> desc users;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(10)      | NO   | PRI | NULL    | auto_increment |
| password | varchar(255) | NO   |     | NULL    |                |
| username | varchar(50)  | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

MariaDB [bbs]>

4.增加表中列

基本句式为alter table 表名 add [column] 列名 列定义 [first|after 列名];,向表user 中增加字段imgpath。

复制代码
MariaDB [bbs]> alter table users add imgpath varchar(255);
Query OK, 0 rows affected (0.02 sec)               
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [bbs]> desc users;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(10)      | NO   | PRI | NULL    | auto_increment |
| password | varchar(255) | NO   |     | NULL    |                |
| username | varchar(50)  | NO   |     | NULL    |                |
| imgpath  | varchar(255) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [bbs]>

5.列改名

基本句式为alter table 表名 change 旧的列名 新的列名 列定义 [first|after 列名];,将表user 中字段imgpath 的名字改为img_path。

复制代码
MariaDB [bbs]> alter table users change imgpath img_path varchar(255);
Query OK, 0 rows affected (0.02 sec)               
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [bbs]> desc users;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(10)      | NO   | PRI | NULL    | auto_increment |
| password | varchar(255) | NO   |     | NULL    |                |
| username | varchar(50)  | NO   |     | NULL    |                |
| img_path | varchar(255) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [bbs]>

6.DML 语句

  • insert
  • delete
  • update
  • select

1.查询所有内容

复制代码
MariaDB [bbs]> select * from users;
Empty set (0.00 sec)

MariaDB [bbs]>

2.跨库跨表查询

复制代码
select * from mysql.users;
select * from mysql.users\G

注意:

  • select 的查询结果是一张表,而且是一张虚拟的表;
  • select 语句不会修改表中原来的数据。

3.插入记录

  • 核心思路:向哪张表中的哪个字段中插入数据,内容是什么?
  • 插入记录,基本句式为insert into 表名( 列名1, 列名2,...) values( '值1', '值2', ...);,向表users 中插入用户ajest,其密码是123456。

    MariaDB [bbs]> insert into users( username, password) values( 'ajest', '123456');
    Query OK, 1 row affected (0.01 sec)

    MariaDB [bbs]> select * from users;
    +----+----------+----------+----------+
    | id | password | username | img_path |
    +----+----------+----------+----------+
    | 1 | 123456 | ajest | NULL |
    +----+----------+----------+----------+
    1 row in set (0.00 sec)

    MariaDB [bbs]> insert into users( username, password) values( 'root', '123456'), ( 'admin', '123456');
    Query OK, 2 rows affected (0.00 sec)
    Records: 2 Duplicates: 0 Warnings: 0

    MariaDB [bbs]> select * from users;
    +----+----------+----------+----------+
    | id | password | username | img_path |
    +----+----------+----------+----------+
    | 1 | 123456 | ajest | NULL |
    | 2 | 123456 | root | NULL |
    | 3 | 123456 | admin | NULL |
    +----+----------+----------+----------+
    3 rows in set (0.00 sec)

    MariaDB [bbs]>

批量插入留言
复制代码
MariaDB [bbs]> insert into message(uid,title,content)values(1,"Hello","My Name is AJEST"),(2,"OK?","Hi,AJEST!How are you?"),(1,"ok!","I'm fine!Thank you!"),(3,"Hello","My Name is admin!");
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [bbs]> select * from message;
+----+-----+-------+-----------------------+
| id | uid | title | content               |
+----+-----+-------+-----------------------+
|  1 |   1 | Hello | My Name is AJEST      |
|  2 |   2 | OK?   | Hi,AJEST!How are you? |
|  3 |   1 | ok!   | I'm fine!Thank you!   |
|  4 |   3 | Hello | My Name is admin!     |
+----+-----+-------+-----------------------+
4 rows in set (0.00 sec)

MariaDB [bbs]>
思考与练习:
  • root 用户进行留言,题目是Hero,内容是I want to be a hero!

    insert into messages(uid,title,content)values(2,"Hero","I want to be a hero!");

  • 新注册一个用户,名字是tom,密码是[123.com]。

    insert into users(username,password)values("tom","123.com");

  • tom 留言,内容是Where are you, jerry?

    insert into messages(uid,content)values(4,"Where are you,jerry?",);

4.更新记录

核心思路:将哪张表中的哪个列更新(修改)为指定的值,过滤条件是什么?

修改用户ajest 的密码为http://123.com

复制代码
MariaDB [bbs]> update users set password="123.com";
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

MariaDB [bbs]> select * from users;
+----+----------+----------+----------+
| id | password | username | img_path |
+----+----------+----------+----------+
|  1 | 123.com  | ajest    | NULL     |
|  2 | 123.com  | root     | NULL     |
|  3 | 123.com  | admin    | NULL     |
+----+----------+----------+----------+
3 rows in set (0.01 sec)

MariaDB [bbs]> update users set password="123456";
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

MariaDB [bbs]> select * from users;
+----+----------+----------+----------+
| id | password | username | img_path |
+----+----------+----------+----------+
|  1 | 123456   | ajest    | NULL     |
|  2 | 123456   | r/oot     | NULL     |
|  3 | 123456   | admin    | NULL     |
+----+----------+----------+----------+
3 rows in set (0.00 sec)

MariaDB [bbs]> update users set password='123.com' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [bbs]> select * from users;
+----+----------+----------+----------+
| id | password | username | img_path |
+----+----------+----------+----------+
|  1 | 123.com  | ajest    | NULL     |
|  2 | 123456   | root     | NULL     |
|  3 | 123456   | admin    | NULL     |
+----+----------+----------+----------+
3 rows in set (0.00 sec)

MariaDB [bbs]>

删除记录

核心思路:从哪张表中删除记录,条件是什么?

从表users 中删除用户ajest。

复制代码
delete from users where id=1;

查询记录

核心思路:确定查询的内容,从哪张表中查,过滤条件是什么?

查询表users 中所有用户名。

复制代码
MariaDB [bbs]> select username from users;
+----------+
| username |
+----------+
| ajest    |
| root     |
| admin    |
+----------+
3 rows in set (0.00 sec)

MariaDB [bbs]>

查询用户名以及密码。

复制代码
MariaDB [bbs]> 
+----------+----------+
| username | password |
+----------+----------+
| ajest    | 123.com  |
| root     | 123456   |
| admin    | 123456   |
+----------+----------+
3 rows in set (0.00 sec)

MariaDB [bbs]>

5.查询进阶

1.查询不重复记录

关键字distinct 放在字段前面,起到修饰作用,过滤掉重复记录。

复制代码
MariaDB [bbs]> select distinct password from users;
+----------+
| password |
+----------+
| 123.com  |
| 123456   |
+----------+
2 rows in set (0.01 sec)

MariaDB [bbs]>

2.条件查询

where 按照一定的条件,将表的一部分输出到屏幕中。

  • 如果屏幕中有内容输出,认为过滤条件为真;
  • 如果屏幕中无内容输出,认为过滤条件为假;

|------|------|
| 过滤条件 | 查询内容 |
| 真 | 有 |
| 假 | 无 |

查询用户ajest 的所有信息。

复制代码
MariaDB [bbs]> select * from users where id=1;
+----+----------+----------+----------+
| id | password | username | img_path |
+----+----------+----------+----------+
|  1 | 123.com  | ajest    | NULL     |
+----+----------+----------+----------+
1 row in set (0.00 sec)

MariaDB [bbs]>

查询root 用户的密码。

复制代码
MariaDB [bbs]> select password from users where username='root';
+----------+
| password |
+----------+
| 123456   |
+----------+
1 row in set (0.00 sec)

MariaDB [bbs]>

思考与练习:

  • 如何查询用户ajest 的id?
    select id from users where username='ajest';

  • 用户ajest 所有的留言是什么?
    select * from messages where uid='1';

6.排序

关键字order by 对查询结果,依据列内容的规律进行排序。

1.(默认)升序排序,使用关键字asc

复制代码
MariaDB [bbs]> select * from message order by id asc;
+----+-----+-------+-----------------------+
| id | uid | title | content               |
+----+-----+-------+-----------------------+
|  1 |   1 | Hello | My Name is AJEST      |
|  2 |   2 | OK?   | Hi,AJEST!How are you? |
|  3 |   1 | ok!   | I'm fine!Thank you!   |
|  4 |   3 | Hello | My Name is admin!     |
+----+-----+-------+-----------------------+
4 rows in set (0.00 sec)

MariaDB [bbs]>

2.降序,使用关键字desc

复制代码
MariaDB [bbs]> select * from message order by id desc;
+----+----------+----------+----------+
| id | password | username | img_path |
+----+----------+----------+----------+
|  2 | 123456   | root     | NULL     |
|  1 | 123.com  | ajest    | NULL     |
|  3 | 123456   | admin    | NULL     |
+----+----------+----------+----------+
3 rows in set (0.00 sec)

MariaDB [bbs]>

按照message 表中,第二列进行排序。

复制代码
MariaDB [bbs]> select * from message order by 2;
+----+-----+-------+-----------------------+
| id | uid | title | content               |
+----+-----+-------+-----------------------+
|  1 |   1 | Hello | My Name is AJEST      |
|  3 |   1 | ok!   | I'm fine!Thank you!   |
|  2 |   2 | OK?   | Hi,AJEST!How are you? |
|  4 |   3 | Hello | My Name is admin!     |
+----+-----+-------+-----------------------+
4 rows in set (0.00 sec)

MariaDB [bbs]>

7.限制

可以用limit 关键字从结果集合中取得(第几条开始,取得几条)记录。

1.查询第一条留言

复制代码
MariaDB [bbs]> select * from message where id = 1;
+----+-----+-------+------------------+
| id | uid | title | content          |
+----+-----+-------+------------------+
|  1 |   1 | Hello | My Name is AJEST |
+----+-----+-------+------------------+
1 row in set (0.00 sec)

MariaDB [bbs]>

2.查询最后一条留言

复制代码
MariaDB [bbs]> select * from message order by id desc limit 0,1;
+----+-----+-------+-------------------+
| id | uid | title | content           |
+----+-----+-------+-------------------+
|  4 |   3 | Hello | My Name is admin! |
+----+-----+-------+-------------------+
1 row in set (0.00 sec)

MariaDB [bbs]>

8.聚合

聚合就是对表中记录进行统计。

1.使用sum()

计算message 表中所有id 值之和

复制代码
MariaDB [bbs]> select id from message;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

MariaDB [bbs]> select sum(id) from message;
+---------+
| sum(id) |
+---------+
|      10 |
+---------+
1 row in set (0.00 sec)

MariaDB [bbs]>

2.使用count()

计算出users 表中用户数量。

复制代码
MariaDB [bbs]> select count(*) from users;
+----------+
| count(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

MariaDB [bbs]>

4.使用max()

统计message.id 字段记录中最大值。

复制代码
MariaDB [bbs]> select id from message;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

MariaDB [bbs]> select max(id) from message;
+---------+
| max(id) |
+---------+
|       4 |
+---------+
1 row in set (0.00 sec)

MariaDB [bbs]>

5.使用min()

统计message.id 字段记录中最小值。

复制代码
MariaDB [bbs]> select min(id) from message;
+---------+
| min(id) |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

MariaDB [bbs]>

6.GROUP BY 分类聚合

通过一个key 进行分组计数。

统计每个用户留言的数量。

复制代码
MariaDB [bbs]> select uid,count(*) from message group by uid;
+-----+----------+
| uid | count(*) |
+-----+----------+
|   1 |        2 |
|   2 |        1 |
|   3 |        1 |
+-----+----------+
3 rows in set (0.00 sec)

MariaDB [bbs]>

9.子查询

一个查询需要另外一个查询的结果参与的时候,用子查询。

查询出所有留过言用户的名字

复制代码
MariaDB [bbs]> select username from users where id in (select uid from message); 
+----------+
| username |
+----------+
| ajest    |
| root     |
| admin    |
+----------+
3 rows in set (0.01 sec)

MariaDB [bbs]>

查询出所有没有留过言用户的名字

复制代码
MariaDB [bbs]> select username from users where id not in (select uid from message); 
Empty set (0.00 sec)

MariaDB [bbs]>

关键字exists 结果集合中是否有记录

复制代码
MariaDB [bbs]> select exists(select * from users);
+-----------------------------+
| exists(select * from users) |
+-----------------------------+
|                           1 |
+-----------------------------+
1 row in set (0.00 sec)

MariaDB [bbs]>

not exists 与exists 相反。

复制代码
MariaDB [bbs]> select not exists(select * from users where id=0);
+--------------------------------------------+
| not exists(select * from users where id=0) |
+--------------------------------------------+
|                                          1 |
+--------------------------------------------+
1 row in set (0.00 sec)

MariaDB [bbs]>

10.表连接

同时查询多张表。

同时查询出用户名,留言标题,留言内容。

复制代码
MariaDB [bbs]> select user.username, message.title, message.content from users, message where users.id=message.uid;
+----------+-------+-----------------------+
| username | title | content               |
+----------+-------+-----------------------+
| ajest    | Hello | My Name is AJEST      |
| root     | OK?   | Hi,AJEST!How are you? |
| ajest    | ok!   | I'm fine!Thank you!   |
| admin    | Hello | My Name is admin!     |
+----------+-------+-----------------------+
4 rows in set (0.01 sec)

MariaDB [bbs]>

除了以上写法,还有很多其他变形语句,SQL 语句可以非常灵活,大家注意识别。

复制代码
select u.username, m.title, m.content from users as u, message as m where u.id=m.uid;

select u.username, m.title, m.content from users u, message m where u.id=m.uid;

select u.username, m.title, m.content from (select * from users)u, (select * from message)m where u.id=m.uid;

左连接:横向拼接。

复制代码
MariaDB [bbs]> select u.username, m.title, m.content from users u left join message m on u.id=m.uid;
+----------+-------+-----------------------+
| username | title | content               |
+----------+-------+-----------------------+
| ajest    | Hello | My Name is AJEST      |
| root     | OK?   | Hi,AJEST!How are you? |
| ajest    | ok!   | I'm fine!Thank you!   |
| admin    | Hello | My Name is admin!     |
+----------+-------+-----------------------+
4 rows in set (0.00 sec)

MariaDB [bbs]>

11.联合查询

同时查询多张,纵向链接

利用联合查询,查出所用用户和留言信息

复制代码
MariaDB [bbs]> select * from users union select * from message;
+----+----------+----------+-----------------------+
| id | password | username | img_path              |
+----+----------+----------+-----------------------+
|  1 | 123.com  | ajest    | NULL                  |
|  2 | 123456   | root     | NULL                  |
|  3 | 123456   | admin    | NULL                  |
|  1 | 1        | Hello    | My Name is AJEST      |
|  2 | 2        | OK?      | Hi,AJEST!How are you? |
|  3 | 1        | ok!      | I'm fine!Thank you!   |
|  4 | 3        | Hello    | My Name is admin!     |
+----+----------+----------+-----------------------+
7 rows in set (0.00 sec)

MariaDB [bbs]>

两张表具有相同的列数。

复制代码
MariaDB [bbs]> select 1,2,3,4;
+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+
1 row in set (0.00 sec)

MariaDB [bbs]> select 5,6,7,8,9;
+---+---+---+---+---+
| 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+
| 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+
1 row in set (0.00 sec)

MariaDB [bbs]> select 1,2,3,4 union select 5,6,7,8,9;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
MariaDB [bbs]>

列类型相同(数字比较特殊)。

常见运算符

MySQL 提供了一些运算符号,可以在SQL 语句中使用,比如需要对SQL 语句中的某个值,或者某个字段做运算操作的时候,就可以使用这些运算符。

比较运算符

|---------|----------|
| 运算符 | 含义 |
| = | 字段等于固定的值 |
| > | |
| < | |
| >= | |
| <= | |
| <> != | 不等于 |

查询出留言id 大于3 的所有留言。

复制代码
MariaDB [bbs]> select * from message where id > 3;
+----+-----+-------+-------------------+
| id | uid | title | content           |
+----+-----+-------+-------------------+
|  4 |   3 | Hello | My Name is admin! |
+----+-----+-------+-------------------+
1 row in set (0.00 sec)

MariaDB [bbs]>

逻辑运算符

参与逻辑运算的操作数是布尔类型的值。

  • 真,表示为True 或1。
  • 假,表示为False 或0。

    MariaDB [bbs]> select true;
    +------+
    | TRUE |
    +------+
    | 1 |
    +------+
    1 row in set (0.00 sec)

    MariaDB [bbs]> select false;
    +-------+
    | FALSE |
    +-------+
    | 0 |
    +-------+
    1 row in set (0.00 sec)

    MariaDB [bbs]>

and 与运算:有假则假。

|-------|------------------------|-------------------------|
| and | True | False |
| True | True and True = True | True and False = False |
| False | False and True = False | False and False = False |

or 或运算:有真则真。

|-------|------|-------|
| or | True | False |
| True | True | True |
| False | True | False |

! 非运算:真假取反。

|----|-------|-------|
| ! | True | False |
| -- | False | True |

^ 异或运算:异真同假。

|-------|-------|-------|
| ^ | True | False |
| True | False | True |
| False | True | False |

查询出id 在2 到4 之间的留言。

复制代码
MariaDB [bbs]> select * from message where id >2 and id < 4;
+----+-----+-------+---------------------+
| id | uid | title | content             |
+----+-----+-------+---------------------+
|  3 |   1 | ok!   | I'm fine!Thank you! |
+----+-----+-------+---------------------+
1 row in set (0.00 sec)

MariaDB [bbs]>

逻辑运算对真假性的影响。

|----------------|------------------------|
| 语句 | 说明 |
| and 1=1 or 1=2 | 判断条件的真假性取决于and 之前语句真假性 |
| and 1=2 | 恒假 |
| or 1=1 | 恒真 |

算数运算符

|-----|----|
| 运算符 | 含义 |
| + | |
| - | |
| * | |
| / | |

复制代码
MariaDB [bbs]> select 10/3=1+1;
+----------+
| 10/3=1+1 |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

MariaDB [bbs]>

运算符优先级

逻辑运算与and 的优先级高于逻辑运算或or。

复制代码
MariaDB [bbs]> select 1=1 or 1=2 and 1=2;
+--------------------+
| 1=1 or 1=2 and 1=2 |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

MariaDB [bbs]> select 1=1 or (1=2 and 1=2);
+----------------------+
| 1=1 or (1=2 and 1=2) |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

MariaDB [bbs]> select (1=1 or 1=2) and 1=2;
+----------------------+
| (1=1 or 1=2) and 1=2 |
+----------------------+
|                    0 |
+----------------------+
1 row in set (0.00 sec)

MariaDB [bbs]>
相关推荐
71-320 分钟前
MySQL的安装和卸载组件
笔记·学习·mysql
雷工笔记20 分钟前
Navicat Premium 17 软件安装记录
数据库
wenlonglanying1 小时前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
数据库小组1 小时前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具
爬山算法1 小时前
MongoDB(38)如何使用聚合进行投影?
数据库·mongodb
l1t1 小时前
Deep Seek总结的APSW 和 SQLite 的关系
数据库·sqlite
Pocker_Spades_A2 小时前
基于代价模型的连接条件下推:复杂SQL查询的性能优化实践
数据库·sql·性能优化
huan1991102 小时前
Python使用PyMySQL操作MySQL完整指南
数据库·python·mysql
双星系统2 小时前
ABB机器人DSQC 679示教器电缆选型与故障排查(附原装型号对照表)
网络·数据库·机器人·工业4.0·工业机器人
TDengine (老段)3 小时前
TDengine 视图功能使用
大数据·数据库·servlet·时序数据库·tdengine·涛思数据