数据库完美总结(一)

旧街凉风 提交于 2020-02-23 03:39:34

数据库大体可以分为:

基于标准的SQL的关系型数据库:Oracle、MySQL、SQL Server

不基于SQL实现的非关系型数据库:键值对【memcached、redis】;文档型【 mongodb】;


数据库基本语法(大写均为关键字,不可缺少):

1)登录本地数据库:MYSQL -U 'username' -P 'password' ;

2)显示当前的数据库:SHOW DATABASES;

3)创建数据库:CREATE DATABASE IF NOT EXISTS db_test CHARACTER SET utf8mb4;

4)使用/删除数据库:USE/DROP DATABASE  db-name;

5)查看/创建表:DESC/CREATE TABLE  table_name;


【基本】增删改查CRUD :Create, Retrieve,Update,Delete

1)多行数据 + 指定列插入:INSERT INTO table_student  (id, sn, name)  VALUES (?,?,?);

2)删除:-- 删除孙悟空同学的考试成绩
--------------DELETE FROM exam_result WHERE name = '孙悟空';
              -- 删除整张表数据
--------------DROP TABLE IF EXISTS table_delete;

3)修改:-- 将孙悟空同学的数学成绩变更为 80 分
---------------UPDATE exam_result SET math = 80 WHERE name = '孙悟空';

4) 指定列的顺序查询:SELECT id, name, english FROM exam_result;

--别名:SELECT column [AS] alias_name [...] FROM table_name;
--去重:SELECT DISTINCT math FROM exam_result;

--排序:SELECT name, math, english, chinese FROM exam_result ORDER BY math;

--条件查询:-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
--------------------SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);

--分页查询:- 从 s 开始,筛选出来 n 条结果
--------------------SELECT .. FROM table_name LIMIT n OFFSET s;


表约束:

1)主键是 NOT NULL(不为空) 和 UNIQUE(唯一不重复) 的结合作用,可以省略 NOT NULL。
一般情况下我们把id列设为自增主键:id int PRIMARY KEY auto_increment;

2)外键是关联两张表使用的:FOREIGN KEY (class_id) REFERENCES class(id);

3)聚合(函数)查询:SELECT COUNT/SUM/AVG/MAX/MIN(math) FROM table_score;

4)分组查询:--查询每个角色的最高工资、最低工资和平均工资

-------------------SELECT role,MAX(salary),MIN(salary),AVG(salary) FROM tavle_emp GROUP BY role;

注意:分组后再过滤就不能使用WHERE条件,而要使用HAVING

-----------显示平均工资低于1500的角色和它的平均工资。
-----------SELECT role,MAX(salary),MIN(salary),AVG(salary) FROM tavle_emp GROUP BY role HAVING AVG(salary)<1500;


多表查询:

1.内连接(两种方式)

SELECT  字段  FROM  表1 别名1  INNER JOIN   表2  别名2  ON 连接条件 AND 其他条件;
SELECT  字段  FROM  表1 别名1,表2 别名2  WHERE  连接条件  AND  其他条件;

2)外连接(分为左外连接和右外连接,左侧的表完全显示就叫做左外连接;右边的表完全显示就叫做右外连接)

---左外连接,表1完全显示

SELECT  字段名  FROM  表1  LEFT  JOIN  表2  ON  连接条件;

---右外连接,表2完全显示

SELECT  字段名  FROM  表1  RIGHT  JOIN  表2  ON  连接条件;

3)自连接(同一张表连接自身进行查询,不同行比较同一列的时候会用到)

SELECT s1.* FROM score s1 JOIN  score s2  ON  s1.student_id = s2.student_id;

4)子查询(子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询)

SELECT * FROM score WHERE course_id IN (SELECT id  FROM course WHERE name='语文' OR name='英文');

SELECT * FROM score sco WHERE NOT EXISTS (SELECT sco.id FROM course cou WHERE (name!='语文' AND name!='英文') and cou.id = sco.course_id);【效率更高】

5)合并查询(在结果集中,使用UNION会自动去重;使用UNION ALL会自动去重)

-------可以看到结果集中出现重复数据
SELECT * FROM course WHERE id<3 UNION ALL SELECT * FROM course WHERE name='英文';


简述数据库三大范式:

范式就是规范,就是关系型数据库在设计表要遵循的三个规范。要满足第二范式必须先满足第一范式,要满足第三范式必须满足第二范式。另外反三范式是指有的时候为了效率,可以设置重复的字段(如订单表总价与订单项单价)。

第一范式:是指数据库表的每一列都是不可分割的基本数据项,同一个列中不能有多个值。

第二范式:是指数据库表的每一行必须可以被唯一区分,(通常利用到的是主键列)。

第三范式:是要求一个数据表中不包含已在其他表中已包含的非关键字信息(通常利用外键,多个表的数据重复,用外键引入)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!