- 发布于
数概库基础
- Authors

- Name
- Charly
文件系统管理中组织信息的弊端(数据库的意义)
- 数据冗余和不一致性
- 数据孤立 (数据存储可能在不同的文件格式里)
- 数据检索不方便
- 数据原子性问题
- 数据的安全性(文件系统存储会把数据全量暴露给用户)
SQL语言的组成部分
- 数据定义语言(DDL)
- 数据操作语言 (DML) 插入 修改 查询
- 完整性 DDL 外键和主键的约束
- 视图定义 DDL 定义视图命令
- 事务控制 DDL 定义事务命令
- 授权 DDL 定义对表和视图的访问权限命令
基本类型
char 类型,固定长度,会补充空格。 varchar 是可变长度,建议使用 numeric(p,d) p个数字包含符号位,d 表示小数位数。
表中 foreign key 约束的列,在更新时,要保证foreign 指定的表属性有对应的值,体现了完整性。
删除表
drop table table_name
删除表的所有行
修改表
alter table course add id varchar(5) 添加属性
alter table course drop id 删除属性
自然连接 自然连接是将两个表中列的名称相同的并且值相同的行显示出来
select * from department natural join course
多个列相同的时候,不指定的话,需要满足两列的值都相等,不过可以通过 join using 指定。
select name, title from (instructor natural join teaches ) join course use (course_id)
基本运算
- 更名运算 as select 后的列名 或 from 之后的表的名称 都可以加 as 重命名,不过 mysql from 后的表名可以省略as。 在自查询的时候做 where 语句判断需要 as 重命名区分。
- 字符串的运算
select upper("abcd"); 小写->大写
select lower("ABCD"); 大写->小写
select trim(" charly "); 去掉字符串前后空格
- 模糊匹配相关 % 匹配任意子串 _ 匹配一个字符 '___%' 匹配至少包含三个字符的字符串
select * from course where dept_name like '___1'
\ 表示转义字符 'ab%cd%' 匹配所有以abcd 开头的字符串
- 查询顺序 desc 表示降序排序 asc 表示升序排序
select * from department order by budget desc
- where 子语句的谓语 between and 表示一个值小于或等于同时大于或等于某个值。
select * from department where budget between 10000 and 20000; 两者等价
select * from department where budget>= 10000 and budget <= 20000
下面两者是等价的
select * from course where (course_id, title) = (10001, '高数');
select * from course where course_id = 10001 and title = '高数'
集合运算
- 并集运算 union 不能连接不同的表 union 会自动去除重复,union all 会显示所有
(select * from course where course_id between 10000 and 20000) union (select * from course where course_id = 10001)
- 交集 intersect 用法和union 一样, mysql 不支持。
- 差集 except 用户和union 类似, mysql 不支持,可以使用 not exists 来代替
聚集函数
avg sum max min count
select avg(budget), sum(budget), max(budget), min(budget), sum(budget), count(budget) from department;
count 不会忽略空值情况,其他聚集函数都会忽略掉空值null。
分组聚集
select building, sum(budget) from department d group by building having avg(budget) > 40000
sql 执行顺序,from where groupby having, groupby 是作用到满足where 语句的元组上,没有groupby, 整个where 后的结果可以看成是一个大的分组。having 作用到 groupby 后的每个分组上
嵌套子查询
where in 和 not in 用来连接子查询
数据库的修改
删除行
删除表 r 中 满足条件 P 的行
delete from r where P
插入元素
insert into r values(c1, c2, c3)
修改
更新表中t属性值c
update t set c = xxx where p
中级SQL
连接方式
自然连接或者内连接 只是列出满足条件的行,外连接可以返回某个关联表的全量 自然连接:
select * from customers c join orders o on c.customer_id = o.customer_id
select * from customers c2 join orders o2 using(customer_id); // 同上
外连接:
select * from customers c left join orders o on c.customer_id = o.customer_id // 也同步返回 orders 表中没有匹配的customer行