SQL(一)

 

一、SQL简介

  SQL(Structured Query Language 结构化查询语句)是一种特定目的程序语言,用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。

       SQL基于关系代数和元组关系演算,包括一个数据定义语言和数据操纵语言。SQL的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。

   同时也是数据库脚本文件的扩展名,SQL对大小写不敏感,他不是数据库。

二、SQL分类

可以把 SQL 分为两个部分:

DML:Data Manipulation Language  数据操作语言

DDL:Data Definition Language 数据定义语言 

 

但是 SQL 语言也包含用于更新、插入和删除记录的语法。

查询和更新指令构成了 SQL 的 DML 部分:

  • SELECT - 从数据库表中获取数据
  • UPDATE - 更新数据库表中的数据
  • DELETE - 从数据库表中删除数据
  • INSERT INTO - 向数据库表中插入数据

SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。

SQL 中最重要的 DDL 语句:

  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 创建索引(搜索键)

三、My Sql  学习

  常见数据排行榜 DB-Engines 2021年统计

MySQL:开源免费的数据库,小型的数据库,已经被 Oracle 收购了。后来 Sun公司收购了 MySQL,而 Sun 公司又被 Oracle 收购

Oracle:收费的大型数据库,Oracle 公司的产品。 
SQL Server:MicroSoft 公司收费的中型的数据库。C#、.net 等语言常使用。
SQLite: 嵌入式的小型数据库,应用在手机端,如:Android。 

为什么选择mysql?:免费 功能强大

3.1 环境搭建:点击此处

开始学习了~~~

一、DDL操作数据库 

1.1 创建数据库

1. 【强制】库的名称必须控制在 32 个字符以内,相关模块的表名与表名之间尽量提现 join的关系,如 user 表和 user_login 表。

2. 【强制】库的名称格式:业务系统名称_子系统名,同一模块使用的表名尽量使用统一前缀。

3. 【强制】一般分库名称命名格式是“库通配名_编号”,编号从“0”开始递增,比如“wenda_001”以时间进行分库的名称格式是“库通配名_时间”

4. 【强制】创建数据库时必须显式指定字符集,并且字符集只能是 utf8 或者 utf8mb4创建数据库 SQL 举例:Create database db1 default character set utf8;

-- 创建数据库
CREATE DATABASE 数据库名;
-- 判断数据库是否已经存在,不存在则创建数据库 CREATE DATABASE IF NOT EXISTS 数据库名;
-- 创建数据库并指定字符集 CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

 练习:1.判断数据库是否存在 ,不存在创建一个数据库Test_(你的名字字母)  指定字符集为utf-8 

1.2 注释 

SQL 中不区分大小写,关键字中认为大写和小写是一样的
mysql 3种注释 如下图

 1.3 查看数据库

-- 查看所有的数据库
show databases;

-- 查看某个数据库的定义信息
show create database db3;
show create database db1;
注:按 tab 键可以自动补全关键字 

1.4 修改数据库

-- 修改数据库默认的字符集
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

练习:将TestDB_001 数据库字符集修改成utf8mb4

1.5 删除数据库

DROP DATABASE 数据库名;

1.6 使用数据库

-- 查看正在使用的数据库
SELECT DATABASE(); -- 使用的一个 mysql 中的全局函数

-- 使用/切换数据库
USE 数据库名;

二、DDL操作表结构

注:前提先使用某个数据库 ,use 数据库名;
 
2.1 创建表
CREATE TABLE 表名 (
字段名 1 字段类型 1,
字段名 2 字段类型 2
);

2.2 MySql常见数据类型

 详细数据类型:参考此处

如:创建一个student学生表 包含id,name,birthday字段

create table(
id
int, -- 整数 name varchar(20), --字符串 给20个 birthday date -- 日期 最后一个字段可以省略逗号不写 );

2.3 查看表

-- 查看某个数据库中的所有表
SHOW TABLES;

-- 查看表结构
DESC 表名;

-- 查看创建表的 SQL 语句
SHOW CREATE TABLE 表名;

2.4 快速创建一个相同得表结构

-- 创建一个 s1 的表与 student 结构相同
create table s1 like student;

2.5 删除表

-- 直接删除表
DROP TABLE 表名;
-- 判断表是否存在,如果存在则删除表 不存在不删除 DROP TABLE IF EXISTS 表名;

2.6 修改表结构

-- 添加表列ADD
ALTER TABLE 表名 ADD 列名 类型; 

练习:为学生表添加一个新字段remark,类型为varchar(20)

-- 修改列类型 MODIFY
ALTER TABLE 表名 MODIFY 列名 新的类型;

练习:将学生表得remark字段类型 修改为varchar(100)

-- 修改列名 CHANGE
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;

练习:将学生表得remark字段 修改为intro varchar(30)

-- 删除列 DROP
ALTER TABLE 表名 DROP 列名;

练习:将学生表得intro字段 删除

-- 修改表名
RENAME TABLE 表名 TO 新表名;

练习:将学生表表名修改为stu

-- 修改字符集 character set
ALTER TABLE 表名 character set 字符集;

练习:将学生表字符集 修改为gbk

三、DML 表数据

3.1 添加数据 插入记录

INSERT INTO 表名 (字段名) VALUES (字段值)

INSERT INTO 表名:表示往哪张表中添加数据
(字段名 1, 字段名 2, …):要给哪些字段设置值
VALUES (值 1, 值 2, …):设置具体的值
-- 插入全部字段
-- 第一种写法 所有的字段名都写出来
INSERT INTO 表名 (字段名 1, 字段名 2, 字段名 3…) VALUES (值 1, 值 2, 值 3);

-- 第二种写法 不写字段名 默认全部字段 按顺序一一对应
INSERT INTO 表名 VALUES (值 1, 值 2, 值 3…); 

  

-- 插入部分数据 字段名和值 一一对应
INSERT INTO 表名 (字段名 1, 字段名 2, ...) VALUES (值 1, 值 2, ...);
注:没有添加数据的字段会使用 NULL 
练习:向学生表中插入两个学生
 
3.2 更新数据
UPDATE 表名 SET 列名=WHERE 条件表达式

UPDATE: 需要更新的表名
SET: 修改的列值
WHERE: 符合条件的记录才更新
你可以同时更新一个或多个字段。
你可以在 WHERE 子句中指定任何条件。
-- 不带条件修改数据
UPDATE 表名 SET 字段名=值; -- 修改所有的行
-- 带条件修改数据
UPDATE 表名 SET 字段名=WHERE 字段名=值;

练习:将所有学生表性别sex修改为女

练习:将id为2得学生性别修改为男

练习:将id为3得学生年龄修改为18,address 修改为北京

3.3 删除表数据

DELETE FROM 表名  WHERE 条件表达式

-- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。你可以在 WHERE 子句中指定任何条件
-- 不带条件删除数据
DELETE FROM 表名;

-- 带条件删除数据
DELETE FROM 表名 WHERE 字段名=值;

-- 使用 truncate 删除表中所有记录
TRUNCATE TABLE 表名;

注:truncate 和 delete 的区别:truncate 相当于删除表的结构,再创建一张表。

3.4 查询数据 *

查询不会对数据库中的数据进行修改.只是一种显示数据的方式
 
SELECT 列名 FROM 表名 WHERE 条件表达式

1) SELECT 命令可以读取一行或者多行记录。
2) 你可以使用星号(*)来代替其他字段,SELECT 语句会返回表的所有字段数据
3) 你可以使用 WHERE 语句来包含任何条件。

3.4.1 普通查询

-- 查询表所有行和列的数据,使用*表示所有列
SELECT * FROM 表名;

-- 查询指定列,查询指定列的数据,多个列之间以逗号分隔
SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名;

3.4.2  指定列的别名进行查询


-- 使用关键字,使用别名的好处: 显示的时候使用新的名字,并不修改表的结构。

-- 对列指定别名
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名; 
-- 对列和表同时指定别名
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名 AS 表别名;

注:表使用别名的原因:用于多表查询操作

3.4.3  清除重复值

-- 查询指定列并且结果不出现重复数据
SELECT DISTINCT 字段名 FROM 表名;

3.4.5 查询结果 参与运算

注:参与运算的必须是数值类型

-- 某列数据和固定值运算
SELECT 列名 1 + 固定值 FROM 表名;

-- 某列数据和其他列数据参与运算
SELECT 列名 1 + 列名 2 FROM 表名;

练习:准备数据:添加数学,英语成绩列,给每条记录添加对应的数学和英语成绩,查询的时候将数学和英语的成绩相加 求出总成绩

3.4.6 条件查询

如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件。对记录进行过滤。
-- 条件查询的语法
SELECT 字段名 FROM 表名 WHERE 条件;
-- 流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回

准备数据

CREATE TABLE student3 (
 id int, -- 编号
 name varchar(20), -- 姓名
 age int, -- 年龄
 sex varchar(5), -- 性别
 address varchar(100), -- 地址
 math int, -- 数学
 english int -- 英语
);

INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES 
(1,'马云',55,'','杭州',66,78),
(2,'马化腾',45,'','深圳',98,87),
(3,'马景涛',55,'','香港',56,77),
(4,'柳岩',20,'','湖南',76,65),
(5,'柳青',20,'','湖南',86,NULL),
(6,'刘德华',57,'','香港',99,99),
(7,'马德',22,'','香港',99,99),
(8,'德玛西亚',18,'','南京',56,65);

运算符

select 字段名 from 表名 where 字段名 BETWEEN 最小值 and 最大值 ;
select 字段名 from 表名 where 字段名 like '%值'

 练习:

1. 查询 math 分数大于 80 分的学生
2.查询 english 分数小于或等于 80 分的学生
3. 查询 age 等于 20 岁的学生
4.查询 age 不等于 20 岁的学生,注:不等于有两种写法
 
逻辑运算

 练习:

1. 查询 age 大于 35 且性别为男的学生(两个条件同时满足)
2. 查询 age 大于 35 或性别为男的学生(两个条件其中一个满足)
3. 查询 id 是 1 或 3 或 5 的学生
 
-- in 关键字,in 里面的每个数据都会作为一次条件,只要满足条件的就会显示
SELECT 字段名 FROM 表名 WHERE 字段 in (数据 1, 数据 2...);

练习:

1.查询 id 是 1 或 3 或 5 的学生 

2.查询 id 不是 1 或 3 或 5 的学生 

-- 范围查询
BETWEEN1 AND2
-- 表示从值 1 到值 2 范围,包头又包尾
-- 比如:age BETWEEN 80 AND 100 相当于: age>=80 && age<=100

练习:

1.查询 english 成绩大于等于 75,且小于等于 90 的学生
-- like 关键字
LIKE 表示模糊查询
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';

 练习:

1.查询姓马的学生

2.查询姓名中包含'德'字的学生 

3.查询姓马,且姓名有两个字的学生 

  

原文地址:https://www.cnblogs.com/niunai/p/14524724.html