SQL-DDL语句&DQL语句

SQL学习笔记

DDL语句--操作数据表

/*
    快捷键:
        insert键              在插入 和 替换模式之间切换
        ctrl + 字母z          撤销上一步操作
        tab                  往后缩进(默认4个空格)
        shift + tab          往前缩进(默认4个空格)
        ctrl + alt + 字母L    格式化(对其)代码
*/
# 场景3: DDL操作 数据表
# 1. 创建day02数据库
create database day02;
# 2. 切换到day02数据库.
use day02;
# 3. 查询指定数据库下, 所有的数据表.
show tables;

# 扩展:
#   计算机存储数据(编码): '中' => 十进制的整数, 例如: 55653 => 转成二进制, 例如: 0b00110110 => 存储到计算机中.
#   计算机读取数据(解码): 读取二进制 => 转成十进制 => 找到对应的字符 => 显示
#   问题: '中' 这个字符 应该对应哪个数字呢? 码表说了算, 即: 码表就是维护 字符 和 数字之间的关系的.
#   结论: GBK主要针对于国内, UTF-8是国际通用码表, 也叫万国码.

# 4. 查看指定表的信息.
# 4.1 查看数据表的码表等信息(没什么用, 了解)
show create table student;

# 4.2 查看具体表的信息.
desc student;       -- 查看表结构信息.


# 5. 创建数据表.
/*
    格式:
        create table 表名 (
            字段名1 数据类型 [约束],
            字段名2 数据类型 [约束],
            字段名3 数据类型 [约束]
        );
    格式解释:
        字段名:  方便我们快速查找某列数据的, 一般要做到: 见名知意.
        数据类型: 标记着这一列能放什么形式的数据, 例如: 整数, 小数, 时间格式, 字符串等等...
            常用的数据类型(目前先了解, 稍后解释):
                整数: int,
                字符串: varchar(长度), 长度的意思是, 这里可以存多少个字符.      '张', '三', '0'等都是1个字符,  '张三' 就是字符串.
        约束:    这里的[]表示可选项, 它(约束)是基于数据类型之外, 加强的规范和规则.
*/
# 需求: 创建学生表, 字段有: 学生编号, 姓名, 性别, 详细信息(describe)
create table if not exists student
(
    id     int not null, # 字段名:id, 整数类型, 约束: 非空约束
    name   varchar(20),  # 字段名: name, 字符串类型, 无约束.
    gender varchar(10),   # 字段名: gender, 字符串类型, 无约束
    `desc` varchar(20)      # 细节: 如果非得要用关键字做字段名, 记得用``包裹该词, 这样它就是1个普通的字符串了.
);

# 6. 修改数据表,  即: 修改表名, 格式为: rename table 旧表名 to 新表名;
rename table student to stu;

# 7. 删除数据表. 格式: drop table 数据表名;
drop table stu;

数据类型和约束介绍

  • 数据类型

    用来限定该列值的类型的, 即: 能存什么样的数据, 不能存什么样的数据.

    常用的数据类型有:

    • 整数: int

    • 字符串: varchar(长度)

    • 日期: datetime

    • 枚举: enum

  • 约束

    就是在数据类型的基础上, 额外增加的规则.

    常用的约束:

    • 单表约束

      • 主键约束: primary key, 默认: 非空, 唯一. 一般要结合自增(auto_increment)一起使用.

      • 非空约束: not null

      • 唯一约束: unique

      • 默认约束: default

    • 多表约束

      • 外键约束

        • foreign key, 有外键列的表叫: 外表, 有主键列的表叫主表.

        • 特点: 外表的外键列不能出现主表的主键列没有的数据.

  • 结论

    数据类型和约束保证了表中数据的准确性和完整性.

DDL语句--操作字段

# ------------------------------------------- 以下内容是DDL操作 字段 -------------------------------------------
# 场景3: DDL操作 字段
# 1. 查看(某表的)所有的字段信息.
desc student;

# 2. 添加列. 添加地址列, address varchar(30) 非空约束
# 格式: alter table 表名 add 字段名 数据类型 [约束];
alter table student add address varchar(30) not null;

# 3. 修改列.
# 3.1 修改address列的 数据类型为 int
# 格式: alter table 表名 modify 字段名 数据类型 [约束];
alter table student modify address int;     -- 细节: 因为没写非空约束, 所以约束没了.

# 3.2 修改address列的名字为 addr, 类型为 date, 非空约束.
# 格式: alter table 表名 change 旧字段名 新的字段名 数据类型 [约束];
alter table student change address addr date not null;

# 4. 删除列.
# 格式: alter table 表名 drop 字段名;
alter table student drop addr;      -- 删除addr列
alter table student drop `desc`;      -- 删除desc列

# 简化记忆格式:
# alter table 表名 add/modify/change/drop 字段名 [新的字段名] 数据类型 约束;

DML--操作表数据

# DML语句, 主要是对表数据进行更新操作的, 更新操作 = 增, 删, 改.
# 快捷键: alt + shift + ↑/↓    代码的上下移动
# 快捷键: shift + 回车          快速向下插入一行
# ----------------------------------以下是DML语句之 添加表数据 ----------------------------------
# 1. 切库.
use day02;
# 2. 查看数据表.
show tables;
# 3. 查询表数据, 这个先了解, 稍后详解.
# 格式: select * from 表名;
select * from student;      # 查询表中所有的数据.

# 查看学生表的字段信息.
desc student;

# 4. 添加表数据, 方式1: 不指定字段, 添加一条.
# 格式: insert into 表名 value(值1, 值2, 值3...);      要求: 因为没有指定字段, 默认是全列名, 所以必须给每一列值赋值.
# 细节1: 值的个数 和 类型, 必须和 列的 个数和类型保持一致.
# 细节2: 数字可以直接写, 其它类型用引号包裹, 单双引号均可, 建议: 单引号.
insert into student value(1, '乔峰', '男');

# 5. 添加表数据, 方式2: 指定字段, 添加一条.
# 格式: insert into 表名(列名1, 列名2...) value(值1, 值2...);
insert into student(id, gender) value(2, '女');

-- 报错, 因为id列我们设置了非空约束, 因为只写了gender列, 所以只会给该列添加值, 其它的列会默认用null填充.
insert into student(id, gender) value(null, '女');     # 报错.

# 6. 添加表数据, 方式3: 不指定字段, 添加多条.
# 格式: insert into 表名 value(值1, 值2, 值3...), (值1, 值2, 值3...), (值1, 值2, 值3...);
insert into student value(1, '虚竹', '男'), (3, '段誉', '男');

# 7. 添加表数据, 方式4: 指定字段, 添加多条.
# 格式: insert into 表名(列名1, 列名2...) value(值1, 值2...), (值1, 值2...), (值1, 值2...);
insert into student(id, gender) values(4, '保密'), (5, '萨瓦迪卡');

总结(细节)

  1. 如果不指定字段, 则默认是全列名.

  2. 无论是否指定字段, value后边写的值的个数和类型, 必须和字段的个数和类型保持一致

一定一定要写where条件, 否则是修改所有.

# ---------------------以下是DML语句之 修改表数据 ----------------------
# 非常非常非常重要的内容, 一个老屌丝的含泪忠告, 当你在进行删除或者修改操作的时候, 一定一定一定要加where条件.
# 格式: update 表名 set 列名1=值1, 列名2=值2 where 条件;
# 需求: 修改id为2的数据, 姓名为: 许文杰, 男
update student set name='许文杰', gender='男' where id=2;

# 这个动作看看就行了, 很危险, 别碰.   因为没有写where, 会一次性修改表中所有的数据.
update student set name='许文杰', gender='男';

select * from student;

一定一定要写where条件, 否则是删除所有.

# ---------------------以下是DML语句之 删除表数据 ------------------------------
# 格式: delete from 表名 where 条件;
# 细节: 不能值删除某个字段的值, 是以 行为单位进行删除的.
delete from student where id=1;     # 删除id=1的数据.
delete from student where id>=3;     # 删除id 大于3的数据.

# 这个动作看看就行了, 很危险, 别碰.   因为没有写where, 会一次性修改表中所有的数据.
delete from student;

SQL约束--增强

主键约束

/*
    约束:
        概述/作用:
            是基于数据类型之上, 对某列的数据做要求的, 保证数据的完整性和安全性.
        分类:
            单表约束:
                主键约束    primary key
                    特点:
                        非空, 唯一, 一张表中, 主键列最多只能有1列.
                        一般要结合 自增(自动增长, auto_increment)一起使用.
                非空约束
                    not null
                唯一约束
                    unique
                默认约束
                    default
            多表约束:
                主外键约束,  foreign key
*/
# 1. 创建员工表 employee, 字段: 员工id(主键), 姓名, 性别, 工资, 部门
# 为了防止建表的时候, 建错库, 要么记得use 切库, 要么写: 数据库名.数据表名
create table if not exists day02.employee(
    id int primary key ,        # 员工id(主键)
    name varchar(20),           # 姓名
    gender varchar(10),         # 性别
    salary decimal(5, 3),       # 工资
    dept varchar(10)            # 部门
);

# 2. 设置id列为主键列.
# 2.1 方式1: 创建表的时候, 直接设置主键.
# 参考上述代码.

# 2.2 方式2: 创建表之后, 设置主键.
# 格式: alter table 表名 add primary key(主键列);
alter table day02.employee add primary key(id);
alter table day02.employee add primary key(name);       # 报错, 一张表主键只能有1个.

# 3. 往员工表中添加表数据.
insert into employee value(1, '乔峰', '男', 66.123, '丐帮');
# insert into employee value(1, '洪七公', '男', 33.33, '丐帮');     # 报错, 主键必须唯一.
# insert into employee value(null, '洪七公', '男', 33.33, '丐帮');    # 报错, 主键不能为空.
insert into employee value(2, '洪七公', '男', 33.33, '丐帮');
insert into employee value(4, '黄蓉', '女', 55.33, '丐帮');

# 4. 查询结果.
select * from day02.employee;

# 5. 查看表结构.
desc day02.employee;

-- 6. 删除主键.
alter table day02.employee drop primary key ;
alter table day02.employee modify id int;

-- 7. 实际开发中, 主键约束一般要结合自动增长(auto_increment)一起使用, 因为主键仅仅是1个标记, 标记着这条数据的唯一性, 不参与业务.
drop table day02.employee;

create table if not exists day02.employee(
    id int primary key auto_increment,        # 员工id(主键)
    name varchar(20),           # 姓名
    gender varchar(10),         # 性别
    salary decimal(5, 3),       # 工资
    dept varchar(10)            # 部门
);

# 查询表数据
select * from day02.employee;

# 有了自增后, 主键添加数据的方式如下, 只要传入null即可, 至于具体的数字是谁, 程序(计算机)会自动生成.
insert into employee value(1, '乔峰', '男', 66.123, '丐帮');
insert into employee value(null, '洪七公', '男', 33.33, '丐帮');    # 不报错, 有自增, 主键会自动生成.

insert into employee value(1, '洪七公', '男', 33.33, '丐帮');     # 报错, 主键必须唯一.

# 细节: 此时删除了id 为 5的数据, 之后再填加数据, 主键从几开始.
delete from day02.employee where id = 5;

# 扩展: delete from 和 truncate table 之间的区别是什么?
# delete from 会清除表数据, 不会重置主键id. 属于DML语句, 一般可以结合事务一起使用.
delete from day02.employee;

# truncate table 会清除表数据, 会重置主键id, 相当于把表摧毁了, 然后创建一张和该表一模一样的表. 属于DDL语句.
truncate table day02.employee;      -- 这个table可以省略.

 约束总结

   

/*
    约束:
        概述/作用:
            是基于数据类型之上, 对某列的数据做要求的, 保证数据的完整性和安全性.
        分类:
            单表约束:
                主键约束    primary key
                    特点:
                        非空, 唯一, 一张表中, 主键列最多只能有1列.
                        一般要结合 自增(自动增长, auto_increment)一起使用.
                非空约束
                    not null
                唯一约束
                    unique
                默认约束
                    default
            多表约束:
                主外键约束,  foreign key
*/
# 1. 创建员工表 employee, 字段: 员工id(主键), 姓名, 性别, 工资, 部门
# 为了防止建表的时候, 建错库, 要么记得use 切库, 要么写: 数据库名.数据表名
create table if not exists day02.employee(
    id int primary key ,        # 员工id(主键)
    name varchar(20),           # 姓名
    gender varchar(10),         # 性别
    salary decimal(5, 3),       # 工资
    dept varchar(10)            # 部门
);

# 2. 设置id列为主键列.
# 2.1 方式1: 创建表的时候, 直接设置主键.
# 参考上述代码.

# 2.2 方式2: 创建表之后, 设置主键.
# 格式: alter table 表名 add primary key(主键列);
alter table day02.employee add primary key(id);
alter table day02.employee add primary key(name);       # 报错, 一张表主键只能有1个.

# 3. 往员工表中添加表数据.
insert into employee value(1, '乔峰', '男', 66.123, '丐帮');
# insert into employee value(1, '洪七公', '男', 33.33, '丐帮');     # 报错, 主键必须唯一.
# insert into employee value(null, '洪七公', '男', 33.33, '丐帮');    # 报错, 主键不能为空.
insert into employee value(2, '洪七公', '男', 33.33, '丐帮');
insert into employee value(4, '黄蓉', '女', 55.33, '丐帮');

# 4. 查询结果.
select * from day02.employee;

# 5. 查看表结构.
desc day02.employee;

-- 6. 删除主键.
alter table day02.employee drop primary key ;
alter table day02.employee modify id int;

-- 7. 实际开发中, 主键约束一般要结合自动增长(auto_increment)一起使用, 因为主键仅仅是1个标记, 标记着这条数据的唯一性, 不参与业务.
drop table day02.employee;

create table if not exists day02.employee(
    id int primary key auto_increment,        # 员工id(主键)
    name varchar(20),           # 姓名
    gender varchar(10),         # 性别
    salary decimal(5, 3),       # 工资
    dept varchar(10)            # 部门
);

# 查询表数据
select * from day02.employee;

# 有了自增后, 主键添加数据的方式如下, 只要传入null即可, 至于具体的数字是谁, 程序(计算机)会自动生成.
insert into employee value(1, '乔峰', '男', 66.123, '丐帮');
insert into employee value(null, '洪七公', '男', 33.33, '丐帮');    # 不报错, 有自增, 主键会自动生成.

insert into employee value(1, '洪七公', '男', 33.33, '丐帮');     # 报错, 主键必须唯一.

# 细节: 此时删除了id 为 5的数据, 之后再填加数据, 主键从几开始.
delete from day02.employee where id = 5;

# 扩展: delete from 和 truncate table 之间的区别是什么?
# delete from 会清除表数据, 不会重置主键id. 属于DML语句, 一般可以结合事务一起使用.
delete from day02.employee;

# truncate table 会清除表数据, 会重置主键id, 相当于把表摧毁了, 然后创建一张和该表一模一样的表. 属于DDL语句.
truncate table day02.employee;      -- 这个table可以省略.

# ----------------------------------------- 单表约束总结 -----------------------------------------
# 创建英雄表hero, 字段: id, 姓名, 技能, hp血量, mp蓝量
create table hero(
    id int primary key auto_increment,      # 主键, 自增
    name varchar(20) unique ,               # 姓名, 唯一约束
    skill varchar(20) not null unique,      # 技能, 伪主键(即: 非空 + 唯一)
    hp int default 100,                     # 血量, 默认是100
    mp int default 10                       # 蓝量, 默认是10
);

# 添加数据.
insert into hero(id, name, skill) value(null, '典韦', '疯魔');      # 测试 默认约束.
insert into hero value(null, '典韦', '吸血', 6666, 20);             # 报错, 姓名要求唯一.
insert into hero value(null, '典韦2', '疯魔', 6666, 20);            # 报错, 技能要求唯一.
insert into hero value(null, '典韦2', null, 6666, 20);             # 报错, 技能要求不能为空.

insert into hero value(null, '吕布', '天魔乱舞', 10000, 0);

# 查询表数据.
select * from hero;

DQL语句

简单查询

# DQL语句主要是针对于 表数据 进行查询操作的.
# 0. 准备数据, 即, 直接执行如下的内容即可, 这样就有表以及数据了.
use day02;
# 创建表
CREATE TABLE product        # 商品表
(
    pid         INT PRIMARY KEY,        # 商品id, 主键.
    pname       VARCHAR(20),            # 商品名
    price       DOUBLE,                 # 价格, 小数
    category_id VARCHAR(32)             # 商品所属的类别id
);
# 插入记录
INSERT INTO product(pid,pname,price,category_id) VALUES(1,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(2,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(4,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(5,'真维斯',200,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(6,'花花公子',440,null);
INSERT INTO product(pid,pname,price,category_id) VALUES(7,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(8,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(10,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(11,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(12,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(13,'海澜之家',1,'c002');
# ---------------------------------------- 以下是具体的查询动作 简单查询 ----------------------------------------
# 1. 查询数据表中所有的数据, 格式: select * from 表名;
select pid, pname, price, category_id from product;     # 查询所有的列
select * from product;      # 如果查询的是所有的列, 则: 可以用*替代所有的列名.
# 2. 获取所有商品的名称和价格
select pname,price from product;
# 3. 获取所有商品的名称和电商价(电商价 = 价格 + 10), 数值列可以直接运算.
select pname,price + 10 from product;
# 4. 给列起别名, 注意: 别名只是为了查询方便做的, 表中真实的列名并没有被修改.
# 格式: as 别名,  且 as 可以省略不写.
select pname as '商品名称',price + 10 as '我是修改后的价格' from product;
select pname '商品名称',price + 10  '我是修改后的价格' from product;        --  as 可以省略不写

条件查询

# ---------------------------------------- 以下是具体的查询动作 条件查询 ----------------------------------------
/*
    DQL中的条件查询指的是 where条件, 即: 写了where之后, 只会筛选出我们要的数据.

    格式:
        select * from 表名 where 条件;

    where后边可以写:
        1. 比较运算符
        2. 逻辑运算符
        3. 模糊查询
        4. 范围查询
        5. 空判断
 */
# 需求0: 查询所有.
select * from product;

# 需求1. 比较运算符, 查询id是偶数的数据.
# 比较运算符: >, >=, <, <=, =, !=
select * from product where pid % 2 = 0;

# 查询id不为3的数据.
select * from product where pid != 3;

# 需求2. 逻辑运算符
# and(逻辑与, 并且的意思, 要求条件都要满足), or(逻辑或, 或者的意思, 只要满足任意1个条件即可), not(取反的意思),  这三个运算符都要和 真(true), 假(false) 一起使用.
# 查询售价在 1000以上 且 分配id是c001的商品.
select * from product where price > 1000 and category_id = 'c001';

# 查询分类id是c001 或者 c003的商品信息.
select * from product where category_id = 'c001' or category_id = 'c003';

# 需求3. 模糊查询, 格式: like '内容',  _ 表示1个占位符,  %表示多个占位符
# 查找以 香开头的商品名.
select * from product where pname like '香_';    # _表示1个占位符, 所以这里只能匹配 香后边跟1个字的.
select * from product where pname like '香%';    # %表示多个占位符, 所以这里是 以香开头, 后边是啥无所谓.
select * from product where pname like '%香%';   # 只要包含香字即可.
select * from product where pname like '%霸';   # 以 霸 结尾的.

# 需求4. 范围查询, between ... and ...
# 固定区间: 查找价格区间在 200 ~ 5000之间的商品信息.
select * from product where price >= 200 and price <= 5000;     # 比较运算符.
select * from product where price between 200 and 5000;         # 范围查询, 包左也包右.

# 不固定区间, 查找pid为3, 5, 6的数据.
select * from product where pid = 3 or pid = 5 or pid = 6;      # 比较运算符.
select * from product where pid in (3, 5, 6);                   # 范围查询.
select * from product where pid not in (3, 5, 6);               # 范围查询.


# 需求5. 空判断, is null,  is not null
# 查找 分类id 为null的数据.
select * from product where category_id is null;

# 查找 分类id 不为null的数据.
select * from product where category_id is not null;

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值