连接
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;
显示:
指定条件查询:
SHOW CHARACTER SET LIKE 'utf%';
字段含义:
Charset: 字符集的名称;
Description:字符集的简单描述;
Default collation:该字符集的默认字符序;
Maxlen:该字符集中字符最大存储长度。
字符序
每个字符集都对应一个或多个字符序,可以通过下面的语句查看所有的字符序:
SHOW COLLATION;
指定条件查询:
SHOW COLLATION WHERE Charset = 'utf8mb4';
结果:
字段含义:
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。
字符集与字符序的关系
字符集与字符序的关系可以上面的图来表示:
每个字符集都有一个或多个字符序;
每个字符集都有一个默认的字符序;
每个字符序都关联一个且只有一个字符集;
两个不同的字符集没有相同的字符序。
删除数据库
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
日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
注意:
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 SET 和 COLLATE 子句:
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子句
简单实例
等于条件:
SELECT * FROM users WHERE username = 'test';
不等于条件:
SELECT * FROM users WHERE username != 'runoob';
大于条件:
SELECT * FROM products WHERE price > 50.00;
小于条件:
SELECT * FROM orders WHERE order_date < '2023-01-01';
大于等于条件:
SELECT * FROM employees WHERE salary >= 50000;
小于等于条件:
SELECT * FROM students WHERE age <= 21;
组合条件(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;
模糊匹配条件(LIKE):
SELECT * FROM customers WHERE first_name LIKE 'J%';
IN 条件:
SELECT * FROM countries WHERE country_code IN ('US', 'CA', 'MX');
NOT 条件:
SELECT * FROM products WHERE NOT category = 'Clothing';
BETWEEN 条件:
SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
IS NULL 条件
SELECT * FROM employees WHERE department IS NULL;
IS NOT NULL 条件:
SELECT * FROM customers WHERE email IS NOT NULL;
如果我们想在 MySQL 数据表中读取指定的数据,WHERE 子句是非常有用的。
使用主键来作为 WHERE 子句的条件查询是非常快速的。
如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。
模糊匹配条件(LIKE)
%
概念:表示任意0个或多个字符,可匹配任意类型和长度的字符。有些情况下是中文,需用两个百分号(%%)表示
例 :
将 u_name 为“张三”、“张猫三”、“三脚猫”、“唐三藏”等有“三”的记录全找出来
SELECT * FROM [user] WHERE u_name LIKE ‘%三%’
1
如果须要找出 u_name 中既有“三”又有“猫”的记录,请运用 and 条件
SELECT * FROM [user] WHERE u_name LIKE ‘%三%’ AND u_name LIKE ‘%猫%’
1
虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”
SELECT * FROM [user] WHERE u_name LIKE ‘%三%猫%’
_
概念: 表示任意单个字符。匹配单个任意字符,它常用来限定表达式的字符长度语句
例 :
只找出“唐三藏”这样 u_name 为三个字且中间一个字是“三”的;
SELECT * FROM [user] WHERE u_name LIKE ‘三’
1
只找出“三脚猫”这样 name 为三个字且第一个字是“三”的;
SELECT * FROM [user] WHERE u_name LIKE ‘三__’;
[ ]
概念:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个
例 :
找出“张三”、“李三”、“王三”(而非“张李王三”);
SELECT * FROM [user] WHERE u_name LIKE ‘[张李王]三’
1
注意 :如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”
将找出“老1”、“老2”、……、“老9”;
SELECT * FROM [user] WHERE u_name LIKE ‘老[1-9]’
[^]
概念:表示不在括号所列之内的单个字符。其取值和 [ ] 相同,但它要求所匹配对象为指定字符以外的任一个字符
例 :
将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
SELECT * FROM [user] WHERE u_name LIKE ‘[^张李王]三’
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 语句。
更新单个列的值:
UPDATE employees
SET salary = 60000
WHERE employee_id = 101;
更新多个列的值:
UPDATE orders
SET status = 'Shipped', ship_date = '2023-03-01'
WHERE order_id = 1001;
使用表达式更新值:
UPDATE products
SET price = price * 1.1
WHERE category = 'Electronics';
以上 SQL 语句将每个属于 'Electronics' 类别的产品的价格都增加了 10%。
更新符合条件的所有行:
UPDATE students
SET status = 'Graduated';
以上 SQL 语句将所有学生的状态更新为 'Graduated'。
更新使用子查询的值:
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 子句是非常有用的。