1.数据库创建修改操作

—创建数据库
CREATE DATABASE atguigu
— 切换当前数据库
USE atguigu
— 查看数据库的所有表
SHOW TABLES FROM bookstore
— 创建表语句
CREATE TABLE student(
id INT,
name VARCHAR(20)
);
— sql语句规则
/
SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
每条命令以 ; 或 \g 或 \G 结束
关键字不能被缩写也不能分行
关于标点符号
必须保证所有的()、单引号、双引号是成对结束的
必须使用英文状态下的半角输入方式
字符串型和日期时间类型的数据可以使用单引号(’ ‘)表示
列的别名,尽量使用双引号(” “),而且不建议省略as
/
— 查询语句
SELECT FROM student
— 添加语句
INSERT INTO student VALUES(1,’张成’)
— 查询创建表的语句
SHOW CREATE TABLE student
— 查询创建数据库语句
SHOW CREATE DATABASE atguigu
— 删除表
DROP TABLE student
— 删除数据库
DROP DATABASE atguigu
— select
SELECT 9/2 AS 结果;
— select from 开发时不建议用 这是一个不负责任的行为
SELECT
FROM student
— select xx from 查询对应列 xx
SELECT id FROM student
— 起别名 不建议省略as 建议加上”” 可以包含空格和特殊字符
SELECT id AS “序号” FROM student
— 去除重复行 DISTINCT
SELECT DISTINCT id FROM student
— null参与运算 结果等于null null是占空间的 不等于0
SELECT NULL+12;
— 显示表结构
DESC student
— 过滤条件 where
SELECT id FROM student WHERE id = 0;
— 算术运算符
— 加+、减-、乘、除/ or div和取模% or mod
SELECT 1+2;
SELECT 9 MOD 3;
— 比较运算符 返回1为真 0为假 其他null
SELECT ‘1’ = 1
SELECT ‘1’ <=> 1
SELECT 1 != 1
— between and 在..之间
SELECT
FROM student WHERE BETWEEN 1 AND 5
— in 在…
SELECT FROM student WHERE IN(1,2,3)
— not in 不在…
SELECT
FROM student WHERE NOT IN(1,2,3)
— like 像… %:匹配0个或多个字符。_:只能匹配一个字符。
SELECT FROM student WHERE name LIKE ‘%成’
— 逻辑运算符
SELECT
FROM student WHERE id > 0 AND id < 3;
SELECT FROM student WHERE id > 0 OR id = 1;
SELECT
FROM student WHERE id NOT BETWEEN 5 AND 9;
SELECT FROM student WHERE id NOT IN (2,5,8);
SELECT
FROM student WHERE id > 1 OR name LIKE ‘%成’
— 排序 和 分页
— 插入测试数据
INSERT INTO student VALUES(2,’张大成’);
INSERT INTO student VALUES(3,’小成’);
INSERT INTO student VALUES(4,’张小’);
INSERT INTO student VALUES(5,’张小成’);
— order by desc倒序 asc升序(默认)
SELECT FROM student ORDER BY id DESC
— 多列排序 第一列相同 再对第二列排序
SELECT
FROM student ORDER BY id,name DESC
— 分页 limit x,y x表示从第几条数据 y表示显示多少行
SELECT FROM student LIMIT 1,3
— 分页显式公式:(当前页数-1)
每页条数,每页条数
— 测试类
CREATE TABLE class(
name VARCHAR(20),
dept VARCHAR(20)
);

INSERT INTO class VALUES(‘张成’,’班长’);
INSERT INTO class VALUES(‘张大成’,’团支书’);
INSERT INTO class VALUES(‘张小’,’纪委’);
SELECT * FROM student
— 多表查询 也叫关联查询 前提两表是有关系的 多对一或一对多
— 会产生笛卡尔积 为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。
SELECT student.name,class.dept FROM student,class
— 上面查询有15行 出现了笛卡尔积
— 这次加了过滤条件 只有3行
SELECT student.name,class.dept FROM student,class
WHERE student.name = class.name
— 总结:连接 n个表,至少需要n-1个连接条件。比如,连接三个表,至少需要两个连接条件。

— join on 语法 where 表A join 表b on 连接条件
SELECT student.name,class.dept FROM student JOIN class ON student.name = class.name
— union 关键字 可以给出多条SELECT语句,并将它们的结果组合成单个结果集。
SELECT FROM student
UNION ALL
SELECT
FROM class

— 函数 分为单行函数 和 多行函数
— abs返回绝对值 rand()随机值
SELECT
ABS(-123),ABS(32),SIGN(-23),SIGN(43z),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32),
FLOOR(-43.23),MOD(12,5)
FROM DUAL;
— 日期
SELECT NOW();
— IFNULL
SELECT 2+IFNULL(NULL,2);
— IF
SELECT IF(1>0,’正确’,’错误’);
— 加密解密函数 用于存密码
SELECT MD5(‘zc123456’)
SELECT SHA(‘zc123456’) #更安全
SELECT PASSWORD(‘zc123456’)
— 聚合函数
SELECT AVG(id),MAX(id),MIN(id),SUM(id) FROM student
— count()会统计值为 NULL 的行,
— 而 count(列名)不会统计此列为 NULL 值的行。
SELECT COUNT(id) FROM student
— 分组
selectr
FROM class GROUP BY dept
— having关键字 和where的区别 having一般来过滤使用聚合函数
— HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;
— select查询关键字的顺序是不能颠倒的:
— SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT…
— SELECT 语句的执行顺序(在 MySQL 和 Oracle 中,SELECT 执行顺序基本相同)
— FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
— 比如你写了一个 SQL 语句,那么它的关键字顺序和执行顺序是下面这样的:
/
SELECT DISTINCT player_id, player_name, count(
) as num # 顺序 5
FROM player JOIN team ON player.team_id = team.team_id # 顺序 1
WHERE height > 1.80 # 顺序 2
GROUP BY player.team_id # 顺序 3
HAVING num > 2 # 顺序 4
ORDER BY num DESC # 顺序 6
LIMIT 2 # 顺序 7
*/

/*
4.3 SQL 的执行原理
SELECT 是先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:

  1. 首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
  2. 通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;
  3. 添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟
    表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。
    当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得
    到是我们的原始数据。
    SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT…
    FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
    SELECT DISTINCT player_id, player_name, count() as num # 顺序 5
    FROM player JOIN team ON player.team_id = team.team_id # 顺序 1
    WHERE height > 1.80 # 顺序 2
    GROUP BY player.team_id # 顺序 3
    HAVING num > 2 # 顺序 4
    ORDER BY num DESC # 顺序 6
    LIMIT 2 # 顺序 7
    北京宏福校区:010-56253825 深圳西部硅谷校区:0755-23060254 上海大江商厦校区:021-57652717
    当我们拿到了查询数据表的原始数据,也就是最终的虚拟表 vt1 ,就可以在此基础上再进行 WHERE 阶
    段 。在这个阶段中,会根据 vt1 表的结果进行筛选过滤,得到虚拟表 vt2 。
    然后进入第三步和第四步,也就是 GROUP 和 HAVING 阶段 。在这个阶段中,实际上是在虚拟表 vt2 的
    基础上进行分组和分组过滤,得到中间的虚拟表 vt3 和 vt4 。
    当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到 SELECT 和 DISTINCT
    阶段 。
    首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表
    vt5-1 和 vt5-2 。
    当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段 ,得到
    虚拟表 vt6 。
    最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段 ,得到最终的结果,对应的是虚拟表
    vt7 。
    当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略。
    同时因为 SQL 是一门类似英语的结构化查询语言,所以我们在写 SELECT 语句的时候,还要注意相应的
    关键字顺序,所谓底层运行的原理,就是我们刚才讲到的执行顺序。
    /