1.SQL语句的基本介绍
SQL全称是结构化查询语言(Structured Query Language)。
SQL语句的主要作用就是对数据库中的数据进行相应的管理操作(增、删、改、查)。
数据库的增、删、改、查
数据表的增、删、改、查
表记录的增、删、改、查......
1.1.SQL语句分类
主要学习的有三大类: DDL DML DQL (DCL本部分暂不细说)
SQL分类:
数据定义语言:DDL(Data Definition Language),用来定义数据库对象:数据库,表等。
关键字:create,alter,drop等
作用: 对数据库中的 库 和 表 进行定义
(创建数据库、删除数据库、查看数据库、创建表、删除表、修改表、查询表)
- 数据操作语言:DML(Data Manipulation Language),用来对库表中表的记录进行增、删、改操作。
关键字:insert,delete,update等
作用: 对数据库中表数据进行操作(添加数据、删除数据、修改数据)
数据查询语言:DQL(Data Query Language),用来查询数据库中表的记录。
关键字:select,from,where等
作用: 对数据库中表数据进行查询操作
数据控制语言:DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。(DBA工程师)
作用: 对数据库这个软件进行管理的语言。 比如 设置用户名、设置密码、设置不同用户可以访问那些库或者那些表
1.2.SQL通用语法(普通话)
分号结尾: SQL语句可以单行或多行书写,以英文分号结尾
不区分大小写:MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
例如:SELECT * FROM user。
注释:多行 /* 注释内容 */ 单行 -- 或者 # 的方式完成注释
DataGrip快速注释/取消注释的快捷键:ctrl + /
多行注释,选中内容 快捷键:ctrl + shif t+ /
空格:可使用空格和缩进来增强语句的可读性
DataGrip软件sql格式化快捷键: ctrl + alt + l
缩进:控制代码的缩进保持可读性
向后缩进 : tab键
向前缩进: shift + tab键
编写代码时也可通过tab键快速跳过括号
1.3.数据库操作
DDL: 数据库定义语句
作用: 对数据库中 库 和 表 进行定义操作 (创建库\删除库\查询库\创建表\删除表\修改表\查询表)
1.3.1创建数据库
datagrip界面
创建每日文件夹
创建sql文件
# 直接创建数据库,如果存在则报错 create database 数据库名; CREATE DATABASE 数据库名; # 如果数据库不存在则创建 # if not exists 可选 判断是否存在 create database if not exists 数据库名; CREATE DATABASE IF NOT EXISTS 数据库名; # 创建数据库并指定utf8或者gbk码表编码方式 # charset='utf8' 字符集编码, charset='gbk' create database 数据库名称 charset='utf8'; CREATE DATABASE 数据库名称 CHARSET='utf8' #查看数据库的(详细信息),即:码表,格式:show create database 数据库名; show create database day01_db;快速执行sql语句: ctrl + enter
注意:数据库 仅能执行一次,
如果库存在, 直接报错 Can't create database 'learn02_db'; database exists
需求:
-- 需求1: 请创建一个 learn02_db 数据库
-- 需求2: 请创建一个 learn02_db_test1 数据库 要求该数据库不存在的时候创建它
-- 需求3: 请创建一个 learn02_db_test2 数据库 要求该数据库采用utf8编码格式
-- 需求1: 请创建一个 learn02_db 数据库 create database learn02_db; # 仅能执行一次, 如果库存在, 直接报错 Can't create database 'learn02_db';-- 需求2: 请创建一个 learn02_db_test1 数据库 要求该数据库不存在的时候创建它; create database if not exists learn02_db_test1; # 如果库存在, 不执行 , 如果不存在 才会创建这个数据库 不会报错-- 需求3: 请创建一个 learn02_db_test2 数据库 要求该数据库采用utf8编码格式 create database if not exists learn02_db_test2 charset = 'utf8';1.3.2查看所有数据库
# 小写 show databases;# 大写 SHOW DATABASES;切换大小写
方法一选中字段切换大小写快捷键:ctrl+shift+u
如图所示步骤
按照图片设置关键字大写,之后快捷键ctrl+alt+L格式化可以让关键字变成大写
1.3.3使用数据库
# 使用指定数据库 use 数据库名称; USE 数据库名称;# 展示选中的数据库 select database(); SELECT DATABASE();注意: 如果想操作数据库, 必须要先使用数据库
1.3.4删除数据库
# 删除指定的数据库 drop database 数据库名; DROP DATABASE 数据库名;!!! 注意 在实际工作中不要删除数据库
!!! 注意 在实际工作中不要删除数据库
!!! 注意 在实际工作中不要删除数据库
2.DDL-数据定义语言
2.1.数据类型
编程的核心就是在处理数据
数据类型是用于约束每一列应该存储什么类型的数据
| 分类 | 类型名称 | 说明 |
|---|---|---|
| 整数类型 | tinyint | 很小的整数(1字节) 场景: 状态码、布尔值 |
| int | 普通大小的整数(4字节) 场景: 用户ID、订单数、点击数 | |
| 小数类型 | float | 单精度浮点数, 有误差, 6~7 位 |
| double (误差更小,≠ "精确" ) | 双精度浮点数, 有误差, 15~16 位 | |
| decimal(m,d) | 精确存储,字符串形式存储数字 d: 多少位小数 m: 位数总长度(含整数和小数) decimal(10, 2) 整数8位小数2位 | |
| 日期类型 | date | 只关心日期,不关心具体时间 场景: 生日、入职日期、节日 |
| time | 只关心时间,不关心具体日期 场景: 上班时间、退房时间 | |
| timestamp | 日期 和 时间 都要 场景: 订单创建时间、用户登录时间 | |
| 字符串 | char(m) | 定长字符串, 固定个数 场景: 身份证、手机号 |
| varchar(m) | 可变长度, 最多不要超过长度 场景: 用户名、标题、地址 | |
| text | 大文本数据 场景: 存几千、几万字的文章 |
重点掌握数据类型:
整数类型: int
小数类型: decimal(m,d)
日期类型: timestamp
字符串类型: varchar(长度)
2.2.创建数据表
# 先使用数据库 use 数据库名称; create table 表名 ( 字段名1 数据类型 [约束], 字段名2 数据类型 [约束] );需求1:
# 在learn02_db的库中创建分类表 category
# 字段说明: 分类 id 分类名称 cname
# 第一步 创建 learn02_db库 create database learn02_db; # 第二步: 使用库 use learn02_db; # 第三步: 创建表 create table category( id varchar(10) primary key , cname varchar(20) ) ; # 数据案例: id=1 cname=Phone这里id varchar() 后面的primary是主键,也就是依次按照1,2,3,4递增,不可重复
后面会详细说
需求2:
#在learn02_db的库中创建商品表 product
#字段说明: 编号: pid 商品名称: pname 商品价格: price 商品分类: category_id
create table learn02_db.product( pid int , pname varchar(50), price decimal(10,1), category_id varchar(10) ); #数据案例:pid=1 pname=苹果手机 price=3999.9 category_id=c01创建数据表直接写product即可,有时候你没有选择数据库(use 数据库名;),他可能会给前面出现一个数据库.数据表(learn02_db.product),如果选择了数据库就不会出现这种情况。
后文中 表的字段 如果没有选择表 也会出现 数据表.字段名的情况。
2.3.查看表
# 查看数据库中已有的表 show tables; # 查看指定数据表的结构 即查看各字段的数据类型/约束 desc 表名;2.4.删除表
drop table 表名; -- 删除 category, 如果表存在的情况下: drop table learn02_db.category; -- 删除 product, 并且重新创建该表 drop table learn02_db.product; create table learn02_db.product( pid int , pname varchar(50), price decimal(10,1), category_id varchar(10) );2.5.修改表结构格式
场景 - 需求变更
2.5.1添加列
注意
约束按需求选择添加, 可以没有约束, 类型必须要填写, 并且只能填写一个类型
表字段名称不能重复, 否则会出现 Duplicate column 错误
如果列名和关键字相同, 需要在列名两边加反引号` `
# 添加列 alter table 表名 add 新列名 类型(长度) [约束]; # 举例 alter table learn02_db.category add `desc` varchar(20); # 这里的desc是关键字,如果要用作列名需要加`用来转义`2.5.2修改列
# 修改列 alter table 表名 change 旧列名 新列名 类型(长度) [约束]; alter table 表名 modify 列名 新类型(长度) [约束]; # 为分类表的分类描述字段更换为 description varchar(30) alter table day03_db.category change `desc` description varchar(30); # 更换为des decimal(5,2) alter table category change description des decimal(5,2); alter table category modify des decimal(5,3);change与modify 区别:
- change更强大,修改类型的同时还能修改列名,
- modify不能修改列名。
2.5.3删除列
# 删除列 alter table 表名 drop 列名; # 需求:删除分类表中description这列 alter table category drop description; alter table learn02_db.category drop description;2.5.4修改表名
# 修改表名 rename table 旧表名 to 新表名; # 需求:将learn02_db数据库中的person表名改名成students; rename table personn to students; rename table learn02_db.person to students;3.DML - 数据操作语言
作用: 对数据库的表中的记录进行相关的操作(插入数据、更新数据、删除数据)
3.1.插入数据:insert
# 不指定字段, 一次性插入一行 insert into 表 values(值1, 值2, 值3..); # 不指定字段, 一次性添加多个值 insert into 表 values(值1, 值2), (值4, 值5); # 指定字段, 一次性插入一行 insert into 表 (字段1, 字段2) values(值1, 值2); # 指定字段, 一次性添加多个值 insert into 表 (字段1, 字段2) values(值1, 值2),(值3, 值4);注意:
1. 值与字段必须对应,个数相同,类型相同
2. 值的数据大小必须在字段的长度范围内
3. 除了数值类型外,其它的字段类型的值必须使用引号引起(建议单引号)
4. 如果要插入空值,可以不写字段,或者插入 null
5. 表后的字段可以省略,一旦省略后, values后面需要填写该表的全部字段的值,必须按照表字段的顺序
3.2更新数据:update
# 更新所有行 update 表名 set 字段名1=值1,字段名2=值2,...; # 更新符合条件的行 update 表名 set 字段名=值,字段名=值,... where 条件;注意:
1. 列名的类型与修改的值要一致
2. 修改值得时候不能超过最大长度
3. 除了数值类型外,其它的字段类型的值必须使用引号引起
4. 如果需要对表中某列或者某几列的数据全部进行更新, 不需要使用 where条件
5. 如果对表中某条或者某几条数据进行指定列的值修改操作, 需要使用 where 条件
6. set 后面 主要用于设置对那个字段进行修改, 以及对应要修改为具体的值是多少
案例练习
#需求1:
在category表中增加一个新列active, 表示是否激活, 用 0表示(未激活)和 1表示(已激活)
将该列的值, 全部设置为1
# 需求2: id = 1
先在product表中插入数据再更新: insert into product values(1, '某米', '1800','手机');
更新: 找到商品表product 中 id为1的数据, 将其商品名称 更改为'华为Mate 70' ,价格为 '5999'
-- 更新数据操作: # 需求1: # 在category表中增加一个新列, 表示是否激活 active, 值为 0 和 1 # 将该列的值, 全部设置为1 # 第一步: 修改表结构 增加列 alter table learn02_db.category add active int; # 第二步: active 列的值 全部修改为 1 update learn02_db.category set active = 1; # 需求2: id = 1 # 更改 商品表 中 id为1的数据, 将其商品名称 更改为 华为Mate 70 价格为 5999 update learn02_db.product set pname = '华为Mate 70',price = 5999 where pid = 1;3.3删除表记录:delete
# 删除满足条件的数据 delete from 表名 where 条件; # 删除表中所有的数据 delete from 表名; truncate table 表名; # 区别:truncate 会清空主键,后面会讲案例练习
#需求1: 删除商品表product中,价格大于 5000元的商品 (price > 5000)
#需求2: 清空表操作(商品表product)
# 需求1: 删除商品表中,价格大于 5000元的商品 (price > 5000) delete from learn02_db.product where price > 5000; # 需求2: 清空表操作(商品表) delete from learn02_db.product; truncate table product;上面的所有的案例练习可以先自己动手练习一下,再看我写的,这样可以加深印象。