数据库的使用(SQL)(上)

简介: 数据库的使用(SQL)(上)

SQL简介



通用语法


  • SQL语句可以单行或多行书写,一分号结尾
  • MySQL数据库的SQL语句不去分大小写,关键字建议使用大写
  • 注释
  • 单行注释 :-- 注释内容 或 # 注释内容(MySQL特有)
  • 多行注释: /* 注释内容*/


SQL分类


  • DDL 简单理解: 操作数据库,表
  • DML : 对表中数据进行增删改
  • DQL : 数据查询语句
  • DCL : 对数据库进行权限控制


一、操作数据库



1.1查询


  • 查询所有数据库
-- 查询所有数据库
show databases;


1.2创建数据库


  • 创建数据库
-- 创建数据库
create database itzh;


创建数据库(判断, 如果不存在则创建)

-- 创建数据库 ,判断
create databases if not exists itzh;


1.3 删除数据库


  • 删除数据库
DROP DATABASE 数据库名称;
-- 删除数据库
drop databases iszh;


删除数据库(判断,如果存在则删除)

DROP DATABASE IF EXISTS 数据库名称;
-- 删除数据库,判断是否从在
drop databases if exists itzh;


1.4 使用数据库


  • 使用数据库
USE 数据库名称;
-- 使用数据库
use itzh;


查看但前使用的数据库

SELECT DATABASE();
-- 查看当前使用的数据库
select database();


二、 DDL:操作表



操作数据,对应的数据表进行 增、删、改、查


2.1查询表


  • 查询当前数据库表名称
show tables ;


查询表结构

desc 表名;
-- 查看 表结构
desc zhit;


2.1创建表


  • 创建表
create table 表名(
  字段名1 数据类型1,
  字段名2 数据类型2,
  ……
  字段名n 数据类型n
);
  |注意:最后一行,不能加逗号


  • 表模型

4e0aacd527e545d7a7b221e8fa166813.png


2.2数据类型


  • 数值
tingint:  小整数,占一个字节
int:    大整数,占四个字节
  eg: age int
double:   浮点类型
  使用格式: 字段名 double(总长度,小数点后保留俩位)
  eg: score double(5,2)


日期

date :    日期值 。只包含年月日
  eg: birthday date
datetime: 混合日期和时间值,包含年月日时分秒


字符串

char :    定长字符串
  优点: 存储性能高
  缺点: 浪费空间
  eg:name char(10) 如果存储的数据字符不足十个,
varchar : 变长字符串
  优点: 节约空间
  缺点:存储性能低


2.3删除表


  • 删除表
DROP TABLE 表名;
-- 将表名为student的表删除
drop table student ;


删除表时, 判断表时否存在

DROP TABLE IF EXISTS 表名 ;
-- 判断是否有名为student的表, 有则删除
drop table if exists student;


2.4 修改表


ALTER TABLE 表名 RENAME TO 新表名;
-- 将表名student 修改为 stu
alter table student rename to stu;


  • 添加一列 add
ALTER TABLE 表名 ADD 列名 数据类型;
-- 给stu表添加一列 address,给字段类型是varchar(50)
alter table stu addres varchar(50);
• 1
• 2
• 3

修改数据类型 modify

ALTER TABLE 表名 MODIFY 列名 新数据类型
-- 将stu表中address字段的类型给为char(50)
alter table stu modify address char(50);


修改列和数据类型 change

ALTER TABLE 表名  CHANGE 列名 新列名 新数据类型
-- 将stu表中的address 字段名给为addr ,类型改为 varchar(50)
alter table stu change address addr varchar(50);


删除列 drop

ALTER TABLE 表名 DROP 列名;
-- 将stu 表中的addr字段,删除
alter table stu drop addr;


三、DML



DML主要书对数据进行,增、删、改


3.1添加数据


  • 给指定列添加数据
INSERT INTO 表名(列名1,列名2……) VALUES(值1,值2……);
-- 给stu表,指定列添加数据
insert into stu (id ,name) values (1,'张三');


给全部列添加数据

INSERT INTO 表名 VALUES (值1,值2……);
-- 给所有列添加数据
insert into stu (id, name ,sex ,birthday,score,email,tel,STATUS)
VALUES (2, '李四','男','1999-11-11',88.88,'lisi@itcat.cn' ,'1388888888',1);
-- 给所有列添加数据,列名的列表可以省略
insert into stu values(2,'李四','男','1999-11-11','lif@itzh.cn','17699990000',1);


批量添加数据

insert into 表名(列名1,列名2…… ) values (值1,值2……),(值1,值2……)……;
insert into 表名 values (值1,值2……),(值1,值2……),……;
-- 批量添加数据
insert into stu values
(2,'李四','男','1999-11-11','lif@itzh.cn','17699990000',1),
(3,'李四','男','1999-11-11','lif@itzh.cn','17699990000',1),
(3,'李四','男','1999-11-11','lif@itzh.cn','17699990000',1);


3.2修改数据


  • 修改表数据
update 表名 set 列名1= 值1, 列名2=值2,…… [where 条件];
    /*
      注意: 1.修改语句,如果不加条件,则将所有数据都修改
          2.像上面的语句的中括号, 表示写的SQL是可以省略的
    */
-- 将张三的性别改为 女
update stu set sex = '女' where name='张三';
-- 将张三的生日给为2020-5-20,分数改为99
update stu set birthday = '2020-5-20', score = 99 where name='张三';


3.3删除数据


  • 删除数据
delete from 表名 [where 条件];
-- 删除张三的记录
delete from stu where name='张三';
-- 删除stu 中所有的数据
delete from stu;


四、DQL



  • 完整语法
select 
  字段列表
from 
  表名列表
where 
  条件列表
group by 
  分组字段
having 
  分足字段后条件 
order by 
  排序字段
limit 
  分页限定


演示

-- 删除stu表
drop table if exists stu ;
-- 创建 stu 表
create table stu (
  id int , -- 编号
    name varchar(20), -- 姓名
    age int,-- 年龄
    sex varchar(5), -- 性别
    address varchar(100), -- 地址
    math double(5,2), -- 数学成绩
    english double(5,2), -- 英语成绩
    hire_date date -- 入学的时间
);
-- 添加数据
insert into stu (id ,name,age ,sex, address,math,english,hire_date) values 
(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');


4.1 基础查询


  • 查询多个字段
select 字段列表 from 表名;
-- 查询所有数据
select * from stu ;


去除重复的记录

select distinct 字段列表 from 表名;
-- 去除重复记录
select distinct address from stu;


起别名

as:as 也可以省略
-- 查询起别名
select name,math as 数学成绩, english as 英语成绩 from stu;
select name,math 数学成绩, english 英语成绩 from stu  ;


4.2 条件查询


  • 语法
select 字段列表 from 表名 where 条件列表


条件

dc5ca6d0e7fd4851a8eb38086c42730e.png


df

-- 查询年龄大于20岁的学员信息
select * from stu where age > 20;
-- 查询年龄大于等于20岁的学员信息
select * from stu where age >=20;
-- 查询年龄大于等于20岁,并且年龄小于 30 岁的的学员信息
select * from stu where age >=20 and age<=30;
select * from stu where age >=20 && age<=30;


上面语句中得 && 和 and 都表示 并且的意思 , 建议使用 and

也可以使用 between …and来实现上面的需求

 -- 查询英语成绩为null的学员
 select * from stu where englist is null
 select * from stu where englist is not null 


  • 模糊查询

模糊查询使用,like关键字,可以使用通配符进行占位

(1) _ :代表单个任意字符

(2) % : 代表任意数字符

-- 查询姓'马'的学员信息
select * from stu where name like '马%';
-- 查询第二个字是'花' 的学员的信息
select * from stu where name like '_花%'
-- 查询名字中包含 '德'的学员信息
select * from stu where name like '%德%'


4.3排序查询


  • 语法
select 字段列表 from 表名 order by 排序字段名1[排序方式1],排序字段名2,[排序方式2]…;


排序方式 有俩种 ,

  • ASE : 升序(默认)
  • DESC:降序排序
    注意:如果有多个排序条件,当前面条件值一样时,才会根据第二条件进行排序


练习

-- 查询学生信息,按照年龄升序排序
select * from stu order by age;
-- 查询学生信息,按照数学成绩降序排序
select * from stu order by math desc;
-- 查询学生信息,按照数学成绩降序排列,如果数学成绩一样,在按照英语成绩升序排列
select * from stu order by math desc, englist asc;


4.4聚合函数


== 将一列数据作为一个整体,进行纵向计算。 ==


c9d74f2455c04dd1943cfebfad38ceb5.png


  • 语法
select 聚合函数名(列名) from 表名;
• 1

注意: null 不参与聚合函数运算


练习

-- 统计班级一共有多少学生
select count(id) from stu ;
select count(englist) from stu;


上面,如果给字段某一行的值为null ,将不会被统计,

所以用count(*), 来实现,

‘星号’ 表示所有字段数据吗一行中,也不能可所有数据都为空,所以建议使用count(*)

-- 查询数学成绩的最高分
select max(math) from stu;
-- 查询数学成绩的最低分
select min(math) from stu;
-- 查询数学总成绩的
select sum(math) from stu;
-- 查询数学成绩色平均分
select avg(math) from stu;


4.5 分组查询


  • 语法
-- 查询男同学和女同学各自的 数学成绩的平均分
select sex, avg(math) from stu group by sex;
-- 查询男同学和女同学各自的数学成绩平均分,以及各自人数
select sex,avg(math), count(*) from stu group by sex;
-- 查询男同学和女同学各自的数学成绩平均分,以及各自的人数,要求:分数不低于70 的不参与分组
select sex, avg(math), count(*) from stu where math > 70 group by sex;


where 和 having 区别:

  • 执行时机不一样: where是分组之前进行限定,不满足where条件,则不参与分组
    having是分组织后对结果进行过滤。
  • 可判断的条件不一样: where不能对聚合函数进行判断,having可以


4.6分页查询


  • 语法
select 字段列表 from 表名 limit 起始索引 ,查询条目;
• 1

注意: 上述语句的起始索引是从0开始的


练习

-- 从零开始查询,查询3 条数据
select * from stu limit 0,3;
-- 每页显示3条数据,查询第一页数据;
select * from stu limit 0 , 3;
-- 每页显示3条数据,查询第三页数据
select * from stu limit 6 , 3; 


起始索引 = (当前页面 - 1) * 每页显示的条数


五、约束



5.1概念

约束: 作用于表中列上的规则,用于限制加入表的数据


5.2分类


5.2.1非空约束

  • 概念

关键字: not null

非空约束: 保证所有数据不能有null


语法

  • 添加约束
-- 创建表示添加非空约束
create table 表名 (
  列名 数据类型 not null,
    ……
);
-- 建完 表后添加非空约束
alter table 表名 modify 字段名 数据类型 not null;


删除约束

alter table 表名 modify 字段名,数据类型;


5.2.2 唯一约束


  • 概念

关键字: unique

唯一约束: 用于保证列中数据各不相同


语法

  • 添加约束
-- 创建表的时候添加
create table 表名(
  列名 数据类型 unique [auto_incrment], -- auto_incrment:当不指定的时候自动添加
    ……
);
create table 表名(
  列名 数据类型,
    ……
    [counstraint] [约束名称]  unique(列名)
);
-- 建完表后添加 唯一约束
alter table 表名 modify 字段名 数据类型 unique;


删除约束

alter table 表名 drop index 字段名;


5.2.3 主键约束


  • 概念

关键字: primary key

主键约束:一张表只能有一个主键,

是一行数据的唯一标识, 要求非空唯一


语法

  • 添加约束
-- 创建表时添加主键约束
create table 表名(
  列名 数据类型 primary key [auto_increment],
    ……
);
create table 表名(
  列名 数据类型,
    [counstraint] [约束名称]  primary key (列名)
);
-- 建完表后添加主键约束
alter table 表名 add primary key(字段名);


删除约束

alter table 表名 drop primary key;


5.2.4 默认约束


  • 概念

关键字: default

默认约束:保存数据时,未指定值采用默认值


语法

  • 添加约束
-- 创建表示添加默认约束
create table 表名 (
  列名 数据类型 default 默认值,
    ……
);
-- 建完表后添加默认约束
alter table 表名 alter 列名 set default 默认值;


删除约束

alter table 表名 alter 列名 drop default;


5.2.5外键约束


  • 概念

关键字: foreign key

外键约束: 用来让俩个表的数据之间建立链接, 保证数据的一致性和完整性

  • 语法
  • 添加外键约束
-- 创建表时添加外键约束
create table 表名(
  列名 数据类型,
    [constraint] [外键名称] foreign key (外键列名)  references 主表(主表列名)
);
-- 建完表后添加外键约束
alter table 表名 add coustraint 外键名称  foreign key (外键字段名称) references 主表名称(主表列名);


删除外键约束

alter table 表名 drop foreign key 外键名称;


约束案例


根据需求,为表添加合适的约束

-- 员工表
CREATE TABLE emp (
  id INT,  -- 员工id,主键且自增长
    ename VARCHAR(50), -- 员工姓名,非空且唯一
    joindate DATE,  -- 入职日期,非空
    salary DOUBLE(7,2),  -- 工资,非空
    bonus DOUBLE(7,2)  -- 奖金,如果没有将近默认为0
);


上面一定给出了具体的要求,我们可以根据要求创建这张表,并为每一列添加对应的约束。建表语句如下:

DROP TABLE IF EXISTS emp;
-- 员工表
CREATE TABLE emp (
  id INT PRIMARY KEY, -- 员工id,主键且自增长
  ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
  joindate DATE NOT NULL , -- 入职日期,非空
  salary DOUBLE(7,2) NOT NULL , -- 工资,非空
  bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
);


通过上面语句可以创建带有约束的 emp 表,约束能不能发挥作用呢。接下来我们一一进行验证,先添加一条没有问题的数据

INSERT INTO emp(id,ename,joindate,salary,bonus) values(1,'张三','1999-11-11',8800,5000);


  • 验证主键约束,非空且唯一
INSERT INTO emp(id,ename,joindate,salary,bonus) values(null,'张三','1999-11-11',8800,5000);

从上面的结果可以看到,字段 id 不能为null。那我们重新添加一条数据,如下:

INSERT INTO emp(id,ename,joindate,salary,bonus) values(1,'张三','1999-11-11',8800,5000);


从上面结果可以看到,1这个值重复了。所以主键约束是用来限制数据非空且唯一的。那我们再添加一条符合要求的数据

INSERT INTO emp(id,ename,joindate,salary,bonus) values(2,'李四','1999-11-11',8800,5000);


  • 验证非空约束
INSERT INTO emp(id,ename,joindate,salary,bonus) values(3,null,'1999-11-11',8800,5000);


可以看到,ename 字段的非空约束生效了。


  • 验证唯一约束
INSERT INTO emp(id,ename,joindate,salary,bonus) values(3,'李四','1999-11-11',8800,5000);


从结果可以看到,ename 字段的唯一约束生效了。

  • 验证默认约束
INSERT INTO emp(id,ename,joindate,salary) values(3,'王五','1999-11-11',8800);


执行完上面语句后查询表中数据,如下图可以看到王五这条数据的bonus列就有了默认值0。

注意:默认约束只有在不给值时才会采用默认值。如果给了null,那值就是null值。

如下:

INSERT INTO emp(id,ename,joindate,salary,bonus) values(4,'赵六','1999-11-11',8800,null);


执行完上面语句后查询表中数据,如下图可以看到赵六这条数据的bonus列的值是null。

  • 验证自动增长: auto_increment 当列是数字类型 并且唯一约束

重新创建 emp 表,并给id列添加自动增长

-- 员工表
CREATE TABLE emp (
  id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长
  ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
  joindate DATE NOT NULL , -- 入职日期,非空
  salary DOUBLE(7,2) NOT NULL , -- 工资,非空
  bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
);


接下来给emp添加数据,分别验证不给id列添加值以及给id列添加null值,id列的值会不会自动增长:

INSERT INTO emp(ename,joindate,salary,bonus) values('赵六','1999-11-11',8800,null);
INSERT INTO emp(id,ename,joindate,salary,bonus) values(null,'赵六2','1999-11-11',8800,null);
INSERT INTO emp(id,ename,joindate,salary,bonus) values(null,'赵六3','1999-11-11',8800,null);


根据上述语法创建员工表和部门表,并添加上外键约束:

-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
-- 部门表
CREATE TABLE dept(
  id int primary key auto_increment,
  dep_name varchar(20),
  addr varchar(20)
);
-- 员工表 
CREATE TABLE emp(
  id int primary key auto_increment,
  name varchar(20),
  age int,
  dep_id int,
  -- 添加外键 dep_id,关联 dept 表的id主键
  CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)  
);


添加数据

-- 添加 2 个部门
insert into dept(dep_name,addr) values
('研发部','广州'),('销售部', '深圳');
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (NAME, age, dep_id) VALUES 
('张三', 20, 1),
('李四', 20, 1),
('王五', 20, 1),
('赵六', 20, 2),
('孙七', 22, 2),
('周八', 18, 2);


此时删除 研发部 这条数据,会发现无法删除。

删除外键

alter table emp drop FOREIGN key fk_emp_dept;


重新添加外键

alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);


相关文章
|
15天前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
82 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
2天前
|
SQL 存储 移动开发
HTML5 Web SQL 数据库详解
Web SQL 数据库是 HTML5 中的一种本地存储技术,允许在浏览器中使用 SQL 语言操作本地数据,支持离线访问和事务处理,适用于缓存数据和小型应用。然而,其存储容量有限且仅部分现代浏览器支持,标准已不再积极维护,未来可能被 IndexedDB 和 localStorage 等技术取代。使用时需谨慎考虑兼容性和发展前景。
|
20天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
30 2
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
59 0
|
2月前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
58 0
|
2月前
|
SQL 数据处理 数据库
|
2月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
66 0
|
2月前
|
SQL 存储 监控
|
2月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
67 0
|
2月前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
76 0
下一篇
无影云桌面