创建数据库
CREATE DATABASE NAME;
创建表
# 中括号[]是可选的意思,命令中不带中括号
CREATE TABLE table_name (
column1 datatype [NULL or NOT NULL] [DEFAULT 默认值] [AUTO_INCREMENT PRIMARY KEY],
column2 datatype,
...
// 上边没有PRIMARY KEY可以在最下边指定
[PRIMARY KEY(column1, colums2, ...)]
) [ENGINE=InnoDB];
插入数据
插入完整行
INSERT INTO zzz VALUES (v1, v2, ...);
这个语法依赖值的定义次序,不安全。
INSERT INTO zzz (name, age, sex, ...) VALUES (v1, v2, ...);
这种语法指定列名,不需要全部列指定。
插入多个行
INSERT INTO zzz (name, age, sex, ...) VALUES (v1, v2, ...), VALUES(v1,v2,...), ...;
插入检索出的数据
INSERT INTO zzz (name, sex, ...) SELECT xxx, yyy, ... FROM ttt;
将从 ttt 检索的数据插入 zzz,查询的表项要和插入的表项一一对应。
查询
DISTINCT
查询出的行一定都是唯一的,DISTINCT 会应用于所有列,而不仅仅是前置它的列。
SELECT DISTINCT xxx,yyy FROM zzz;
LIMIT
限制返回行数,默认从 0 行数,否则第一个为起点,第二个为行数。
SELECT * FROM zzz LIMIT 5,5;
ORDER BY
对一行或多行排序,也可以用非选择列排序,默认升序,DESC指定为降序。同时使用 ORDER BY 和 WHERE 子句的时候 ORDER BY 要放后边
# 按 xxx 降序排列,如果 xxx 相同,则按 yyy 升序排列
SELECT xxx,yyy FROM zzz ORDER BY xxx DESC, yyy;
WHERE
对某些列按条件过滤数据。条件:
-
= 等于
-
<> 或 != 不等于
-
<= < > >= 小于等于、小于、大于、大于等于
-
BETWEEN 指定两个值之间
-
IS NULL 空值检查
-
IN 判断元素是否在一个集合里
SELECT age FROM zzz WHERE age IN (2,4,6,8);
-
AND OR NOT 两个条件的且、或、非运算
SELECT age FROM zzz WHERE (age BETWEEN 5 AND 10) OR (age > 18) and (NOT sex='f');
LIKE
LIKE如果不使用通配符,就就相当于等值判断,LIKE通配符:
-
% 匹配任意字符任意次数,但不能匹配 NULL。
SELECT name FROM zzz WHERE name LIKE 'Tom%'
-
_ 下划线匹配任意单个字符,两个就是匹配任意两个字符。
SELECT name FROM zzz WHERE name LIKE '__Tom%'
REGEXP
加强版 LIKE。
创建计算字段(列)
想要查询一个原表不存在的列,但可以由源表某些列计算得到。
拼接 CONCAT
# RTrim去除右边的空格
SELECT CONCAT (id , 分隔符, RTrim(name)), id, name from zzz
算数计算
SELECT age+age as new col, id, name from zzz
别名 AS
设置列的别名
# RTrim去除右边的空格
SELECT CONCAT (id , 分隔符, RTrim(name)) AS newcol, id, name from zzz
数据处理函数
- Upper/Lower() 大/小写字符串
- Length() 串的长处
- Locate() 子串
- L/RTrim() 去掉左/右边的空格
- Abs()、cos()、exp()、mod()、pi()、rand(), sin(), sqrt(), tan()
聚集函数
运行在行组上,返回单个值。
- AVG() 返回某列平均值
- COUNT() 返回某列行数
- MAX() MIN() 返回某列最值
- SUM() 返回某列和
# DISTINCT 指明只计算不同值的 sum
SELECT SUM(DISTINCT age) as newcol, MAX(age) as xxx from zzz;
GROUP BY 分组
聚集函数只会返回一行,分组会分为n个逻辑组,每个逻辑组计算聚集函数,返回n 行。
# 根据男女分组
SELECT SUM(DISTINCT age) as newcol, MAX(age) as xxx from zzz GROUP BY sex;
HAVING 对分组内的数据过滤
HAVING 支持所有 WHERE的子句,他的作用是对每个分组内的数据过滤。
HAVING和WHERE的差别: 这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
SELECT 子句顺序
SELECT FROM [WHERE] [GROUP BY] [HAVING] [ORDER BY] [LIMIT]
子查询(嵌套查询)
一个查询的结果作为另一个查询语句中的一部分
作为条件
SELECT name FROM zzz WHERE age in (
SELECT age FROM yyy WHERE sex='f'
)
作为计算字段
SELECT name, ( SELECT COUNT(*) FROM yyy WHERE yyy.name=zzz.name)
FROM zzz;
连结表(join)
两个表做笛卡尔积然后做等值过滤
内部联结
SELECT s_name, t_name FROM students INNER JOIN teachers ON students.class = teachers.class
SELECT s_name, t_name FROM students, teachers WHERE students.class = teachers.class
自联结
使用表别名即可
SELECT * from zzz as a inner join zzz as b on a.name=b.date
自然联结
应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结(前一章中介绍的内部联结)返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。需要自己手动操作,显示需要的列。
外部联结
弱化的等值联结,也就是左外联结会包含内部联结的所有行以及左边表中右边没有匹配到的行各有一行且右边的表项全为 NULL。
对于左边的每一行:遍历右边每一行,如果联结值相等,则两行拼接。如果遍历完没有任何一行匹配,则右边拼接 NULL。
组合查询 UNION
将多次查询结果合并。不同的查询必须包含相同的列,表达式或聚集函数。列数据类型必须兼容。
SELECT age FROM zzz UNION SELECT id*id FROM zzz
更新数据 UPDATE
UPDATE zzz SET name='xxx' WHERE id = 3;
删除数据 DELETE
DELETE FROM zzz WHERE id=3;
标签:...,name,age,基础,Mysql,WHERE,SELECT,zzz
From: https://www.cnblogs.com/hellozhangjz/p/18058378