数据库的使用(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);


相关文章
|
1月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
184 3
|
13天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
13天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
|
14天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
|
24天前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
18 2
|
29天前
|
SQL JSON Java
没有数据库也能用 SQL
SPL(Structured Process Language)是一款开源软件,允许用户直接对CSV、XLS等文件进行SQL查询,无需将数据导入数据库。它提供了标准的JDBC驱动,支持复杂的SQL操作,如JOIN、子查询和WITH语句,还能处理非标准格式的文件和JSON数据。SPL不仅简化了数据查询,还提供了强大的计算能力和友好的IDE,适用于多种数据源的混合计算。
|
1月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
67 11
|
1月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
1月前
|
SQL Java 数据库连接
如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
【10月更文挑战第6天】在代码与逻辑交织的世界中,我从一名数据库新手出发,通过不断探索与实践,最终成为熟练掌握JDBC的开发者。这段旅程充满挑战与惊喜,从建立数据库连接到执行SQL语句,再到理解事务管理和批处理等高级功能,每一步都让我对JDBC有了更深的认识。示例代码展示了如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
98 5
|
1月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
下一篇
无影云桌面