DBMS
DBMS 的英文全称是 DataBase Management System,数据库管理系统,实际上它可以对
多个数据库进行管理,所以你可以理解为 DBMS =多个数据库(DB - DataBase) + 管理程序。
SQL功能
类型 | 功能 |
---|---|
DDL - Data Definition Language - 数据定义语言 | 用来定义我们的数据库对象,包括数据库、数据表和列。通过使用DDL,我们可以创建,删除和修改数据库和表结构。 |
DML - Data Manipulation Language - 数据操作语言 | 操作和数据库相关的记录,比如增加、删除、修改数据表中的记录。 |
DCL - Data Control Language - 数据控制语言 | 用它来定义访问权限和安全级别。 |
DQL - Data Query Language - 数据查询语言 | 用它查询想要的记录 |
DDL
-
创建数据库
CREATE DATABASE **;
-
删除数据库
DROP DATABASE **;
-
创建表
CREATE TABLE [数据库名称].[表名] (表结构);
CREATE TABLE [table_name](字段名 数据类型,......)
-
删除表
DROP TABLE IF EXISTS [table_name];
-
添加字段
ALTER TABLE player ADD (age int(11));
-
修改字段名
ALTER TABLE player RENAME COLUMN age to player_age
-
修改字段数据类型
ALTER TABLE player MODIFY (player_age float(3,1));
-
删除字段
ALTER TABLE player DROP COLUMN player_age;
DQL
-
查询
SELECT [字段名], [字段名] AS [别名] FROM [表名]
-
添加常量
SELECT '[常量]' as platform, [字段名] FROM [表名]
-
去重
SELECT DISTINCT [字段名] FROM [表名]
-
排序 - 升降
SELECT [字段名], [字段名] FROM [表名] ORDER BY [字段名]
SELECT [字段名], [字段名] FROM [表名] ORDER BY [字段名] DESC
-
约束
Mysql
SELECT [字段名], [字段名] FROM [表名] ORDER BY [字段名] DESC LIMIT [数量]
Oracle
SELECT [字段名], [字段名] FROM [表名] WHERE ROWNUM <=5
执行顺序
-
关键字顺序
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
-
语句执行顺序
FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT
WHERE数据过滤
- 比较运算符
含义 | 运算符 |
---|---|
等于 | = |
不等于 | <>或!= |
小于 | < |
小于等于(大不于) | <=或!> |
大于 | > |
大于等于(不小于) | >=或!< |
在指定的两个数值之间 | BETWEEN |
为空值 | IS NULL |
- 逻辑运算符
含义 | 运算符 |
---|---|
并且 | AND |
或者 | OR |
在指定条件范围内 | IN |
非(否定) | NOT |
SQL://例子
SELECT name, role_main, role_assist, hp_max, mp_max, birthdate
FROM heros
WHERE (role_main IN ('法师', '射手') OR role_assist IN ('法师', '射手'))
AND DATE(birthdate) NOT BETWEEN '2016-01-01' AND '2017-01-01'
ORDER BY (hp_max + mp_max) DESC
- 通用匹配符%
SELECT name FROM heros WHERE name LIKE '%太%'
SQL 函数
- 算术函数
函数名 | 定义 |
---|---|
ABS() | 取绝对值 |
MOD() | 取余 |
ROUND() | 四舍五入为指定的小数位数,需要有两个参数,分别为字段名称、小数位数 |
- 字符串函数
函数名 | 定义 |
---|---|
CONCAT() | 将多个字符串拼接起来 |
LENGTH() | 计算字段的长度,一个汉字算三个字符,一个数字或字母算一个字符 |
CHAR LENGTH() | 计算字段的长度,汉字、数字、字母都算一个字符 |
LOWER() | 将字符串中的字符转化为小写 |
UPPER() | 将字符串中的字符转化为大写 |
REPLACE() | 替换函数,有3个参数,分别为:要替换的表达式或字段名、想要查找的被替换宇符串、替换成哪个字符串 |
SUBSTRING() | 截取宇符串,有3个参数,分别为:待截取的表达式或字段名、开始截取的位置、想要截取的字符串长度 |
- 日期函数
函数名 | 定义 |
---|---|
CURRENT DATE() | 系统当前日期 |
CURRENT TIME() | 系统当前时间,没有具体的日期 |
CURRENT TIMESTAMP() | 系统当前时间,包括具体的日期+时间 |
EXTRACT() | 抽取具体的年、月、日 |
DATE() | 返回时间的日期部分 |
YEAR() | 返回时间的年份部分 |
MONTH() | 返回时间的月份部分 |
DAY() | 返回时间的天数部分 |
HOUR() | 返回时间的小时部分 |
MINUTE() | 返回时间的分钟部分 |
SECOND() | 返回时间的秒部分 |
例子
SELECT EXTRACT(YEAR FROM '2022-04-13')
- 转换函数
函数名 | 定义 |
---|---|
CAST() | 数据类型转换,参数是一个表达式,表达式通过AS关键词分割了2个c参数,分别是原始数据和目标数据类型 |
COALESCE() | 返回第一个非空数值 |
- 聚集函数
函数名 | 定义 |
---|---|
COUNT() | 总行数 |
MAX() | 最大值 |
MIN() | 最小值 |
SUM() | 求和 |
AVG() | 平均值 |
注意的是 COUNT([字段名])与其他聚集函数会忽略 null 值行,而 COUNT(*) 不会忽略
- GROUP BY ,HAVING
SELECT COUNT(*) as num, role_main, role_assist FROM heros
WHERE hp_max > 6000 GROUP BY role_main, role_assist
HAVING num > 5 ORDER BY num DESC
子查询
分类
- 关联子查询:查询的执行和主查询相关,需耍执行多次;
SELECT player_name, height FROM player
WHERE height = (SELECT max(height) FROM player)
- 非关联子查询:子查询的执行与生查询执行无关,只需要执行一次即可;
SELECT player_name, height, team_id FROM player AS a
WHERE height > (SELECT avg(height) FROM player AS b
WHERE a.team_id = b.team_id)
关键字
-
EXIST , NO EXIST子查询
用来判断条件是否满足:
SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc)
-
集合比较子查询
-
IN - 判断是否在集合中
SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
假如A表比B表大则使用IN子查询效率高,反之EXIST效率高 -
ANY - 需要与比较操作符一起使用,与子查询返回的任何值做比较
-
ALL - 需要与比较操作符一起使用,与子查询返回的所有值做比较
-
SOME - 实际上是ANY的别名,作用相同,一般常使用ANY
92,99连接
- 交叉连接,笛卡尔积
连接表所有可能的组合
92: SELECT * FROM player, team
99: SELECT * FROM player CROSS JOIN team
99: SELECT * FROM t1 CROSS JOIN t2 CROSS JOIN t3
-
等值连接
92 连接
92: SELECT player_id, a.team_id FROM player as a, team as b WHERE a.team_id = b.team_id
自然连接
99: SELECT player_id, team_id FROM player NATURAL JOIN team
ON 连接
99:SELECT player_id, player.team_id FROM player JOIN team ON player.team_id = team.team_id
USING 连接
99:SELECT player_id, team_id FROM player JOIN team USING(team_id)
-
非等值连接
92:SELECT p.player_name, p.height, h.height_level
FROM player AS p, height_grades AS h
WHERE p.height BETWEEN h.height_lowest AND h.height_highest
99:SELECT p.player_name, p.height, h.height_level
FROM player as p JOIN height_grades as h
ON height BETWEEN h.height_lowest AND h.height_highest
- 外连接
类型 | 语法 |
---|---|
左外连接(92) | SELECT * FROM player, team where player.team_id = team.team_id(+) |
左外连接(92) | SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id |
右外连接(92) | SELECT * FROM player, team where player.team_id(+) = team.team_id |
右外连接(99) | SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id |
全外连接 | SELECT * FROM player FULL JOIN team ON player.team_id = team.team_id |
-
自连接
92:SELECT b.player_name, b.height FROM player as a , player as b WHERE a.player_name = '布雷克-格里芬' and a.height < b.height
99:SELECT b.player_name, b.height FROM player as a JOIN player as b ON a.player_name = '布雷克-格里芬' and a.height < b.height
-
99 连接的优势
//像for循环嵌套般清晰
SELECT ...
FROM table1
JOIN table2 ON table1和table2的连接条件
JOIN table3 ON table2和table3的连接条件
视图
- 创建
CREATE VIEW view_name AS
SELECT column1, column2
FROM table
WHERE condition
- 修改
ALTER VIEW view_name AS
SELECT column1, column2
FROM table
WHERE condition
- 删除
DROP VIEW view_name
网友评论