mysql
常用命令
MySQL常用命令大全(完整)
登录
mysql (-h)-u 用户名 -p 用户密码
注意,如果是连接到另外的机器上,则需要加入一个参数-h机器IP
mysql -u root -p
8888
mysql> status
--------------
C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe Ver 8.0.39 for Win64 on x86_64 (MySQL Community Server - GPL)
Connection id: 18
Current database:
Current user: root@localhost
SSL: Cipher in use is TLS_AES_256_GCM_SHA384
Using delimiter: ;
Server version: 8.0.39 MySQL Community Server - GPL
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: gbk
Conn. characterset: gbk
TCP port: 3306
Binary data as: Hexadecimal
Uptime: 5 min 16 sec
Threads: 3 Questions: 6534 Slow queries: 0 Opens: 276 Flush tables: 3 Open tables: 184 Queries per second avg: 20.677
--------------
建立 选择
建表
use 库名;
create table 表名(字段列表);
drop table 表名;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
birthdate DATE,
is_active BOOLEAN DEFAULT TRUE
);
以上只是一个简单的实例,用到了一些常见的数据类型包括 INT, VARCHAR, DATE, BOOLEAN,你可以根据实际需要选择不同的数据类型。AUTO_INCREMENT 关键字用于创建一个自增长的列,PRIMARY KEY 用于定义主键。
如果你希望在创建表时指定数据引擎,字符集和排序规则等,可以使用 CHARACTER SET 和 COLLATE 子句:
实例
CREATE TABLE mytable (
id INT PRIMARY KEY,
name VARCHAR(50)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
以上代码创建一个使用 utf8mb4 字符集和 utf8mb4_general_ci 排序规则的表。
以下例子中我们将在 RUNOOB 数据库中创建数据表 runoob_tbl:
实例
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
实例解析:
如果你不想字段为空可以设置字段的属性为 NOT NULL,如上实例中的 runoob_title 与 runoob_author 字段, 在操作数据库时如果输入该字段的数据为空,就会报错。
AUTO_INCREMENT 定义列为自增的属性,一般用于主键,数值会自动加 1。
PRIMARY KEY 关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号 , 分隔。
ENGINE 设置存储引擎,CHARSET 设置编码。
增加字段
mysql> create table aqy(id int primary key,
-> name varchar(50)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
+------------------+
| Tables_in_ks_db2 |
+------------------+
| aqy |
| 留言 |
+------------------+
2 rows in set (0.00 sec)
mysql> describe aqy;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> alter table aqy add column context varchar(500) default null comment '内容' after name;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> describe aqy;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| context | varchar(500) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> select * from aqy;
Empty set (0.00 sec)
mysql>
建库,使用库,选择表
mysql> create database ks_db2;
Query OK, 1 row affected (0.01 sec)
mysql> use ks_db2;
Database changed
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ks_db2 |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec)
mysql> show tables;
+------------------+
| Tables_in_ks_db2 |
+------------------+
| 留言 |
+------------------+
1 row in set (0.01 sec)
mysql> describe 留言;
+-------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| info | varchar(5000) | YES | | NULL | |
| date | datetime | YES | | NULL | |
+-------+---------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> select * from 留言
-> ;
-> ;
+----+---------+--------------+---------------------+
| id | name | info | date |
+----+---------+--------------+---------------------+
| 1 | fsdfdsa | fasdfas | 2024-09-11 11:17:48 |
| 2 | fsadfsa | fsadf5hyhega | 2024-09-11 11:17:51 |
+----+---------+--------------+---------------------+
2 rows in set (0.00 sec)
mysql> insert into 留言 values (3,12,13,null)
-> ;
Query OK, 1 row affected (0.01 sec)
mysql> select * from 留言
-> ;
+----+---------+--------------+---------------------+
| id | name | info | date |
+----+---------+--------------+---------------------+
| 1 | fsdfdsa | fasdfas | 2024-09-11 11:17:48 |
| 2 | fsadfsa | fsadf5hyhega | 2024-09-11 11:17:51 |
| 3 | 12 | 13 | NULL |
+----+---------+--------------+---------------------+
3 rows in set (0.00 sec)
mysql> select name from 留言;
+---------+
| name |
+---------+
| fsdfdsa |
| fsadfsa |
| 12 |
+---------+
3 rows in set (0.00 sec)
增删改查
增
语法
以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
参数说明:
table_name 是你要插入数据的表的名称。
column1, column2, column3, ... 是表中的列名。
value1, value2, value3, ... 是要插入的具体数值。
如果数据是字符型,必须使用单引号 ' 或者双引号 ",如: 'value1', "value1"。
一个简单的实例,插入了一行数据到名为 users 的表中:
INSERT INTO users (username, email, birthdate, is_active)
VALUES ('test', 'test@runoob.com', '1990-01-01', true);
username: 用户名,字符串类型。
email: 邮箱地址,字符串类型。
birthdate: 用户生日, 日期类型。
is_active: 是否已激活,布尔类型。
如果你要插入所有列的数据,可以省略列名:
INSERT INTO users
VALUES (NULL,'test', 'test@runoob.com', '1990-01-01', true);
删
mysql> use RUNOOB;
Database changed
mysql> DELETE FROM runoob_tbl WHERE runoob_id=3;
Query OK, 1 row affected (0.23 sec)
以下实例演示了如何使用 DELETE 语句。
1. 删除符合条件的行:
DELETE FROM students
WHERE graduation_year = 2021;
以上 SQL 语句删除了 students 表中所有 graduation_year 为 2021 的学生的记录。
2. 删除所有行:
DELETE FROM orders;
以上 SQL 语句删除了 orders 表中的所有记录,但表结构保持不变。
3. 使用子查询删除符合条件的行:
DELETE FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
WHERE order_date < '2023-01-01'
);
以上 SQL 语句通过子查询删除了 orders 表中在 '2023-01-01' 之前下的订单对应的客户。
注意: 在使用 DELETE 语句时,请确保你提供了足够的条件来确保只有你想要删除的行被删除。如果不提供 WHERE 子句,将删除表中的所有行,可能导致不可预测的结果。
改
SQL UPDATE 语句:
mysql> UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;
Query OK, 1 rows affected (0.01 sec)
mysql> SELECT * from runoob_tbl WHERE runoob_id=3;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
| 3 | 学习 C++ | RUNOOB.COM | 2016-05-06 |
+-----------+--------------+---------------+-----------------+
1 rows in set (0.01 sec)
以下实例演示了如何使用 UPDATE 语句。
1. 更新单个列的值:
UPDATE employees
SET salary = 60000
WHERE employee_id = 101;
2. 更新多个列的值:
UPDATE orders
SET status = 'Shipped', ship_date = '2023-03-01'
WHERE order_id = 1001;
3. 使用表达式更新值:
UPDATE products
SET price = price * 1.1
WHERE category = 'Electronics';
以上 SQL 语句将每个属于 'Electronics' 类别的产品的价格都增加了 10%。
4. 更新符合条件的所有行:
UPDATE students
SET status = 'Graduated';
以上 SQL 语句将所有学生的状态更新为 'Graduated'。
5. 更新使用子查询的值:
UPDATE customers
SET total_purchases = (
SELECT SUM(amount)
FROM orders
WHERE orders.customer_id = customers.customer_id
)
WHERE customer_type = 'Premium';
以上 SQL 语句通过子查询计算每个 'Premium' 类型客户的总购买金额,并将该值更新到 total_purchases 列中。
注意: 在使用 UPDATE 语句时,请确保你提供了足够的条件来确保只有你想要更新的行被修改。如果不提供 WHERE 子句,将更新表中的所有行,可能导致不可预测的结果。
查
-- 选择所有列的所有行
SELECT * FROM users;
-- 选择特定列的所有行
SELECT username, email FROM users;
-- 添加 WHERE 子句,选择满足条件的行
SELECT * FROM users WHERE is_active = TRUE;
-- 添加 ORDER BY 子句,按照某列的升序排序
SELECT * FROM users ORDER BY birthdate;
-- 添加 ORDER BY 子句,按照某列的降序排序
SELECT * FROM users ORDER BY birthdate DESC;
-- 添加 LIMIT 子句,限制返回的行数
SELECT * FROM users LIMIT 10;
进阶
-- 使用 AND 运算符和通配符
SELECT * FROM users WHERE username LIKE 'j%' AND is_active = TRUE;
-- 使用 OR 运算符
SELECT * FROM users WHERE is_active = TRUE OR birthdate < '1990-01-01';
-- 使用 IN 子句
SELECT * FROM users WHERE birthdate IN ('1990-01-01', '1992-03-15', '1993-05-03');