sql语句(持续更新)

204 阅读15分钟

写在前面:本文适合0基础小白参考,大佬轻喷


绪论


概念:


数据库;长期储存在计算机内、有组织的、可共享的大量数据的集合

​ 按一定的数据模型组织、描述和储存;较小冗余度;较高的数据独立性和易扩展性;并可以共享

基本特点:永久储存;有组织;可共享

特点:


数据结构化(主要特征之一,也是数据库系统与文件系统的本质区别):整体数据的结构化

数据独立性:分为==物理独立性==和==逻辑独立性==;独立性由二级映像功能来保证

一、两类数据模型

1.概念模型(信息模型):按用户的观点对数据和信息进行建模;用于数据库设计

​ 实体:客观存在并可相互区别的事物(相当于对象)

​ 属性 :实体所具有的某一特征属性

​ 码:唯一标识实体的属性集体称为码

​ 实体型:用实体名及其属性名集合来抽象和刻画同类实体

​ 实体集:同一类型实体的集合

​ 联系:分为一对一;一对多;多对多

概念模型的一种表示方法(实体-联系方法):E-R模型

2.逻辑模型和物理模型:逻辑模型用于数据库管理系统的实现

物理模型是对数据最底层的抽象,是面向计算机的

二、数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成

数据结构:数据结构描述数据库的组成对象以及对象之间的联系

数据操作:指数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操作规则

数据的完整性约束条件:一组完整性规则,是给定的数据模型中数据及其联系所具有的制约和依存规则

三、常用的数据模型

格式化模型


1.层次模型:有且只有一个节点没有双亲节点,这个节点称为根节点;根以外的其他节点有且只有一个双亲节点

像一棵倒立的树,节点的双亲是唯一的

优点:==对具有一对多的层次联系的部门描述非常自然、直观、容易理解。==

2.网状模型:允许一个以上的节点无双亲;一个节点可以有多余一个的双亲

典型代表是DBTG系统(也称CODASYL)

层次模型中子女节点与双亲节点的联系是唯一的,而在网状模型中这种联系可以不唯一

优点:更直接描述现实世界;良好的性能,存取效率高

缺点:结构复杂;用户不容易掌握,不容易使用;加重了编写应用程序的负担

格式化模型中数据结构的单位是==基本层联系==:两个纪录及他们之间的一对多(包括一对一)的联系


3.关系模型

4.面向对象数据模型

5.对象关系数据模型

6.半结构化数据模型

三、关系模型

1.关系模型的数据结构

关系:就是通常说的一张表

元组:表中的一行即为一个元组

属性:表中一列就是属性

码:可以唯一确定元组的属性

分量:元组的一个属性值

2.关系模型的数据操纵与完整性约束

完整性约束条件包括三大类:实体完整性、参照完整性和用户定义的完整性

数据库系统的结构


一、数据库系统模式的概念

数据模型中有“型”和“值”的概念;

型:某一类数据的结构和属性的说明;

值:型的具体赋值

二、数据库系统的三级模式结构

1.模式(逻辑模式):一个数据库只有一个模式

2.外模式(子模式、用户模式):数据库==用户能够看见和使用的局部数据的逻辑结构和特征的描述==

3.内模式(储存模式):一个数据库只有一个内模式,是==数据物理结构和储存方式的描述==,是数据在数据库内部的组织方式

三、数据库二级映像功能和数据独立性

1.外模式/模式映像

当模式改变时,数据库管理员对外模式/模式映像进行相应的改变,保证了数据与程序的逻辑独立性

2.模式/内模式映像

当数据库的存储结构改变时,管理员对模式/内模式映像进行相应的改变,保证了数据和程序的物理独立性

数据库系统的组成

1.硬件开发平台及数据库

2.软件

3.人员(数据库管理员、系统分析员、数据库设计人员、应用程序员、用户)

数据库管理员职责:

​ 界定数据库中的信息内容和结构;

​ 决定数据库的储存结构和存取策略;

​ 监控数据库的使用和运行;

​ 数据库的改进和重组

关系数据库标准语言SQL


特点:综合统一;高度非过程化;面向集合的操作方式;以同一种语法结构提供多种使用方式;语言简洁

终端操作:

1.如何登陆数据库服务器?

mysql -uroot -p123456(填写你的账户和密码)

2.如何查询数据库中所有数据库?

show database;

3.如何选中一个数据库进行操作?

use sushe(这里填数据库名)

4.怎么执行操作?查看数据表中的记录?

select *from admin(执行查找操作)

5.如何退出数据库?

exit;

6.如何在数据库服务器中创建我们的数据库?

create database test(数据库名);

7.如何查看某个数据库中所有的数据表?

show table;

8.如何创建一个数据表?

CREATE TABLE PET(表名)(

name VARCHAR(20),

owner VARCHAR(20),

species VARCHAR(20),

sex CHAR(1),

birth DATE,

death DATE

);

9.如何查看创建好的数据表的结构?

describe pet;

10.如何往数据表中添加记录?

INSERT INTO pet

VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL);

11.如何删除数据

delete from pet where name='Fluffy';

12.如何修改数据?

update pet set name='旺旺财' where  owner='周星驰';

MySQL数据类型、

数值类型:

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

日期和时间类型:

类型 大小 (字节) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型:

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

sql约束条件

  1. 主键约束

    能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以==使得该字段重复且不为空==

    --单独主键
    create table user(
    	id int primary key,
    	name varchar(20)
    );
    --联合主键->只要联合的主键加起来不重复就可以  tip:联合主键里面任意一个字段都不能为空
    create table user2(
    id int,
    name varchar(20),
    primary key(id,name)
    );
    
    
    --建表后添加主键(add)
    create table user4(
    	id int;
    	name varchar(20);
    );
    alter table user4 add primary key(id);
    
    --建表后添加主键(modify修改字段)
    alter table user4 modify id int primary key;
    
    --删除主键
    alter table user4 drop primary key;
    
  2. 自增约束

    --auto_increment可以管控id的值可以实现id的自动增长
    create table user3()
    	id int primary key auto_increment,
    	name varchar(20)
    );
    
  3. 外键约束

    --涉及两个表:父表、子表;主表、副表
    
    --班级表
    create table classes(
    	id int primary key,
        name varchar(20)
    );
    
    --学生表
    create table studernts(
    	id int primary key,
        name varchar(20),
        class_id int,
        foreign key(class_id) references class(id)
    );
    
    --总结;
    --主表中没有的数据值,在副表中是不可以使用的
    --主表中的记录被副表引用是不可以被删除的
    
  4. 唯一约束

    --约束修饰的字段的值不可以重复
    
    --建表后添加约束
    create table user5(
    	id int,
        name varchar(20)
    );
    alter table user5 add unique(name);
    
    --建表时添加约束
    create table user6(
    	id int,
    	name varchar(20),
    	unique(name)
    );
    
    --另一种写法
    create table user7(
    	id int,
    	name varchar(20) unique
    );
    
    --联合的唯一约束->只要联合的主键加起来不重复就可以
    create table user8(
    	id int,
    	name varchar(20),
    	unique(id,name)
    );
    
    --删除唯一约束
    alter table user7 drop index name;
    
    --建表后添加唯一约束
    alter table user7 modify name varchar(20) unique;
    
    
    ---总结:
    ---1.建表的时候就添加约束
    ---2.可以使用alter。。。add。。。
    ---3.alter。。。modify。。。
    ---4.删除alter。。。drop。。。
    
  5. 非空约束

    --修饰的字段不能为空NULL
    
    create table user9(
    	id int,
    	name varchar(20) not null
    );
    
  6. 默认约束

    --就是当我们插入字段值的时候,如果没有传值,就会使用默认值
    
    create table user10(
    	id int,
        name varchar(20),
        age int default 10
    );
    

    数据库的三大范式

    1.第一范式(1NF)

    ​ 数据表中所有的字段都是不可分割的原子值

    --字段值还可以继续拆分的,就不满足第一范式
    create table student3(
    	id int primary key,
        name varchar(20),
        country varchar(20),
        province varchar(20),
        city varchar(20),
        details varchar(20)
    );
    

    tip:范式,设计的越详细,对于某些实际操作可能更好,但是不一定都是好处

2.第二范式

必须是满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖于主键

如果要出现不完全的依赖,只可能发生在联合主键的情况下

--这就是不满足第二范式的案例
--除主键外的列并不完全依赖主键
create table myorder(
	product_id int,
    customer_id int,
    product_name varchar(20),
    customer_name varchar(20),
    primary key(product_id,customer_id)
);
--解决办法:拆表
create table myorder(
	order_id int primary key;
    product_id int,
    customer_id int
);
create table product(
	product_id int primary key,
    product_name varchar(20)
);
create table customer(
	customer_id int primary key,
    customer_name varchar(20)
);

3.第三范式

必须先满足第二范式,除开主键列的其他列之间不能有传递依赖关系

--不满足第三范式的案例
create table myorder(
	order_id int primary key,
    product_id int,
    customer_id int,
    customer_phone varchar(20)
);

--满足第三范式的案例
create table myorder(
	order_id int primary key,
    product_id int,
    customer_id int
);

create table customer(
	id int primary key,
    name varchar(20),
    phone varchar(15)
);

TIPS:创建表的时候,如果是别的表引用的外键,那么就需要先创建

查询

  1. 查询student表的所有记录

    select * from student;
    
  2. 查询student表中所有记录的sname、ssex、class列

    select sname,ssex,class from student;
    
  3. 查询教师所有的单位即不重复的depart列

    --排除重复distinct
    select distinct depart from teacher;
    
  4. 查询score表中成绩在60到80之间的所有记录

    --第一种写法
    select * from score where degree between 60 and 80;
    --第二种写法
    select * from score where degree > 60 and degree < 80;
    
  5. 查询score表中成绩为85、86或88的记录

    select * from score where score in (85,86,88);
    
  6. 查询student表中“95031”班或性别为“女”的同学记录

    select * from student where class='95031' or ssex='女';
    
  7. 以class降序查询student表的所有记录

    select * from student order by class desc;
    
  8. 以cno升序、degree降序查询score表的所有记录

    --因为默认是升序,所以asc可以省略
    --但是在下面这种情况中必须要写
    select * from score order by cno asc,degree desc;
    
  9. 查询“95031”班的学生人数

    --count 计数
    select count(*) from student where class='95031';
    
  10. 查询score表中的最高分的学生学号和课程号(子查询或者排序)

    select sno,cno from score where degree=(select max(degree) from score);
    
  11. select sno,cno,degree from score order by degree desc limit 0,1;
    --limit 第一个数表示从哪里开始
    	  --第二个数表示查找几条
    
  12. 查询每门课的平均成绩

    --avg()
    select avg(degree) from score where cno='3-105';
    select avg(degree) from score where cno='3-106';
    select avg(degree) from score where cno='3-107';
    select avg(degree) from score where cno='3-108';
    
  13. 用一个语句来查询

    --group by 分组
    select cno,avg(degree) from score group by cno;
    
  14. 查询score表中至少有2名学生选修的并且以3开头的课程的平均分数

    select cno,avg(degree) from score 
    group by cno 
    having count(cno)>=2 
    and like '3%';
    
  15. 查询分数大于70,小于90的sno列

    --第一种
    select sno,degree from score 
    where degree between 70 and 90;
    --第二种
    select sno,degree from score
    where degree>70 and degree<90;
    
  16. 查询sname,cno,degree(不在同一个表中)

    --通过对多个表的共同键值进行连接
    select sname,cno,degree from student,score
    where student.sno=score.sno;
    
  17. 查询所有学生的sno、cname和degree列

    select sno,cname,degree from course,score--多表查询
    where course.cno=score.cno;--判断语句
    
  18. 查询所有学生的sname,cname和degree列

    select sname,canme,degree from student,course,score
    where student.sno=course.sno
    and course.cno=score.cno;
    
    ------------------------------------------------------------
    --当涉及多表查询的时候,如果要查询的列多个表里都有,要加上明确的哪个表里面的信息
    -- . 的用法
    select sname,cname,degree,student.sno,course.cno from student,course,score
    where student.sno=score.sno
    and course.cno=score.cno;
    
    ------------------------------------------------------------
    --为查找到的列取一个别名
    -- as 的用法
    select sname,canme,degree,student.sno as stu_sno,crouse.cno as cou_cno
    from student,course,score
    where student.sno=score.sno
    and course.cno=score.cno;
    
    
  19. 查询"95031"班学生每门课的平均分

    --在student表中找到class为95031的班级
    select sno from student where class='95031';
    -- 在score表里面找到班级为95031的成绩
    select * from score where sno in (select sno from student where class='95031');
    --找到那些班号之后,从中找到他们的课程号,并且以课程号分组,并分别得出评均分
    select cno,avg(degree) from score where sno in (select sno from student where class='95031') group by cno;
    
  20. 查询选修”3-105“课程高于”109“号同学”3-105“成绩的所有同学的记录

    select degree from score where sno='109' and cno='3-105';
    
    select * from score where cno='3-105' and degree >(select degree score where sno='109' and cno='3-105');
    
  21. 查询学号为108、101的同学同年出生的所有学生的sno、sname和sbirthday列

    --year(sbirthday) 用到了内置函数 year 获取年份
    select * from student where year(sbirthday) in (select year(sbirthday) from student where sno in(108,101));