这里写目录标题
数据库,表,行列
大小写不敏感
Navicat初识
- Ctrl+` 进入命令行界面
- 查询,新建查询,编写SQL文件
- 查看DDL,表上右键,对象信息,选DDL,可以看主键
数据库相关
VARCHAR 比 CHAR 更优,因为当CHAR字符不足50时,CHAR会自动填充剩余空间剩余空字符,导致空间浪费
PK 是否为主键
NN not null 是否可以为 NULL
AI 自动增进,常用于主键
Dafult 默认值
虽然有时候SQL语句很长,但是不要忘了是 ; 结尾
记得默认值DEFAULT 和 NULL
基础命令
SELECT 选择列
FROM 从哪个数据库
WHERE 选择条件
ORDER 排序原则
这几条语句顺序不能更改
SELECT 选择列
可以用来对选择的列进行一些转换
SELECT
*,
(poinys+10)*100 AS another
-- 可以看到,虽然我们已经引入了*,但是为了引入别名,还是另写了一行
只显示不重复的部分DISTINCT
SELECT * 选择全部
WHERE 结果集的条件
一些判断符
注:<>为不等于
=
!=
>
>=
<
<=
<>
条件运算符 AND OR NOT
建议利用换行使代码简洁
当然也可以结合其他列进行运算
其他运算符
(我也不知道是不是叫这个)
IN
(选择state使VA或FL或GA的行)
BETWEEN
(1000<=points<=3000)
LIKE
匹配模式串
WHERE state LIKE 'b%'
-- b后跟了若干字符
WHERE state LIKE '_y'
-- y前面跟了一个字符
WHERE state LIKE 'b__y'
-- b后两个字符,然后是一个y
REGEXP
功能更为强大的正则表达式
-- ^ beginning
-- $ end
-- | logical or
-- [] [amd]
-- - [a-f]
WHERE last_name REGEXP '^fff'
-- 必须以fff开头
WHERE last_name REGEXP 'fff$'
-- 必须以fff结尾
WHERE last_name REGEXP '^fff|mac|rose'
-- 以ff开头,或包含mac,或包含rose
WHERE last_name REGEXP '[gim]e'
-- 含有e且e之一个是g或i或m
WHERE last_name REGEXP '[a-h]e'
-- 含有e且e之前是a-h中的任意一个字符
IS NULL
WHERE last_name IS NULL
ORDER
后跟算术表达式
-- DESC 降序
ORDER BY first_name DESC
-- 优先级排序,即使某一列没有SELECT也可以按照该列排序(mysql是这样,其他不一定)
ORDER BY state DESC, first_name, xxx DESC
-- 用数字表示按照选择的第x列,如按照选择的第一列查询
-- 实际使用中应避免
ORDER BY 1
LIMIT
限制结果集的个数(行数)
-- 不足300的话就返回全部,否则返回前300
LIMIT 300
--跳过6个,读取3个:7,8,9
LIMIT 6:3
-- 语句顺序,在ORDER之后
SELECT
FROM
WHERE
ORDER
LIMIT
JOIN
和其他表结合,链接满足某些条件的,几个表中的数据。
有INNER RIGHT LEFT CROSS 四种,默认为INNER(这部分还妹看太懂)
SELECT order_id,o.customer_id, first_name, last_name
FROM orders o
JOIN customers c
ON o.customer_id = c.customer_id
-- orders中行A的customer_id和customers中行B的customer_id相等,则结果集中显示,o为orders的别名,c为customers的别名,定义别名之后无法使用原名,注意SELECT 语句中的o.customer_id,当两个表中有重名列时,必须精准定义
选择不属于当前数据库的表JOIN, 在表前加前缀
FROM sql_store.order_items oi
连接本表
reports_to:该用户属于哪个老板
employee_id:员工id
以下代码可以根据reports_to找到他的老板,并显示姓名
JOIN自己必须起别名
连接多个表
SELECT
o.order_id,
o.order_date,
c.first_name,
c.last_name,
os.name AS status
FROM orders o
JOIN customers c
ON o.customer_id = c.customer_id
JOIN order_statuses os
ON o.status = os.order_status_id
多个连接条件 AND
JOIN一般用主键作为条件连接选择条件
如果有复合主键存在,可以使用以下代码
LEFT 与RIGHT JOIN
SELECT
c.customer_id,
c.first_name,
o.order_id
FROM customers c
JOIN orders o
ON c.customer_id = o.customer_id
ORDER BY c.customer_id
INNER JOIN 结果如下
LEFT JOIN 结果如下
注:写的时候隐藏了OUTER,本为LEFT OUTER JOIN
JOIN的过程,就是对照着customerid,找到对应的orderd,将两行的结果放到一起,然后显示。如果找不到这样的两行,就不显示。
LEFT JOIN。就是,就算找不到右边那个orderid,也显示左表的数据,右表的数据显示为null。
尽量不适用RIGHT JOIN 否则会很乱
使用USING简化
FROM a
JOIN b
ON a.x=b.x
-- 等同于
FROM a
JOIN b
USING(x)
-- 适用于两个名字都一样的情况
--同样可以用于复合主键的清康
FROM a
JOIN b
ON a.x=b.x AND
a.y=b.y
-- 等同于
FROM a
JOIN b
USING(x,y)
-- 妙啊
NATURAL JOIN
数据库自行根据一些相同的列名进行联合,非常不推荐使用
CROSS JOIN
交叉连接,即笛卡尔连接,如图。
显式写法
SELECT
c.first_name AS customer,
p.name AS product
FROM customers c
CROSS JOIN products p
ORDER BY c.first_name
隐式写法
SELECT
c.first_name AS customer,
p.name AS product
FROM customers c, products p
ORDER BY c.first_name
UNION 联合多条SELECT
注意:SELECT 结果集的列数应该相等,UNION会将他们按上下连接
INSERT
name 插入的列
VALUES,插入数据
DEFAULT,使用默认值,
不指定的话,就是用默认值或者递增值
LSAT_INSERT_ID()
选中最后一条插入的列
CREATE TABLE xxx AS
通过复制当前表创建新表,这种情况下,MySQL会忽略列的特性,如该列是主键,是自动增量等
UPDATE SET
在WHERE中使用SEARCH
WHERE 适用于选择条件只有一种,如果有多种,如内部有WHERE <…等,要使用WHERE IN
DELECT
删除表中的某些列