一.概述
1. 概念
Structure Query Language(结构化查询语言)简称SQL,属于关系型数据库。(指采用了关系模型来组织数据的数据库)
2. 分类
1、DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP
2、DML(Data Manipulation Language) 数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE
3、DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY
4、DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELECT
3. 关系型数据库优点
关系型数据库相比其他模型的数据库而言,有着以下优点:
容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解。
使用方便:通用的SQL语言使得操作关系型数据库非常方便,程序员甚至于数据管理员可以方便地在逻辑层面操作数据库,而完全不必理解其底层实现。
易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大降低了数据冗余和数据不一致的概率。
二. 数据库的数据类型(常用)
4. 整数型
在 MySQL 中的整数类型,可以分为 unsigned 和 signed 两种,即无符号和有符号(无符号是由符号的两倍,下面均为无符号)
INT 4字节 最大2的31次方-1
BIGINT 8字节 取值范围 2的64次方-1
5. 浮点数类型
6. 字符串类型
char(n) 必定占n个字节
varchar(n) 如果小于n时所对应的数据所占用的字节数为实际长度加1
TEXT 最大65535字节
LONGTEXT 最大4294967295字节
7. 日期与时间类型
datetime : 时间日期型,格式是YYYY-mm-dd HH:ii:ss
date:日期,就是datetime中的date部分;
time:时间(段),指定的某个区间之间;
timestamp:时间戳,范围是’1970-01-01 00:00:00’到2037年。格式为YYYY-mm-dd HH:ii:ss,格式与datetime完全一致;
year:yy和yyyy,yyyy的范围是1901-2155,yy的范围是1970-2069。
8. 二进制类型
存储图片等
三. 数据库、数据表的基本操作
1.数据库操作
1.1增
create database 数据库名称;
1.2删
drop database 数据库名称;
1.3查
select database();
2.数据表
2.1 增
create table 表名(
字段1 字段类型,
字段2 字段类型,
…
字段n 字段类型
);
2.2 删
drop table 表名;
2.3 改
alter table 原表名 rename to 想要改成的表名;
alter table 表名 change 原字段名 想要改成的字段名 varchar(100);
alter table 表名 modify 字段名 想要改成的数据类型;
2.4 查
show tables;
desc 表名;
四. 函数
1.聚合函数和数学函数
#查询 id为null的总人数
select COUNT(*) from tuser WHERE id IS NULL
#该字段最大的
select max(字段名) from 表名;
#该字段最小的
select max(字段名) from 表名;
#该字段所有的和
select sum(字段名) from 表名;
#该字段平均的值 不把该字段为null的值算上
select avg(字段名) from 表名;
-- 绝对值 136
SELECT ABS(-136);
-- 向下取整 3
SELECT FLOOR(3.14);
-- 向上取整 4
SELECT CEILING(3.14);
2.日期函数
SELECT CURRENT_DATE();
#2022-05-15
SELECT NOW();
#2022-05-15 20:43:13
SELECT CURRENT_TIMESTAMP();
#2022-05-15 20:45:09
3.字符串函数
注:mysql中索引是从1开始
SELECT LENGTH('name');
#得到字符串的长度4
select SUBSTRING('hello',1,3)
#返回从字符串str,索引x开始起y个字符长度的子串 hel
五. 数据的操作
1.增
#默认插所有字段的数据 字符串类型单双引号都可(建议用单引号)
INSERT INTO 表名 VALUES (值 1,值 2,...);
#插入个别字段的数据
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
#插入多条记录
INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;
2.删
#默认删除所有数据 表依然在
delete FROM 表名;
3.改
UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];
#默认更新所有该字段名的值
update 表明 set 字段名=值;
4.查
select * from 表名
#只查询字段的内容
select 字段名1,字段名2 from 表名;
#过滤重复数据
select distinct 字段名 from 表名;
注:一般应使用英文单引号,如果字符串内需要包含单引号时,除了使用转义的办法外,我们可以选用一对双引号来包括字符串,这样字符串内的单引号被视作普通字符,无需特殊处理。
六. 条件查询
1.where
select * from student where id<>17;
#查询id不等于17的学生的信息 MySQL命令:
2.in
#IN关键字用于判断某个字段的值是否在指定集合中 可与not 连用 not in(1,2) 。
select * from student where id in (1,2);
#查询 id为1和2的学生信息
3.BETWEEN AND
#BETWEEN AND用于判断某个字段的值是否在指定的范围之内。 可与not 连用
select * from student where age between 1 and 3;
4.IS NULL
#在MySQL中,使用 IS NULL关键字判断字段的值是否为空值。可与not 连用
select * from student where id is null;
5.AND
#在MySQL中可使用AND关键字可以连接两个或者多个查询条件
#查询 id 在1-3并且 name是null的
SELECT * FROM student WHERE id BETWEEN 1 AND 3 AND name IS null
6.OR
#在使用SELECT语句查询数据时可使用OR关键字连接多个査询条件。
#查询 id 在1-3或者 name是null的
SELECT * FROM student WHERE id BETWEEN 1 AND 3 OR name IS null
7.LIKE 和通配符
#_下划线通配符只匹配单个字符(可以n个下划线代表n个字符)
#%用于匹配任意长度的字符串
#LIKE关键字可以判断两个字符串是否相匹配
#查询name开头为z的学生信息
SELECT * FROM student WHERE name LIKE 'z%'
8.ORDER BY
#ORDER BY对查询结果排序 ASC升序(默认),DESC降序
#根据学生id降序排序
SELECT * FROM student ORDER BY id desc;
9.LIMIT
#LIMIT限制查询结果的数量 null 在排序中按小于0计算
#第一个参数是偏移量,第二个参数是取出的数据条数
#查询id最小的三个学生
select * from student order BY id limit 3;
10.GROUP BY
#GROUP BY进行分组查询
#查询id的种类 此时会去除重复的id:
SELECT * from student group by id
#查询相同id的数量:
select id , count(*) from student group by id
11.HAVING
#HAVING是在分好组后找出特定的分组,通常是以筛选聚合函数的结果,如sum(a) > 100等
#分组之后过滤数据,即先分组再过滤
#查询相同id的数量 且 本身id>1的
select id , count(*) from student group by id HAVING id>1
注:
1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有group by中包含的列
2、having必须和group by一起用,且在group by后面
3、group by、having、order by的使用顺序:group by 、having、order by
12.UNION
作用:可以使两张毫不相干的表的查询结果拼接在一起输出,前提是两个查询的列数要相同
SELECT s.sName FROM student s WHERE id=1
UNION
SELECT s.sName FROM student s WHERE id=2
#相当于
SELECT s.sName FROM student s WHERE id=1 OR id=2
七.常用
1.起别名
#为表取别名
SELECT * FROM 表名 [AS] 表的别名 WHERE .... ;
#为字段取别名
SELECT 字段名1 [AS] 别名1 , 字段名2 [AS] 别名2 , ... FROM 表名 WHERE ... ;
2.数据表的约束
3.语句的执行顺序和查询顺序
查询语句的书写顺序和执行顺序
select ===> from ===> where ===> group by ===> having ===> order by ===> limit
查询语句的执行顺序
from ===> where ===> group by ===> having ===> select ===> order by ===> limit
4.Mysql的四大特性
事务:把一组密不可分的操作系列集合在一起,这些操作要么全部执行,要么全部不执行。
1.原子性:事务是内定义的操作是一个整体,是不可分割的。
2.一致性:同一个事务,多次读取数据库中的同一个数据,读取的内容应该是一致的,不变的。
3.隔离性:不同事务之间相互独立,互不干扰。
4.持久性:事务提交后,事务内的操作对数据库的修改被永久保存在数据库文件中。
八.表查询
1. 交叉连接查询
#所有的数据组合(笛卡儿积)
SELECT * FROM 表1 CROSS JOIN 表2;
2. 内连接查询
内连接(Inner Join)又称简单连接或自然连接,内连接使用比较运算符对两个表中的数据进行比较并列出与连接条件匹配的数据行,组合成新的 记录。
特点:返回的结果只包含符合查询条件和连接条件的数据。
#(Inner Join) on表示条件
SELECT 查询字段1,查询字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表2.关系字段
SELECT 查询字段1,查询字段2, ... FROM 表1 表2 where 表1.关系字段=表2.关系字段
只会查出来共有的即id和sid相对应的
SELECT * FROM student s ,teacher t WHERE s.id=t.sid
SELECT * FROM student s JOIN teacher t ON t.sid=s.id
3.外连接查询
特点:可以显示一张表全部的信息
#SELECT 查询字段1,查询字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表
3.1左外连接
2 ON 表1.关系字段=表2.关系字段 WHERE 条件
#1、LEFT [OUTER] JOIN 左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录。
SELECT * FROM student s LEFT JOIN teacher t ON s.id=t.sid
3.2右外连接
# RIGHT [OUTER] JOIN 右(外)连接:返回包括右表中的所有记录和左表中符合连接条件的记录。
#就是left换成rirht
SELECT * FROM student s right JOIN teacher t ON s.id=t.sid
3.3三张表时
即多对多映射查询(使用三张表)
SELECT s.sId,s.sName,cId,t.tId,t.tName FROM student s LEFT JOIN class1 c ON s.sId =c.sId
RIGHT JOIN teacher1 t ON t.tId=c.cId
注:left并没有是其返回学生表的全部信息,而显示了teacher1表中的全部信息,相当于只执行了 right前面的是一个整体。
4.子查询
#一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。
#因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,
#再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性很低。
#ALL运算符是一个逻辑运算符,它将单个值与子查询返回的单列值集进行比较。
#ALL运算符必须以比较运算符开头,例如:>,>=,<,<=,<>,=,后跟子查询
#ANY运算符是一个逻辑运算符,它将值与子查询返回的一组值进行比较。
# ANY运算符必须以比较运算符:>,>=,<,<=,=,<>开头,后跟子查询。
SELECT * FROM student s,teacher t WHERE s.id=t.sid AND id IN (SELECT sid FROM teacher WHERE sid>3)
5.表的关联关系
5.1 一对多
一对多一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录只能对应一张表A中的一条记录
添加数据时,先添加父表记录,再添加子表记录;
删除数据时,先删除子表记录,再删除父表记录;
学生------>班级
sId cId
sName cName
5.2一对一
一张表A中的一条记录只能对应另一张表B中的一条记录,另一张表B中的一条记录也只能对应一张表A中的一条记录(但是两者并没有相同的字段)
学生------>学生卡 字段代表含义不同
id sId
name sname
5.3多对多
表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录也可以对应一张表A中的多条记录
学生------>老师
sId tId
sName tName
想要关联的话
需要建一个班级表
cId
sId
tId
添加数据时,先添加父表记录,再添加子表记录
删除数据时,先删除子表记录,再删除父表记录