文章目录
Mysql 入门学习<一>
SQL
通用语法
- sql语句以分号结尾,可以单行或者多行书写。
- sql不区分大小写,关键字建议使用大写。
- 注释:
- 单行注释: – / #
- 多行注释 /* */
sql分类
- DDL
- 数据定义语言,用来定义数据库对象(数据库、表、字段)
- DML
- 数据库操作语言,用来对数据库表中的数据进行增删改
- DQL
- 数据查询语言,用来查询数据库中表的记录
- DCL
- 数据控制语言,用来创建数据库用户、控制数据库的访问权限
数据类型
数值类型
MySQL 支持所有标准 SQL 数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。
作为 SQL 标准的扩展,MySQL 也支持整数类型 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不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
类型 | 大小 ( 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:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型*
字符串类型指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 | 极大文本数据 |
DDL-数据库操作
DataBase 操作
查询
查询所有数据库:SHOW DATABASES;
查询当前数据库:SELECT DATABASE();
创建
CREATE DATABASE [IF NOT EXISTS]数据库名[DEFAULT CHARSET 字符集][COLLATE 排序规则];
删除
DROP DATABASE[IF EXISTS] 数据库名;
使用
USER 数据库名
Table 操作*
查询数据库所有表
SHOW TABLES;
查询表结构
DESC 表名;
查询指定表的建表语句
SHOW CREATE TABLE 表名;
创建表
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;
删除表
DROP TABLE table_name ;
删除指定表,并重新创建该表
TRUNCATE TABLE 表名;
添加字段
ALTER TABLE '表名' ADD 字段名 类型[COMMENT 注释][约束]
修改字段数据类型
ALERT TABLE '表名'MODIFY 字段名 新数据类型(长度);
修改字段名和字段类型
ALERT TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)[COMMENT 注释][约束];
删除字段
ALERT TABLE 表名 DROP 字段名;
修改表名
ALERT TABLE 表名 RENAME TO 新表名;
小结
DDL 主要是对数据库中的数据库、表、字段进行增删改查操作。如:创建删除数据库、表、字段,还可以对字段和表进行重命名。
DML-数据操作
介绍
全称是数据库操作语言,用来对数据库中表的数据进行记录进行增删查改操作。
- 添加数据(INSERT)
- 修改数据(UPDATE)
- 删除数据(DELETE)
添加数据
给指定字段添加数据
INSERT INTO TABLE_NAME(FIELD1,FIELD2,....) VALUES(VALUE1,VALUE2,....);
给全部字段添加数据
INSERT INTO TABLE_NAME VALUES(VALUE1,VALUE2,....);
批量添加数据
INSERT INTO TABLE_NAME(FIELD1,FIELD2,....) VALUES(VALUE1,VALUE2,...)(VALUE1,VAULE2,...);
ISNERT IINTO TABLE_NAME VALUES(VALUE1,VALUE2,....)
修改数据
UPDATE TABLE_NAME SET FIELD1=VALUE1,FIELD2=VALUE2,.... [WHERE 条件]
删除数据
DELETE FROM TABLE_NAME [WHERE 条件]
小结
添加数据
- 如果未指定字段名,则对所有字段进行插入数据。
- 指定字段名,则对指定字段进行插入数据。
- 可以进行批量插入数据。
- INSERT INTO TABLE_NAME(FIELD1,FIELD2,…) VALUES(VALUE1,VALUE2,…);
删除数据
- 删除指定条件的数据。
- 删除所有表数据。
- DELET FROM TABLE_NAME [WHERE 条件]。
修改数据
- 指定条件,则对满足条件的数据记录进行对指定的字段进行修改数据。
- 未指定条件,则对表所有记录进行对指定的字段进行修改数据。
DQL-数据查询
语法
SELECT
FIELD1,FIELD2,....
FROM
TABLE_NAME
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
基本查询
查询多个字段
SELECT FIELD1,FIELD2 FROM TABLE_NAME;
SELECT * FROM TABLE_NAME;
设置别名
SELECT FIELD1[AS 别名],FIELD2[AS 别名]... FROM TABLE_NAME;
去除重复记录
SELECT DISTINCT FIELD1,FIELD2,..... FROM TABLE_NAME
条件查询
语法
SELECT FIELD_LIST FROM TABLE_NAME WHERE 条件列表
(FIELD_LIST=>(field1,field2,…))
条件
操作符 | 描述 |
---|---|
= | 等号,检测两个值是否相等,如果相等返回true |
<>, != | 不等于,检测两个值是否相等,如果不相等返回true |
> | 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true |
< | 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true |
>= | 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true |
<= | 小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true |
BETWEEN…AND… | 在某个范围之内(含最小,最大值) |
IN(…) | 在in之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配(_匹配单个字符、%匹配任意个字符) |
IS NULL | 是NULL |
AND 或 && | 并且 |
OR 或 || | 或者 |
NOT 或 ! | 非 |
聚合函数
介绍
将一列数据作为一个整体,进行纵向计算。
常见聚合函数
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
语法
SELECT 聚合函数(FIELD_LSIT) FROM TABLE_NAME;
分组查询
语法
SELECT FIELD_LIST FROM TABLE_NAME [WHERE 条件] GROUP BY 分组字段名[HAVING 分组后过滤条件]
WHERE 与 HAVING区别
- 执行时机不同:WHERE是分组前进行过滤,不满足条件不参与分组,而HAVING是分组之后对结果进行过滤。
- 判断条件不同:WHERE不能对聚合函数进行判断,而HAVING可以。
排序查询
语法
SELECT FIELD_LIST FROM TABLE_NAME ORDER BY FIELD1 排序方式,FIELD2 排序方式;
排序方式
- ASC:升序(默认值)
- DESC:降序
- 对于多字段排序,如果前面的字段值相同时,再根据后面的字段值进行大小排序
分页查询
语法
SELECT FIELD_LIST FROM TABLE_NAME LIMIT 起始索引,查询记录;
注意
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
- 分页查询是不同的数据库有不同的实现
- 如果查询到是第一页数据,起始索引可以省略,直接简写LIMIT NUMBER
力扣学习
SELECT
`name`,`population`,`area`
FROM
World
WHERE
`area` >=3000000 or `population`>=25000000;
SELECT
product_id
FROM
Products
WHERE
recyclable = 'Y' and low_fats = 'Y'
SELECT
`name`
FROM
customer
WHERE
referee_id !=2 or referee_id IS NULL;
SELECT
`name` as Customers
FROM
Customers
WHERE
`Id` NOT IN (SELECT CustomerId FROM Orders)
SELECT
a.firstName, a.lastName,b.city,b.state
FROM
Person as a
LEFT JOIN
Address as b
ON
a.personId = b.personId
SELECT
(SELECT DISTINCT
Salary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1) AS SecondHighestSalary
;
# 先进行降序排序,再使用LIMIT 查询第二个记录
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary
# 使用IFNULL函数保证没有第二大记录的时候返回一个null