参考廖雪峰的数据库知识 : Structured Query Language

传送门

workbench

在这里插入图片描述
在这里插入图片描述

关系模型:表格

  1. 选择数据类型的时候,要根据业务规则选择合适的类型。通常来说,BIGINT能满足整数存储的需求,==VARCHAR(N)==能满足字符串存储的需求,这两种类型是使用最广泛的。
  2. 主流的数据库
    在这里插入图片描述
  3. SQL具有的基本能力:
  • 数据定义
  • 数据操作(增添,修改,删除)
  • 数据查询
  1. “NULL”表示不存在,不是0或者空字符串
  2. 某个字段唯一区分出不同的记录,这个字段被称为主键, 主键的值不可能重复,是唯一标识。
  3. 选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。因为一旦这些规则变化了,后果很复杂。

查询

  1. 虽然SELECT可以用作计算,但它并不是SQL的强项。但是,不带FROM子句的SELECT语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条SELECT 1,来测试数据库连接。
# 
select 1
select * from students
select 100+200
  1. where 查询限制
SELECT * FROM students WHERE score >= 80 AND gender = 'M';
SELECT * FROM students WHERE score >= 80 OR gender = 'M';
SELECT * FROM students WHERE NOT class_id = 2;
SELECT * FROM students WHERE class_id <> 2;
SELECT * FROM students WHERE name LIKE 'ab%' # %ab%

SELECT * FROM students WHERE score >= 80 AND score<=90;
SELECT * FROM students WHERE score BETWEEN 80 AND 90;
SELECT * FROM students WHERE score IN (10,20,30)
  1. select * 是查询, select col1,col2…这种是投影查询
    可以选完后取别名: SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM …。
SELECT id, score, name FROM students;
SELECT id 'xixixi', score '哈哈哈', name 'lala' FROM students WHERE gender = 'M';


  1. 排序
SELECT id, name, gender, score FROM students ORDER BY score DESC;
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;

  1. 分页查询
    使用LIMIT OFFSET 可以对结果集进行分页,每次查询返回结果集的一部分;
    分页查询需要先确定每页的数量和当前页数,然后确定LIMIT和OFFSET的值
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 1;
  1. 聚合函数
  • 注意:聚合查询的列中,只能放入分组的列。
  • mysql中,当我们用到聚合函数,如sum,count后,又需要筛选条件时,having就派上用场了,因为WHERE是在聚合前筛选记录的,having和group by是组合着用的
SELECT COUNT(*) boys FROM students WHERE gender = 'M';
SELECT AVG(score) average FROM students WHERE gender = 'M';
SELECT MAX(score) average FROM students WHERE gender = 'M'
SELECT MIN(score) average FROM students WHERE gender = 'M'
SELECT SUM(score) average FROM students WHERE gender = 'M'

#分组聚合
SELECT COUNT(*) num FROM students GROUP BY class_id;
SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;
SELECT class_id,gender,avg(score) from students group by class_id,gender;

select cid,count(id) nums from xzyd_question group by cid HAVING nums>2
  1. 多表查询
SELECT
    students.id sid,
    students.name,
    students.gender,
    students.score,
    classes.id cid,
    classes.name cname
FROM students, classes;

SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c
WHERE s.gender = 'M' AND c.id = 1;
  1. 连接查询
  • INNER JOIN只返回同时存在于两张表的行数据
  • RIGHT OUTER JOIN返回右表都存在的行
  • LEFT OUTER JOIN则返回左表都存在的行
  • FULL OUTER JOIN

小结:
JOIN查询需要先确定主表,然后把另一个表的数据“附加”到结果集上;
INNER JOIN是最常用的一种JOIN查询,它的语法是SELECT … FROM <表1> INNER JOIN <表2> ON <条件…>;
JOIN查询仍然可以使用WHERE条件和ORDER BY排序

SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;

SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
RIGHT OUTER JOIN classes c
ON s.class_id = c.id;

SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
LEFT OUTER JOIN classes c
ON s.class_id = c.id;

SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
FULL OUTER JOIN classes c
ON s.class_id = c.id;

插入

INSERT INTO students (class_id, name, gender, score) VALUES
  (1, '大宝', 'M', 87),
  (2, '二宝', 'M', 81);

删除

DELETE FROM students WHERE id>=5 AND id<=7;

更新

UPDATE students SET score=score+10 WHERE score<80;

附录

MySQL 经典面试题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物琴弦光锥之外

给个0.1,恭喜老板发财

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值