一、SQL 能做什么
SQL 具体能完成下面功能:
- 面向数据库执行查询
- 可从数据库取回数据
- 可在数据库中插入新的记录
- 可更新数据库中的数据
- 可从数据库删除记录
- 可创建新数据库
- 可在数据库中创建新表
- 可在数据库中创建存储过程
- 可在数据库中创建视图
- 可以设置表、存储过程和视图的权限
总结起来,其实就“增删改查”四大功能,但是实际上我们平时用到最多的是查询
二、通用事项
1、SQL分类
2、operator 操作符
常用的有等于 =
、小于 <
、大于 >
、不等于<>
或 !=
3、其他
SQL 语句以 ;
作为结束的标志
table_name 表名
comuln_name 列名
三、DDL 定义语言
1、数据类型
2、数据库操作
3、表操作
需补充
四、增删改查
(1)查询
1、select "A" 输出A
select "A";
2、select column 查询列
在绝大部分时候,不加反引号 ` ` 并不会导致程序出错。但其实我们在命名字段的时候,字段名可能会与 SQL 关键字冲突,这时候要用反引号将列名和表名包含一下,避免关键字冲突。
1)查询单个列
select `name` from `teachers`;
2)查询多个列
SELECT `column_name_1`, `column_name_2`
FROM `table_name`;
3)查询所有列
select * from `teachers`;
4)查询不同行(distinct 去重)
SELECT DISTINCT `column_name`
FROM `table_name`
3、select where 对行进行筛选过滤
SELECT * from courses
WHERE student_count>1000;
4、group by 分组
其用于结合聚合函数,能根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表
(2)新增 insert into 插入数据
insert into 表(列1,列2..) values(内容1,内容2...)
INSERT INTO 语句用于向表中插入新记录,两种编写形式,第一种形式无需指定列名,第二种形式需要指定列名。
① 无需指定列名
需要为表中的每一列插入数据
注意:vslues( ) 除了 int 数字格式的外,其余的需要用 “ ”
INSERT INTO `courses` VALUES (13,'Python','400','2021-05-23',3);
返回结果增加(红框)
② 需要指定列名
如果我们只想在指定列中插入数据,那么这种写法会更为方便
INSERT INTO `courses` (`name`, `student_count`, `created_at`, `teacher_id`)
VALUES ('Flash Sale','100','2018-01-01',5);
(3)修改 update 更新数据
update 表 set 要改的内容 where 限定记录
注意
请注意 UPDATE 语句中的 WHERE 子句!WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE 子句,所有的记录都将被更新!
将教师名 name
为 "Linghu Chong" 的邮箱 email
更新为 'linghu.chong@lintcode.com'
UPDATE `teachers`
SET `email` = 'linghu.chong@lintcode.com'
WHERE `name` = 'Linghu Chong';
(4)删除 delete
删除表中所有数据
delete from column;
五、运算、筛选、排序
(1)比较运算符
A operator B
其中 operator 是比较运算符,用于对
A
和B
进行比较运算。常用的比较运算符有
=
(等于) 、!=
(不等于)、<>
(不等于)、<
(小于)、<=
(小于等于)、>
(大于)、>=
(大于等于),其中!=
和<>
在特殊情况下用法是不同的,这里暂时不提。比较运算符常常与 WHERE 在一起使用。WHERE 用于逻辑判断,WHERE 后面写判断的条件,满足条件的语句会被筛选出来。
WHERE 比较运算符的使用方式如下:A operator B
(2)and 连接多条件
使用 SQL 中的逻辑运算符 AND 可以将 WHERE 子句中两个或两个以上的条件结合起来,其结果是满足 AND 连接的所有条件的数据。
SELECT *
FROM courses
WHERE student_count >= 800 AND student_count < 1000;
(3)or 连接多个条件
使用 SQL 中的逻辑运算符 OR 与 AND 关键字不同,OR 关键字,只要记录满足任意一个条件,就会被查询出来。
SELECT *
FROM `courses`
WHERE `name` = 'System Design'
OR `name` = 'Django';
(4)not 过滤不满足条件的数据
使用 SQL 中的逻辑运算符 NOT 可以过滤掉 WHERE 子句中不满足条件的结果集。
SELECT *
FROM `teachers`
WHERE NOT (`age` > 20 AND `country` = 'CN');
(5)in 查询多条件 not in
当我们需要查询单个表条件过多时,就会用多个 'OR' 连接或者嵌套,这会比较麻烦,现在我们有 'IN' 能更方便的解决这一问题。
SELECT * FROM courses
WHERE created_at in("2021-01-01","2021-01-03");
(6)between and 查询两值间的数据范围
、函数
1、ifnull()
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
IFNULL() 函数语法格式为:
IFNULL(expression, alt_value)
、练习题
1、找出至少有五个下属的经理
表: Employee
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | | department | varchar | | managerId | int | +-------------+---------+ id 是此表的主键(具有唯一值的列)。 该表的每一行表示雇员的名字、他们的部门和他们的经理的id。 如果managerId为空,则该员工没有经理。 没有员工会成为自己的管理者。 编写一个解决方案,找出至少有五个直接下属的经理。 以 任意顺序 返回结果表。
方法一:复制表,连接
select JING.name AS name from Employee as JING
join Employee as YUAN
ON JING.id=YUAN.managerId
group by JING.managerId
HAVING COUNT(YUAN.managerId)>=5;
方法二:嵌套
select name from Employee
where id in
( select managerId from Employee
group by managerId
having count(id)>=5 )