发布于

数概库基础

Authors
  • avatar
    Name
    Charly
    Twitter

文件系统管理中组织信息的弊端(数据库的意义)

  1. 数据冗余和不一致性
  2. 数据孤立 (数据存储可能在不同的文件格式里)
  3. 数据检索不方便
  4. 数据原子性问题
  5. 数据的安全性(文件系统存储会把数据全量暴露给用户)

SQL语言的组成部分

  1. 数据定义语言(DDL)
  2. 数据操作语言 (DML) 插入 修改 查询
  3. 完整性 DDL 外键和主键的约束
  4. 视图定义 DDL 定义视图命令
  5. 事务控制 DDL 定义事务命令
  6. 授权 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)

基本运算

  1. 更名运算 as select 后的列名 或 from 之后的表的名称 都可以加 as 重命名,不过 mysql from 后的表名可以省略as。 在自查询的时候做 where 语句判断需要 as 重命名区分。
  2. 字符串的运算
select upper("abcd");  小写->大写
select lower("ABCD");  大写->小写
select trim("  charly   ");  去掉字符串前后空格
  1. 模糊匹配相关 % 匹配任意子串 _ 匹配一个字符 '___%' 匹配至少包含三个字符的字符串
select * from course where  dept_name like '___1'

\ 表示转义字符 'ab%cd%' 匹配所有以abcd 开头的字符串

  1. 查询顺序 desc 表示降序排序 asc 表示升序排序
select * from department order by budget desc 
  1. 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 = '高数'

集合运算

  1. 并集运算 union 不能连接不同的表 union 会自动去除重复,union all 会显示所有
	(select * from course where course_id  between 10000 and 20000) union (select * from course where course_id = 10001)
  1. 交集 intersect 用法和union 一样, mysql 不支持。
  2. 差集 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行