数据库:
概念:数据存储的仓库,用于存储和管理数据常见数据库产品:Oracle、DB2、Mysql、Sql Server、Sqllite
SQL:结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL,是操作关系型数据库的一个规范,所有的关系型数据库的操作,都要遵循此规范,当然允许各家数据库,存在差异,那么这些差异,称之为数据库的方言。
sql分类:
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
- DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(增、删、改)
- DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
- DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
sql基本语句:
创建数据库: create database mydemodb;查看所有数据库: show databases;
删除数据库: drop database mydemodb;
查看建库语句:show create database mydemodb;
MySql中的数据类型
- int:整型 id int,
- double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
- char:固定长度字符串类型;eg:name char(10) “张三”
- varchar:可变长度字符串类型;eg:name varchar(10) “张三”
- text:字符串类型;存大格式的文本 比如存个小说 一般不用
- blob:字节类型;存字节类型的数据 比如电影字节 图片字节 但是一般不会把字节数据存到数据库当中
- date:日期类型,格式为:yyyy-MM-dd;
- time:时间类型,格式为:hh:mm:ss
- datetime:日期时间类型 yyyy-MM-dd hh:mm:ss
- timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss
建表语法:
create table 表名(
列名1 类型1,
列名2 类型2,
...
列名n 类型n
);
eg:
create table student(
id int,
name varchar(10),
sal double(6,2),
birthday date
);
注:建表之前,需要选择库
建库:create database ***;
选择库:use ***;
删除表:
drop table student;
修改表名:
alter table 旧表名 rename to 新表名;
eg:
alter table student rename to stu;
增加一个字段
alter table student add(age int);
查看表结构
desc student;
删除一个字段
alter table student drop age;
修改字段名称 chang 旧字段名 新字段名 类型(长度)
alter table student change name username varchar(20);
修改字段的数据类型:
alter table student modify username char(24);
也可以使用change 既可以修改字段名称也可以修改字段类型:
alter table student change username username varchar(20);
插入数据,给所有字段插入值
insert into student(id,username,sal,birthday) values(1,'zhangsan',9999.99,'2020-10-10');
给全部字段添加值时,也可以简写:
insert into student values(3,'zhaoliu',9999.88,'2020-10-15');
给个别字段插入值
insert into student(id,username) values(2,'lisi');
删除表中的数据
delete from student; -- 删除表中所有的数据,因为没有加条件。
有条件的进行删除 where 条件 =、!=、<>(不等于)、<、<=、>、>=;or and
delete from student where id=1;
or 或者的意思 || 这个运算符也可以
delete from student where id=2 or id=3;
and 并且的意思 或者用 && 这个运算符也可以
delete from student where username='zhangsan' and id=4;
修改表中的数据 update
不加的条件的修改
update student set id=1,birthday='2000-10-10';
根据条件来修改 where =、!=、<>(不等于)、<、<=、>、>=;or and
update student set id=2,birthday='2022-10-10' where id=1 and username='lisi';
查询表中的数据,查询表中所有数据
select * from student;
查询个别字段
SELECT empno,ename,job FROM emp;
条件查询:
条件查询:where 子句=、!=、<>(不等于)、<、<=、>、>=;
BETWEEN…AND; 在什么范围之间
IN(SET);
IS NULL;为空
IS NOT NULL 不为空
AND; 并且
OR; 或者
NOT;非
注:null 用‘=’判断不出来。要判断null值用is null;不为null用is not null
给字段起别名,用于临时展示用 as as可以省略不写
SELECT empno,ename,job FROM emp;
SELECT empno AS 员工编号,ename AS 员工姓名,job 工作岗位 FROM emp;
对于数值型的字段,可以进行数学运算
SELECT empno,ename,job,sal FROM emp;
SELECT empno,ename,job,sal AS 月薪, sal*12 AS 年薪 FROM emp;
null值参与数学运算,结果也是null,我们想要把null当成0来处理
SELECT empno,ename,job,sal AS 月薪,comm AS 奖金, sal*12+IFNULL(comm,0) AS 年薪 FROM emp;
DISTINCT 去重
SELECT DISTINCT sal FROM emp WHERE sal=1250;
多个字段去重,把多个字段看做整体来去重
SELECT DISTINCT ename,sal FROM emp WHERE sal=1250;
排序 order by ASC 默认值 DESC 降序排列
默认就是升序排列:SELECT * FROM emp ORDER BY sal;
默认就是升序排列:
SELECT * FROM emp ORDER BY sal ASC;
默认就是升序排列:
SELECT * FROM emp ORDER BY sal DESC;
模糊查询:like
* 通配符_ 匹配单个任意字符
% 匹配多个任意字符
eg:
要查询第二个字符是m的:
select * from student where sanme like '_m%';
查询名字中包含m的:
select * from student where sname like '%m%';
字段控制:
1.修改字段的别名:AS (可以省略)
2.字段运算:null参与的运算,结果都为null
3.去除重复记录:例如查询工资是3000的 出现了多条工资为3000 的记录,但只想展示一条3000的记录,可以用 distinct 去除重复记录
eg:select distinct 工资 from student;
4.排序: order by:010升序排列,ASC 默认值,DESC 降序排列
eg:
按工资从小到大排
select * from student order by 工资 asc;
按工资从大到小排
select * from student order by 工资 desc
聚合函数
聚合函数:做纵向运算的函数
- COUNT():统计指定列不为NULL的记录行数;
eg:统计有多少个学生
select count(sid) from student;
- MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
- MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
- SUM():计算指定列的数值和,如果指 定列类型不是数值类型,那么计算结果为0;
- AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
分组查询:group by:一般配合聚合函数使用,查出的数据才有意义
查询的字段:
1.分组字段本身
2.聚合函数
where和having的区别:
where:在分组之前对条件进行限定。不满足条件,就不会参与分组
having:在分组之后,对结果集的筛选
分页查询:limit
limit 0,5 开始的记录索引, 每一页显示的条数(索引从0开始)
开始的记录索引=(页码-1)*每一页显示的条数
eg:显示第一页 每页5条记录
select * from student limit 0,5 ; 这是第一页 5 条记录
select * from student limit 5,5 ; 这是第二页 5条记录
select * from student limit 10,5 这是第三页 5条记录
约束:
意义:对字段的值,做出的一种规则上的限定,主要目的,为了数据的有效性和完整性。
- 唯一约束 UNIQUE 特点:值不能重复,对null值不起作用
- 非空约束 NOT NULL
- 自增长约束 AUTO_INCREMENT
- 非负约束 UNSIGNED
- 外键约束 FOREIGN KEY
- 主键约束 PRIMARY KEY 特点:非空且唯一 ,一张表中,只能有一个主键
添加主键约束的语法
方式1 建表的时候,给某个字段添加主键约束
CREATE TABLE test(
id INT,
username VARCHAR(20) PRIMARY KEY -- 给这个字段添加主键约束
);
方式2 建表的时候,给某个字段添加主键约束
CREATE TABLE test2(
id INT,
username VARCHAR(20),
PRIMARY KEY(id) -- 在这里指定主键字段
);
方式3 表建好之后,添加主键约束
CREATE TABLE test3(
id INT,
username VARCHAR(20)
);
然后采用修改表的方式,来添加主键
ALTER TABLE test3 ADD PRIMARY KEY(username);
删除主键约束:分两种情况
情况1:
这个字段,只有主键约束,分两步来删除主键约束
第一步:
alter table 表名 drop primary key;
这样只删除了唯一,还有个非空约束,所以得再删除非空约束
第二步:
alter table [表名] modify [列名] varchar(20) null;
修改字段名还为原来的字段 加上null即可
情况2:
这个字段,是一个int类型字段,既有主键约束,又有自增长约束,那么得先删除自增长约束,在删除主键约束
第一步:删除自增长约束,其实就是修改自增长字段名和数据类型还为原来的字段名和类型
alter table 表名 change 字段名 字段名 数据类型;
删除自增长约束
第二步:删除主键约束
alter table 表名 drop primary key;
第三步:删除非空约束
ALTER TABLE test3 MODIFY sid INT NULL;
就是修改字段值可以为null
外键约束:
添加外键约束的目的,是为了保证数据的有效性和完整性。
在多表一方,添加外键约束去关联主表一方的主键。
添加了外键约束后有如下特点
- 主表一方不能删除多表一方还在引用的数据
- 多表一方不能添加主表没有描述的数据。
多表查询
多张表无条件的联合查询.没有任何意思(也叫笛卡尔积)select a.,b. from a,b;
内连接:
格式1:显式的内连接
select a.,b. from a [inner] join b on ab;(ab为连接条件)
格式2:隐式的内连接
select a.,b. from a,b where ab;(ab为连接条件)
外连接:
左外连接:
select a.,b. from a left [outer] join b on 连接条件;
outer 可以不写。意思: 先展示join左边的(a)表的所有数据,根据条件关联查询 join右边的表(b),符合条件则展示出来,不符合以null值展示.
右外连接:
select a.,b. from b right [outer] join a on 连接条件;
outer 可以不写。意思: 先展示jion右边的表(a)表的所有数据,根据条件关联查询join左边的表(b),符合条件则展示出来,不符合以null值展示.
子查询:
一个查询依赖另一个查询。