菜单

Mysql 基本语法


发布于 2024-10-28 / 5 阅读 / 0 评论 /
连接 mysql -u your_username -p -u 参数用于指定用户名。 -p 参数表示需要输入密码 实例

连接

mysql -u your_username -p
  • -u 参数用于指定用户名。

  • -p 参数表示需要输入密码

实例

以下是从命令行中连接 mysql 服务器的简单实例:

[root@host]# mysql -u root -p
Enter password:******

按照提示输入密码,并按下 Enter 键。

在登录成功后会出现 mysql> 命令提示窗口,你可以在上面执行任何 SQL 语句。

以上命令执行后,登录成功输出结果如下:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2854760 to server version: 5.0.9
​
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

在以上实例中,我们使用了 root 用户登录到 MySQL 服务器,当然你也可以使用其他 MySQL 用户登录。

如果用户权限足够,任何用户都可以在 MySQL 的命令提示窗口中进行 SQL 操作。

成功连接到 MySQL 后,你可以在命令行中直接执行 SQL 查询。

列出所有可用的数据库:

SHOW DATABASES;

选择要使用的数据库:

USE your_database;

列出所选数据库中的所有表:

SHOW TABLES;

退出 mysql> 命令提示窗口可以使用 exit 命令,如下所示:

mysql> EXIT;
Bye

或者使用:

mysql> QUIT;

或者按下 Ctrl + D(在 Unix/Linux 系统中)。

创建数据库

CREATE DATABASE [IF NOT EXISTS] database_name
  [CHARACTER SET charset_name]
  [COLLATE collation_name];
  • [IF NOT EXISTS]如果创建数据库不存在

  • [CHARACTER SET]设定字符集

  • [COLLATE]设定字符序

字符集

通过命令: mysql -u your_username -p,输入密码,连接上MySQL后,用下面命令查询MySQL 支持的字符集

SHOW CHARACTER SET;

显示:

img

指定条件查询:

SHOW CHARACTER SET LIKE 'utf%';

img

字段含义:

  • Charset: 字符集的名称;

  • Description:字符集的简单描述;

  • Default collation:该字符集的默认字符序;

  • Maxlen:该字符集中字符最大存储长度。

字符序

每个字符集都对应一个或多个字符序,可以通过下面的语句查看所有的字符序:

SHOW COLLATION;

img

指定条件查询:

SHOW COLLATION WHERE Charset = 'utf8mb4';

结果:

img

字段含义:

  • Collation:字符序名称;

  • Charset:该字符序关联的字符集;

  • Id:字符序ID;

  • Default:该字符序是否是所关联的字符集的默认字符序。比armscii8_general_ci就是armscii8的默认字符序,而armscii8_bin就不是;

  • Compiled:字符集是否已编译到服务器中;

  • Sortlen:这与对以字符集表示的字符串进行排序所需的内存量有关;

  • Pad_attribute:这表明了字符序在比较字符串时对末尾padding的处理。NO PAD表明在比较字符串时,末尾的padding也会考虑进去,否则不考虑。

每个字符序都是以该字符序所关联的字符集为前缀的,同时还有一些有规律的后缀:

  • bin:二进制;

  • ci:大小写不敏感;

  • cs:大小写敏感;

  • ai:口音(Accent)不敏感;

  • as:口音敏感;

  • ks:假名(Kanatype)敏感。

同时有的字符序是面向某种语言的,也会在字符序名字中有所体现,比如big5_chinese_ci。

字符集与字符序的关系

img

字符集与字符序的关系可以上面的图来表示:

  • 每个字符集都有一个或多个字符序;

  • 每个字符集都有一个默认的字符序;

  • 每个字符序都关联一个且只有一个字符集;

  • 两个不同的字符集没有相同的字符序。

删除数据库

DROP DATABASE [IF EXISTS] database_name;
  • IF EXISTS 是一个可选的子句,表示如果数据库存在才执行删除操作,避免因为数据库不存在而引发错误。

  • database_name 是你要删除的数据库的名称。

选择数据库

USE database_name;
  • database_name 是你要选择的数据库的名称。

数据表类型

数据类型

  • 严格数据类型:INTEGER、SMALLINT、DECIMAL 和 NUMERIC

  • 近似数据类型:FLOAT、REAL 和 DOUBLE PRECISION

  • 拓展整数类型:TINYINT、MEDIUMINT 和 BIGINT

类型

大小

范围(有符号)

范围(无符号)

用途

TINYINT

1 Bytes

(-128,127)

(0,255)

小整数值

SMALLINT

2 Bytes

(-32 768,32 767)

(0,65 535)

大整数值

MEDIUMINT

3 Bytes

(-8 388 608,8 388 607)

(0,16 777 215)

大整数值

INT或INTEGER

4 Bytes

(-2 147 483 648,2 147 483 647)

(0,4 294 967 295)

大整数值

BIGINT

8 Bytes

(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)

(0,18 446 744 073 709 551 615)

极大整数值

FLOAT

4 Bytes

(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)

0,(1.175 494 351 E-38,3.402 823 466 E+38)

单精度 浮点数值

DOUBLE

8 Bytes

(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

双精度 浮点数值

DECIMAL

对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2

依赖于M和D的值

依赖于M和D的值

小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

类型

大小 ( bytes)

范围

格式

用途

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

'-838:59:59'/'838:59:59'

HH:MM:SS

时间值或持续时间

YEAR

1

1901/2155

YYYY

年份值

DATETIME

8

'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

YYYY-MM-DD hh:mm:ss

混合日期和时间值

TIMESTAMP

4

'1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYY-MM-DD hh:mm:ss

混合日期和时间值,时间戳

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型

大小

用途

CHAR

0-255 bytes

定长字符串

VARCHAR

0-65535 bytes

变长字符串

TINYBLOB

0-255 bytes

不超过 255 个字符的二进制字符串

TINYTEXT

0-255 bytes

短文本字符串

BLOB

0-65 535 bytes

二进制形式的长文本数据

TEXT

0-65 535 bytes

长文本数据

MEDIUMBLOB

0-16 777 215 bytes

二进制形式的中等长度文本数据

MEDIUMTEXT

0-16 777 215 bytes

中等长度文本数据

LONGBLOB

0-4 294 967 295 bytes

二进制形式的极大文本数据

LONGTEXT

0-4 294 967 295 bytes

极大文本数据

注意

  • char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

  • CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

  • BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

  • BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

  • 有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

枚举与集合类型

  • ENUM: 枚举类型,用于存储单一值,可以选择一个预定义的集合。

  • SET: 集合类型,用于存储多个值,可以选择多个预定义的集合。

空间数据类型

GEOMETRY, POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION: 用于存储空间数据(地理信息、几何图形等)

创建数据表

CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
);
  • table_name 是你要创建的表的名称。

  • column1, column2, ... 是表中的列名。

  • datatype 是每个列的数据类型。

创建 MySQL 数据表需要以下信息:

  • 表名

  • 表字段名

  • 定义每个表字段的数据类型

实例

Example 1

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
);

实例解析:

  • id: 用户 id,整数类型,自增长,作为主键。

  • username: 用户名,变长字符串,不允许为空。

  • email: 用户邮箱,变长字符串,不允许为空。

  • birthdate: 用户的生日,日期类型。

  • is_active: 用户是否已经激活,布尔类型,默认值为 true。

  • AUTO_INCREMENT 关键字用于创建一个自增长的列,PRIMARY KEY 用于定义主键

Example 2

如果你希望在创建表时指定数据引擎,字符集和排序规则等,可以使用 CHARACTER SETCOLLATE 子句:

CREATE TABLE mytable (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Example 3

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 设置编码。

删除数据表

DROP TABLE table_name ;    -- 直接删除表,不检查是否存在
或
DROP TABLE [IF EXISTS] table_name;

参数说明:

  • table_name 是要删除的表的名称。

  • IF EXISTS 是一个可选的子句,表示如果表存在才执行删除操作,避免因为表不存在而引发错误。

插入数据

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

参数说明:

  • table_name 是你要插入数据的表的名称。

  • column1, column2, column3, ... 是表中的列名。

  • value1, value2, value3, ... 是要插入的具体数值。

如果数据是字符型,必须使用单引号 ' 或者双引号 ",如: 'value1', "value1"。

实例

Example 1

INSERT INTO users (username, email, birthdate, is_active)
VALUES ('test', 'test@runoob.com', '1990-01-01', true);
  • username: 用户名,字符串类型。

  • email: 邮箱地址,字符串类型。

  • birthdate: 用户生日, 日期类型。

  • is_active: 是否已激活,布尔类型。

Example 2

如果你要插入所有列的数据,可以省略列名:

INSERT INTO users
VALUES (NULL,'test', 'test@runoob.com', '1990-01-01', true);

这里,NULL 是用于自增长列的占位符,表示系统将为 id 列生成一个唯一的值。

Example 3

如果你要插入多行数据,可以在 VALUES 子句中指定多组数值:

INSERT INTO users (username, email, birthdate, is_active)
VALUES
    ('test1', 'test1@runoob.com', '1985-07-10', true),
    ('test2', 'test2@runoob.com', '1988-11-25', false),
    ('test3', 'test3@runoob.com', '1993-05-03', true);

查询数据

SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column_name [ASC | DESC]]
[LIMIT number];

参数说明:

  • column1, column2, ... 是你想要选择的列的名称,如果使用 * 表示选择所有列。

  • table_name 是你要从中查询数据的表的名称。

  • WHERE condition 是一个可选的子句,用于指定过滤条件,只返回符合条件的行。

  • ORDER BY column_name [ASC | DESC] 是一个可选的子句,用于指定结果集的排序顺序,默认是升序(ASC)。

  • LIMIT number 是一个可选的子句,用于限制返回的行数。

实例

Example 1

-- 选择所有列的所有行
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;

Example 2

SELECT 语句可以是灵活的,我们可以根据实际需求组合和使用这些子句,比如同时使用 WHERE 和 ORDER BY 子句,或者使用 LIMIT 控制返回的行数。

在 WHERE 子句中,你可以使用各种条件运算符(如 =, <, >, <=, >=, !=),逻辑运算符(如 AND, OR, NOT),以及通配符(如 %)等。

以下是一些进阶的 SELECT 语句实例:

-- 使用 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');

WHERE子句

操作符

描述

实例

=

等号,检测两个值是否相等,如果相等返回true

(A = B) 返回false。

<>, !=

不等于,检测两个值是否相等,如果不相等返回true

(A != B) 返回 true。

>

大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true

(A > B) 返回false。

<

小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true

(A < B) 返回 true。

>=

大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true

(A >= B) 返回false。

<=

小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true

(A <= B) 返回 true。

简单实例

  1. 等于条件:

SELECT * FROM users WHERE username = 'test';
  1. 不等于条件:

SELECT * FROM users WHERE username != 'runoob';
  1. 大于条件:

SELECT * FROM products WHERE price > 50.00;
  1. 小于条件:

SELECT * FROM orders WHERE order_date < '2023-01-01';
  1. 大于等于条件:

SELECT * FROM employees WHERE salary >= 50000;
  1. 小于等于条件:

SELECT * FROM students WHERE age <= 21;
  1. 组合条件(AND、OR):

SELECT * FROM products WHERE category = 'Electronics' AND price > 100.00;

SELECT * FROM orders WHERE order_date >= '2023-01-01' OR total_amount > 1000.00;
  1. 模糊匹配条件(LIKE):

SELECT * FROM customers WHERE first_name LIKE 'J%';
  1. IN 条件:

SELECT * FROM countries WHERE country_code IN ('US', 'CA', 'MX');
  1. NOT 条件:

SELECT * FROM products WHERE NOT category = 'Clothing';
  1. BETWEEN 条件:

SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
  1. IS NULL 条件

SELECT * FROM employees WHERE department IS NULL;
  1. IS NOT NULL 条件:

SELECT * FROM customers WHERE email IS NOT NULL;

如果我们想在 MySQL 数据表中读取指定的数据,WHERE 子句是非常有用的。

使用主键来作为 WHERE 子句的条件查询是非常快速的。

如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。

模糊匹配条件(LIKE)

%

概念:表示任意0个或多个字符,可匹配任意类型和长度的字符。有些情况下是中文,需用两个百分号(%%)表示

  1. 将 u_name 为“张三”、“张猫三”、“三脚猫”、“唐三藏”等有“三”的记录全找出来

SELECT * FROM [user] WHERE u_name LIKE ‘%三%’
1
  1. 如果须要找出 u_name 中既有“三”又有“猫”的记录,请运用 and 条件

SELECT * FROM [user] WHERE u_name LIKE ‘%三%’ AND u_name LIKE ‘%猫%’
1
  1. 虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”

SELECT * FROM [user] WHERE u_name LIKE ‘%三%猫%’

_

概念: 表示任意单个字符。匹配单个任意字符,它常用来限定表达式的字符长度语句

  1. 只找出“唐三藏”这样 u_name 为三个字且中间一个字是“三”的;

SELECT * FROM [user] WHERE u_name LIKE ‘三’
1
  1. 只找出“三脚猫”这样 name 为三个字且第一个字是“三”的;

SELECT * FROM [user] WHERE u_name LIKE ‘三__’;

[ ]

概念:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个

  1. 找出“张三”、“李三”、“王三”(而非“张李王三”);

SELECT * FROM [user] WHERE u_name LIKE ‘[张李王]三’
1

注意 :如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”

  1. 将找出“老1”、“老2”、……、“老9”;

SELECT * FROM [user] WHERE u_name LIKE ‘老[1-9]’

[^]

概念:表示不在括号所列之内的单个字符。其取值和 [ ] 相同,但它要求所匹配对象为指定字符以外的任一个字符

  1. 将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;

SELECT * FROM [user] WHERE u_name LIKE ‘[^张李王]三’
1
  1. 排除“老1”到“老4”,寻找“老5”、“老6”、……

SELECT * FROM [user] WHERE u_name LIKE ‘老[^1-4]’;

IN

SQL IN 操作符 | 菜鸟教程 (runoob.com)

显示对应column含有指定值的所有row

NOT

否定它之后所跟的任何条件

BETWEEN

BETWEEN 操作符选取介于两个值之间的数据范围内的值,这些值可以是数值、文本或者日期。

IS NULL

如果值为NULL,则表达式返回true。否则,它返回false。

IS NOT NULL

如果值为NULL,则表达式返回false。否则,它返回true。

UPDATE更新

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

参数说明:

  • table_name 是你要更新数据的表的名称。

  • column1, column2, ... 是你要更新的列的名称。

  • value1, value2, ... 是新的值,用于替换旧的值。

  • WHERE condition 是一个可选的子句,用于指定更新的行。如果省略 WHERE 子句,将更新表中的所有行。

更多说明:

  • 你可以同时更新一个或多个字段。

  • 你可以在 WHERE 子句中指定任何条件。

  • 你可以在一个单独表中同时更新数据。

当你需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。

实例

以下实例演示了如何使用 UPDATE 语句。

  1. 更新单个列的值:

UPDATE employees
SET salary = 60000
WHERE employee_id = 101;
  1. 更新多个列的值:

UPDATE orders
SET status = 'Shipped', ship_date = '2023-03-01'
WHERE order_id = 1001;
  1. 使用表达式更新值:

UPDATE products
SET price = price * 1.1
WHERE category = 'Electronics';

以上 SQL 语句将每个属于 'Electronics' 类别的产品的价格都增加了 10%。

  1. 更新符合条件的所有行:

UPDATE students
SET status = 'Graduated';

以上 SQL 语句将所有学生的状态更新为 'Graduated'。

  1. 更新使用子查询的值:

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 列中。

DELETE语句

DELETE FROM table_name
WHERE condition;
  • table_name 是你要删除数据的表的名称。

  • WHERE condition 是一个可选的子句,用于指定删除的行。如果省略 WHERE 子句,将删除表中的所有行。

更多说明:

  • 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。

  • 你可以在 WHERE 子句中指定任何条件

  • 您可以在单个表中一次性删除记录。

当你想删除数据表中指定的记录时 WHERE 子句是非常有用的。

实例




是否对你有帮助?