夯实根基之MySql从入门到精通(一)
- 引言
- [1. 使用MySQL数据库和表](#1. 使用MySQL数据库和表)
- [2. MySql 数据类型](#2. MySql 数据类型)
-
- [2.1. 数字类型](#2.1. 数字类型)
- [2.2. 日期和时间类型](#2.2. 日期和时间类型)
- [2.3. 字符串类型](#2.3. 字符串类型)
- [2.4. JSON类型](#2.4. JSON类型)
- [2.5. 其他类型](#2.5. 其他类型)
- [3. MySql运算符](#3. MySql运算符)
-
- [3.1. 数学运算符](#3.1. 数学运算符)
- 3.2.比较运算符
- 3.3.逻辑运算符
- [3.4. 位运算符](#3.4. 位运算符)
- 3.5.字符串运算符
- 3.6.正则表达式运算符
- 3.7.特殊运算符
- [4. MySql操作数据](#4. MySql操作数据)
-
- [4.1. 创建(Create)](#4.1. 创建(Create))
- [4.2. 读取(Read)](#4.2. 读取(Read))
- [4.3. 更新(Update)](#4.3. 更新(Update))
- [4.4. 删除(Delete)](#4.4. 删除(Delete))
- [5. MySQL 函数](#5. MySQL 函数)
-
- [5.1. 数学函数](#5.1. 数学函数)
- [5.2. 字符串函数](#5.2. 字符串函数)
- [5.3. 日期和时间函数](#5.3. 日期和时间函数)
- [5.4. 条件函数](#5.4. 条件函数)
- [5.5. 聚合函数](#5.5. 聚合函数)
- [5.6. 加密函数](#5.6. 加密函数)
- [5.7. MySQL的控制流函数](#5.7. MySQL的控制流函数)
- [5.8. 格式化函数](#5.8. 格式化函数)
-
- [5.8.1 日期和时间格式化函数](#5.8.1 日期和时间格式化函数)
- [5.8.2 数字格式化函数](#5.8.2 数字格式化函数)
- 5.8.3.字符串格式化函数
- [5.9. 类型转换函数](#5.9. 类型转换函数)
-
- [5.9. 1. CAST() 函数](#5.9. 1. CAST() 函数)
- [5.9. 2. CONVERT() 函数](#5.9. 2. CONVERT() 函数)
- [5.9. 3. 类型特定转换函数](#5.9. 3. 类型特定转换函数)
引言
MySQL是一个广泛使用的开源关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,后来被Sun Microsystems收购,最终成为Oracle Corporation的一部分。MySQL是一个基于客户端-服务器模型的数据库,支持多种操作系统,包括Linux、Windows和macOS。MySQL是一个功能强大、灵活且易于使用的数据库系统,适用于各种规模的应用程序。通过学习和使用MySQL,可以有效地管理和操作关系型数据。
1. 使用MySQL数据库和表
使用MySQL时,主要通过SQL(Structured Query Language)进行数据库操作,包括:
创建数据库:CREATE DATABASE database_name;
选择数据库:USE database_name;
删除数据库:DROP database database_name;
显示数据库列表:SHOW databases;
显示数据库中的表: show tables;
显示指定数据库中的表: show tables from database_name;
显示表的描述:describe tale_name;
创建表:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
删除表:dorp table table_name;
修改表名称 :alter table table_name rename to new_talbe_name; rename table table_name to new_table_name;
为表添加一个字段 :alter table table_name add name_name varchar(25) not null;
修改字段的定义 :alter table table_name change name_name new_name_name int(30);
删除表的字段:alter table table_name drop name_name;
2. MySql 数据类型
在MySQL中,数据类型定义了列中可以存储的数据的类型和范围。正确选择数据类型对于确保数据的完整性和优化性能至关重要。以下是一些常用的MySQL数据类型;
2.1. 数字类型
-
整数类型:
TINYINT
:-128 到 127(有符号),0 到 255(无符号)SMALLINT
:-32768 到 32767(有符号),0 到 65535(无符号)MEDIUMINT
:-8388608 到 8388607(有符号),0 到 16777215(无符号)INT
或INTEGER
:-2147483648 到 2147483647(有符号),0 到 4294967295(无符号)BIGINT
:-9223372036854775808 到 9223372036854775807(有符号),0 到 18446744073709551615(无符号)
-
定点数类型:
DECIMAL
或NUMERIC
:可以指定精度(数值的总位数)和小数位数。
-
浮点数类型:
FLOAT
:单精度浮点数。DOUBLE
:双精度浮点数。
-
位类型:
BIT
:可以存储二进制值。BOOLEAN
:TINYINT(1)
的同义词。
2.2. 日期和时间类型
-
日期和时间类型:
DATE
:格式为YYYY-MM-DD
。TIME
:格式为HH:MM:SS
。DATETIME
:格式为YYYY-MM-DD HH:MM:SS
。TIMESTAMP
:与DATETIME
类似,但会根据时区调整。
-
年月类型:
YEAR
:格式为YYYY
。
2.3. 字符串类型
-
字符类型:
CHAR
:固定长度的字符串,长度在1到255个字符之间。VARCHAR
:可变长度的字符串,长度在1到65,535个字符之间。
-
二进制字符串类型:
BINARY
:固定长度的二进制字符串。VARBINARY
:可变长度的二进制字符串。BLOB
:二进制大对象,用于存储大量二进制数据。TEXT
:文本字符串类型,用于存储大量字符数据。
-
枚举类型:
ENUM
:允许从预定义的值列表中选择一个值。
-
集合类型:
SET
:允许从预定义的值列表中选择多个值。
2.4. JSON类型
JSON
:用于存储JSON数据。
2.5. 其他类型
SERIAL
:类似于BIGINT
,但自动增长。
示例
sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
birth_date DATE,
last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
data JSON
);
在这个例子中,users
表有五个字段,分别使用了不同的数据类型:整数、可变长度字符串、日期、时间戳和JSON,AUTO_INCREMENT自增;
选择正确的数据类型对于数据库设计至关重要,它可以帮助确保数据的准确性,优化存储空间的使用,并提高查询性能。在设计数据库时,应根据数据的特性和应用需求仔细选择数据类型。
3. MySql运算符
在MySQL中,运算符用于执行各种操作,如数学计算、比较、逻辑判断等。以下是MySQL中一些常用的运算符:
3.1. 数学运算符
- 加法 :
+
- 减法 :
-
- 乘法 :
*
- 除法 :
/
- 求模(取余) :
%
3.2.比较运算符
- 等于 :
=
- 不等于 :
!=
或<>
- 大于 :
>
- 小于 :
<
- 大于等于 :
>=
- 小于等于 :
<=
3.3.逻辑运算符
- 逻辑非 :
NOT
- 逻辑与 :
AND
- 逻辑或 :
OR
3.4. 位运算符
- 按位与 :
&
- 按位或 :
|
- 按位异或 :
^
- 按位非 :
~
- 左移 :
<<
- 右移 :
>>
3.5.字符串运算符
- 连接 :
CONCAT(str1, str2, ...)
3.6.正则表达式运算符
- 匹配 :
REGEXP
或RLIKE
- 不匹配 :
NOT REGEXP
或NOT RLIKE
3.7.特殊运算符
- 同列比较 :
=
、<>
、<
、>
、<=
、>=
- IN:检查某个值是否在指定的列表中。
- IS NULL:检查某个值是否为NULL。
- IS NOT NULL:检查某个值是否不为NULL。
- BETWEEN:检查某个值是否在两个值之间。
- LIKE:用于搜索列中的指定模式。
- NOT LIKE:用于搜索列中不匹配指定模式的值。
示例
sql
SELECT *
FROM users
WHERE age > 18 AND age < 60
AND username LIKE 'A%'
AND status = 'active';
select a-b form users;
在这个例子中,我们使用了比较运算符(>
、<
、=
)和字符串运算符(LIKE
)来查询年龄在18到60岁之间,用户名以'A'开头,且状态为'active'的用户。
运算符是MySQL查询语言的基础,它们使得数据检索和操作变得灵活和强大。正确使用运算符可以编写出高效且精确的SQL查询。
4. MySql操作数据
在MySQL中,增删改查(CRUD)操作是数据库管理的基本操作,它们分别代表创建(Create)、读取(Read)、更新(Update)和删除(Delete)数据。以下是这些操作的基本SQL语句:
4.1. 创建(Create)
创建数据通常是指向数据库表中插入新记录。使用INSERT INTO
语句来实现:
sql
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
如果插入所有列并且所有列都有默认值,可以省略列名:
sql
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
进阶插入
sql
INSERT INTO table_name
set fname=value1;
4.2. 读取(Read)
读取数据是指从数据库表中查询数据。使用SELECT
语句来实现:
sql
SELECT column1, column2, column3, ...
FROM table_name
WHERE condition;
如果没有指定列名,将选择所有列:
sql
SELECT *
FROM table_name
WHERE condition;
4.3. 更新(Update)
更新数据是指修改数据库表中的现有记录。使用UPDATE
语句来实现:
sql
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
4.4. 删除(Delete)
删除数据是指从数据库表中移除记录。使用DELETE FROM
语句来实现:
sql
DELETE FROM table_name
WHERE condition;
如果没有指定条件,将删除表中的所有记录,这是非常危险的操作,通常不推荐使用。
示例
假设有一个名为users
的表,包含id
、name
和email
三个列。
创建(插入)数据
sql
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');
读取(查询)数据
sql
SELECT * FROM users;
更新数据
sql
UPDATE users
SET email = 'alice_new@example.com'
WHERE name = 'Alice';
删除数据
sql
DELETE FROM users
WHERE name = 'Alice';
注意事项
- 在执行增删改操作时,应该始终注意数据的完整性和一致性。
- 使用
WHERE
子句可以指定条件,以确保只影响满足条件的记录。 - 在执行删除操作时应该特别小心,以免意外删除重要数据。
- 在更新或删除数据之前,建议先进行查询操作,确认将要操作的记录是正确的。
5. MySQL 函数
MySQL提供了大量的内置函数,用于执行各种操作,如数学计算、字符串处理、日期和时间处理等。这些函数可以在SQL查询中使用,以便于数据处理和分析。以下是一些常用的MySQL函数:
5.1. 数学函数
ABS(x)
:返回x的绝对值。CEIL(x)
或CEILING(x)
:返回大于或等于x的最小整数。FLOOR(x)
:返回小于或等于x的最大整数。MOD(a, b)
:返回a除以b的余数。POW(x, y)
或POWER(x, y)
:返回x的y次幂。ROUND(x, y)
:返回x四舍五入到y小数位的值。SQRT(x)
:返回x的平方根。
5.2. 字符串函数
CONCAT(str1, str2, ...)
:返回连接字符串的结果。LENGTH(str)
或CHAR_LENGTH(str)
:返回字符串的长度。SUBSTRING(str, start, length)
:返回从start位置开始,长度为length的字符串。REPLACE(str, search, replace)
:返回替换字符串中search子串为replace后的结果。UPPER(str)
:返回字符串的大写形式。LOWER(str)
:返回字符串的小写形式。TRIM(str)
:返回去除字符串首尾空格后的结果。LTRIM(str)
:返回去除字符串左侧空格后的结果。RTRIM(str)
:返回去除字符串右侧空格后的结果。
5.3. 日期和时间函数
-
CURDATE()
:返回当前日期。 -
CURTIME()
:返回当前时间。 -
NOW()
:返回当前日期和时间。 -
DATE_ADD(date, INTERVAL expr type)
:给定日期加上一个时间间隔。 -
DATE_SUB(date, INTERVAL expr type)
:给定日期减去一个时间间隔。 -
DATE_FORMAT(date, format)
:返回格式化的日期。 -
TIME_FORMAT(time, format)
:返回格式化的时间。5.4. 条件函数
-
IF(condition, true_value, false_value)
:如果条件为真,返回true_value,否则返回false_value。 -
CASE expression WHEN value THEN result [WHEN ...] [ELSE result] END
:类似于SQL的CASE表达式。
5.5. 聚合函数
COUNT(expr)
:返回表达式中非NULL值的数量。SUM(expr)
:返回表达式中所有值的总和。AVG(expr)
:返回表达式中所有值的平均值。MAX(expr)
:返回表达式中的最大值。MIN(expr)
:返回表达式中的最小值。
5.6. 加密函数
MD5(str)
:返回字符串的MD5哈希值。SHA1(str)
:返回字符串的SHA1哈希值。- password(str):返回字符串的加密串。 不可逆,区分大小写。
- encrypt(str,key):带KEY的加密串。不可逆。
- encode(str,key),decode(str,key):可逆的加密算法。加密程度不高。
- aes_encrypt(str,key),aes_decrypt(str,key):可逆的加密算法。加密程度高。
示例
sql
SELECT
CONCAT(name, ' ', surname) AS full_name,
ROUND(salary * 1.1, 2) AS salary_with_bonus,
DATE_FORMAT(hire_date, '%Y-%m-%d') AS formatted_hire_date
FROM
employees;
在这个例子中,我们使用了CONCAT
来连接名字和姓氏,ROUND
来计算带奖金的工资,以及DATE_FORMAT
来格式化入职日期。
5.7. MySQL的控制流函数
MySQL的控制流函数允许在SQL查询中实现条件逻辑和循环逻辑。这些函数主要用于复杂的查询和数据操作,它们可以控制数据的处理流程。以下是一些常用的MySQL控制流函数:
IF()
IF()
函数是一个条件函数,它根据指定的条件返回两个值中的一个。如果条件为真,返回第一个值;如果条件为假,返回第二个值。
sql
SELECT IF(condition, true_value, false_value);
CASE()
CASE()
函数提供了更灵活的条件判断能力,类似于编程语言中的switch
语句或if-else
链。它可以处理多个条件,并根据条件返回相应的值。
sql
SELECT CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END;
IFNULL()
IFNULL()
函数用于检查两个参数中的任何一个是否为NULL。如果第一个参数是NULL,则返回第二个参数的值;否则返回第一个参数的值。
sql
SELECT IFNULL(value1, value2);
COALESCE()
COALESCE()
函数返回其参数列表中的第一个非NULL值。
sql
SELECT COALESCE(value1, value2, ..., valueN);
NULLIF()
NULLIF()
函数检查两个参数是否相等。如果相等,返回NULL;否则返回第一个参数的值。
sql
SELECT NULLIF(value1, value2);
存储过程和函数中的控制流语句
除了上述函数外,MySQL还提供了在存储过程和函数中使用的控制流语句,如:
BEGIN ... END
:用于将多条语句组合成一个代码块。IF ... THEN ... ELSE
:用于在存储过程和函数中实现条件逻辑。WHILE
:用于在存储过程和函数中实现循环逻辑。LOOP
:用于在存储过程和函数中实现循环逻辑。REPEAT
:用于在存储过程和函数中实现循环逻辑,直到满足特定条件。LEAVE
:用于立即退出循环。ITERATE
:用于继续下一次循环迭代。
示例:使用存储过程和控制流语句
sql
DELIMITER //
CREATE PROCEDURE GetEmployeeDetails(IN emp_id INT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE cur_name VARCHAR(100);
DECLARE cur_salary DECIMAL(10, 2);
DECLARE cur CURSOR FOR SELECT name, salary FROM employees WHERE id = emp_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO cur_name, cur_salary;
IF done THEN
LEAVE read_loop;
END IF;
SELECT cur_name, cur_salary;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
5.8. 格式化函数
MySQL提供了多种格式化函数,用于将数据转换成特定的格式。这些函数在处理日期、时间、数字和字符串时非常有用。以下是一些常用的MySQL格式化函数:
5.8.1 日期和时间格式化函数
-
DATE_FORMAT(date, format):返回格式化的日期。
sqlSELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
-
TIME_FORMAT(time, format):返回格式化的时间。
sqlSELECT TIME_FORMAT(NOW(), '%H:%i:%s');
-
FROM_UNIXTIME(unix_timestamp, format):将UNIX时间戳转换为格式化的日期和时间。
sqlSELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d %H:%i:%s');
5.8.2 数字格式化函数
-
FORMAT(x, d):将数字x格式化为带有d位小数的字符串。
sqlSELECT FORMAT(1234.5678, 2); // 结果: '1234.57'
-
ROUND(x, d):将数字x四舍五入到d位小数。
sqlSELECT ROUND(1234.5678, 2); // 结果: 1234.57
5.8.3.字符串格式化函数
-
CONCAT(str1, str2, ...):连接字符串。
sqlSELECT CONCAT('Hello', ' ', 'World'); // 结果: 'Hello World'
-
CONCAT_WS(separator, str1, str2, ...):使用指定的分隔符连接字符串。
sqlSELECT CONCAT_WS('-', '2023', '10', '10'); // 结果: '2023-10-10'
-
REPLACE(str, search_str, replace_str):在字符串中替换子串。
sqlSELECT REPLACE('Hello World', 'World', 'MySQL'); // 结果: 'Hello MySQL'
-
SUBSTRING(str, position, length):返回字符串的子串。
sqlSELECT SUBSTRING('Hello World', 1, 5); // 结果: 'Hello'
-
TRIM(str):去除字符串两端的空格。
sqlSELECT TRIM(' Hello World '); // 结果: 'Hello World'
-
LPAD(str, length, pad_str):用另一个字符串填充当前字符串,使其达到指定的长度。
sqlSELECT LPAD('Hello', 10, '-'); // 结果: '---Hello---'
-
RPAD(str, length, pad_str):同LPAD,但是填充在字符串的右侧。
sqlSELECT RPAD('Hello', 10, '-'); // 结果: 'Hello-----'
-
LTRIM(str):去除字符串左侧的空格。
sqlSELECT LTRIM(' Hello World'); // 结果: 'Hello World'
-
RTRIM(str):去除字符串右侧的空格。
sqlSELECT RTRIM('Hello World '); // 结果: 'Hello World'
这些格式化函数可以帮助你在查询和数据处理时,将数据转换成所需的格式。通过使用这些函数,可以提高数据的可读性和易用性。
5.9. 类型转换函数
在MySQL中,类型转换函数用于将一种数据类型转换为另一种数据类型。这些函数在处理数据时非常有用,尤其是在数据类型不匹配或需要特定格式时。以下是一些常用的MySQL类型转换函数:
5.9. 1. CAST() 函数
CAST()
函数用于将一个表达式转换为指定的数据类型。
sql
SELECT CAST(column_name AS data_type);
-
将字符串转换为整数:
sqlSELECT CAST('123' AS SIGNED);
-
将整数转换为日期:
sqlSELECT CAST(123456 AS DATE);
-
将日期转换为字符串:
sqlSELECT CAST(NOW() AS CHAR(50));
5.9. 2. CONVERT() 函数
CONVERT()
函数与CAST()
类似,也用于数据类型转换,但CONVERT()
提供了更多的灵活性,特别是在转换为字符串时。
sql
SELECT CONVERT(data_type, column_name);
-
将日期转换为字符串:
sqlSELECT CONVERT(CURDATE(), CHAR(50));
-
将字符串转换为浮点数:
sqlSELECT CONVERT(123.456, FLOAT);
5.9. 3. 类型特定转换函数
MySQL还提供了一些专门用于特定类型转换的函数:
-
INT() :将一个值转换为整数。
sqlSELECT INT('123');
-
FLOAT() :将一个值转换为浮点数。
sqlSELECT FLOAT('123.456');
-
DOUBLE() :将一个值转换为双精度浮点数。
sqlSELECT DOUBLE('123.456');
-
DECIMAL() :将一个值转换为定点数。
sqlSELECT DECIMAL('123.456', 10, 2);
-
CHAR() :将一个值转换为字符。
sqlSELECT CHAR(65); // 输出 'A'
-
DATE() :将一个值转换为日期。
sqlSELECT DATE('2023-10-10');
-
TIME() :将一个值转换为时间。
sqlSELECT TIME('14:20:30');
-
DATETIME() :将一个值转换为日期和时间。
sqlSELECT DATETIME('2023-10-10 14:20:30');
-
TIMESTAMP() :将一个值转换为时间戳。
sqlSELECT TIMESTAMP('2023-10-10 14:20:30');