3.SQL语句概述与速查

一、SQL概述

SQL(structured Query Language)结构化查询语言,用于存取,查询,更新数据以及管理关系型数据库系统

1.1、SQL发展
  • SQL在1981年由IBM公司推出,一经就在数据库中管饭应用,成为数据库的通用规范

  • SQL由ANSI组织确定规范

  • 不同的数据库在产品中遵守SQL的通用规范,但是也对SQL有专有指令已改进自家的产

1.2、SQL分类

根据SQL指令完成的数据库的操作不用可以将SQL指令分为四类

  • DDL Data Definition Language 数据定义语言
    • 用于完成对数据库对象(数据库,数据表,视图,索引等)进行管理(创建,删除,修改)
  • DML Data Manipulation Language 数据操作语言
    • 用于完成对数据表中的数据的添加,删除,修改等
  • DQL Data Query Language 数据查询语言
    • 用于将数据表中的数据查询出来
  • DCL Data Control Language 数据控制语言
    • 用于完成事务管理等控制性操作

二、SQL基本语法

在MYSQL的command line Client或者navicat

  • SQL不区分大小写

  • 每条SQL指令结束都以;结尾

  • SQL指令以空格进行分割

  • SQL之间可以不限制换行

三、DDL

  • 查询数据库

    # 显示mysql中所有的数据库列表
    show databases;
    
    # 显示指定名称的数据库的创建SQL指令
    show create database db_test;
    
  • 创建数据库

    # 创建一个名字为db_test的数据库
    create database db_test;
    
    # 创建一个名字为db_test的数据库如果这个数据库不存在的话
    create database if not exists bd_test;
    
    # 创建数据库的同时指定数据库的字符集(字符集:数据存储在数据库中采用的编码格式 utf8 gbk)
    create database <dbName> character set utf8;
    
  • 删除数据库

    # 删除数据库时会删除数据库中所有的数据表以及所有的数据
    drop database <dbName>;
    
    # 删除一个数据库如果这个数据库存在的话
    drop database if exists <dbName>;
    
  • 修改数据库

    # 修改数据库的字符集
    alter database <dbName> character set gbk;
    
  • 切换数据库

    # 切换到想要的数据库,用以创建数据表
    use <dbName>;
    
  • 创建数据表

    数据表实际就是一个二维的表格,一个表格是由多列组成

    create table students(
        stu_num char(8) not null unique,
        stu_name varchar(20) not null,
        stu_gender char(2) not null,
        stu_age int not null,
        stu_tel char(11) not null unique,
        stu_qq varchar(11) unique
    );
    
  • 查询数据表

    # 显示当前数据库中所有的表的列表
    show tables;
    
    # 显示指定名称的表的创建SQL指令
    show create database <tableName>;
    
  • 查询表结构

    desc <tableName>;
    
  • 删除数据表

    drop table <tableName>;
    
  • 修改数据表

    # 修改表名字
    alter table <tableName> rename to <newTableName>;
    
    # 数据表也是有字符集的,默认字符集与数据表一致
    alter table <tableNmae> character set utf8;
    
    # 添加字段
    alter table <tableName> add <columnName> varchar(10)
    
    # 修改字段的字段名和类型
    alter table <tableName> change <oldColumnName> <newColumnNam> <type>;
    
    # 只修改字段类型
    alter table <tableName> modify <ColumnName> <type>
    
    # 删除字段
    alter table <tableName> drop <ColumnName>
    
    # 删除表中的主键约束
    alter table <tableName> drop primary key
    

四、MYSQL数据类型

数据类型指的是数据表中支持存放的数据类型

  • 数值类型

    类型存储空间范围说明
    tinyint1byte有符号:-128~127
    无符号:0-255
    特小型整数(eg:年龄)
    smallint2byte有符号:-32768~32767
    无符号:0-65535
    小型整数
    mediumint3byte有符号:-223~223-1
    无符号:0-2^24-1
    中型整数
    int/integer4byte有符号:-231~231-1
    无符号:0-2^32-1
    整数
    bigint8byte有符号:-263~263-1
    无符号:0-2^64-1
    大型整数
    float4byte单精度
    double8byte双精度
    decimal第一个参数+2decima(10,2)一共有10位
    小数位占2位
  • 字符类型

    类型字符序列的长度范围说明
    char0-255 字节定长字符串,最多可以存储255个字符;当我们指定数据表字
    段为char(n),此列中的数据最长为n个字符,如果添加的数据
    小于n,则补‘\u0000’至长度为n
    varchar0-65535字节可变长度字符串,最大长度为65535字符
    tinyblob0-255字节存储二进制字符串
    blob0-65535字节存储二进制字符串
    mediumblob0-1677215字节存储二进制字符串
    longblob0-4294967295字节存储二进制字符串
    tinytext0-255字节文本数据(字符串)
    text0-65536字节文本数据(字符串)
    mediumtext0-1677215字节文本数据(字符串)
    longtext0-4294967295字节文本数据(字符串)
  • 日期类型

    类型格式说明
    data2021-09-13日期,只存储年月日
    time11:12:13事件,只存储时分秒
    year2021年份
    datatime2021-09-13 11:12:13日期 - 时间 存储年月日时分秒
    timestamp20210913 111213日期 - 时间(时间戳)

五、字段约束

在创建数据表的时候,指定的对数据表的列的数据限制性的要求(对表中列的数据进行限制)

为什么要添加约束呢,保证数据的有效性,保证数据的完整性,保证数据的正确性

  • 非空约束(not null),限制列的值必须提供,不能为null,默认为

  • 唯一约束(unique),在表中的多条数据,此列的值不能重复

  • 主键约束(primary key),非空+唯一,能够唯一标示数据表中一条数据

    • 主键就是数据表中记录的唯一标识,在一张表中最多只能有一个主键

      # 创建表时定义主键
      create table book(
      	book_isdn char(4) primary key,
          book_name varchar(10) not null,
          book_author varchar(10)
      );
      
      # 或者单独定义主键
      create table book(
      	book_isdn char(4),
          book_name varchar(10) not null,
          book_author varchar(10),
          primary key(book_isdn)
      );
      
      # 或者创建表之后删除主键约束
      alter table <tableName> drop primary key;
      
      # 或者创建表之后添加主键约束
      alter table <tableName> modify <columnName> <type> primary key;
      
    • 在我们创建一张数据表时,如果数据表中有列可以作为主键(例如,学生表的学号)我们就可以直接将这个表设置为主键,当有些数据表中没有合适的列作为主键时,我们可以额外定义一个列(ID)作为数据表的主键,此列数据无具体含义,主要用于标示一条记录,在MYSQL中我们可以将此列定义为int类型,同时设置为自动增长,当我们向数据表中新增一条记录时,无需提供ID列的值,它会自动生成。

      自动增长是从1开始,每添加一条记录,自动增长的列会+1,我们把某条数据删除后再添加数据,自动增长的数据也不会重复生成(自动增长只保证唯一性,不保证连续性)。

      # 定义主键自动增长
      create table books(
          book_id int primary key auto_increment,
      	book_isdn char(4),
          book_name varchar(10) not null,
          book_author varchar(10)
      );
      
    • 主键可以是一个字段,也可以是多个字段的组合

      在实际企业项目的数据库设计中,联合主键的使用频率并不高,可以直接定义一个ID

      create table book(
      	stu_num char(8) not null,
          course_id int,
          score int not null,
          primary key(stu_num,course_id)
      );
      
      ## 注意不能在创建时定义
      ## 下面的写法是错误的
      create table book(
      	stu_num char(8) not null primary key,
          course_id int primary key,
          score int not null
      );
      
  • 外键约束(foreign key),建立不同表之间的关联关系

    • 多表关联部分讲解

六、DML

同于完成对数据表中数据的操作

  • 插入数据

    # 向数据表中指定的列添加数据,不允许为空的列必须添加
    insert into <tableName>(columnName,columnName......) values(valuse1,value2......);
    
    # 当要向表中所有列添加数据是可以删除字段列表
    insert into <tableName> values(valuse1,value2......);
    
    # 举个例子
    insert into students(stu_num,stu_name,stu_age,stu_gender,stu_tel,stu_qq)
    values('20202021','zhangsan',21,'m','13091370333','123456');
    
    # 在实际项目开发中,即使要向所有字段添加数据,也不要省略字段列表的好,增强SQL的兼容性,稳定性
    
  • 删除数据

    从数据表中删除满足特定条件的数据

    # 删除满足条件的记录
    delete from <tableName> where age=20
    
    # 删除当前表中所有的数据
    delete from <tableName>
    
  • 修改数据

    update <tableName> set <columnName> = value [where...] 
    
    # eg 修改一例
    update students set stu_name='tom' where stu_qq=456789;
    
    # eg 修改多例,用逗号隔开
    update students set stu_tel=1231231321,stu_qq=456456 where stu_num=20210103;
    

七、DQL

从数据表中截取满足特定条件的记录

  • 单表查询
  • 多表联合查询
7.1、查询的基础语法
# 从这个表中查询这个字段的数据
select <columnName> from <tableName>

# eg 查询一列
select stu_num from students;
# eg 查询多列
select stu_num,stu_name from students;
# eg 查询所有列
select * from students;
7.2、where

在删除修改及查询的语句后都可以添加where子句条件用于筛选满足特定的条件的数据用于删除修改和查询操作

操作符说明eg
=等于,精确匹配where stu_num=20188888
!=不等于where stu_num!=20188888
<>不等于where stu_num<>20188888
>大于where stu_num>20188888
<小于where stu_num<20188888
>=大于等于where stu_num>=20188888
<=小于等于where stu_num>=20188888
between…and…区间查询where stu_num between 20188888 and 20187878
7.3、多条件查询
# 多条件满足
select * from students where stu_num=20188888 and stu_age=22;

# 任意满足一个条件
select * from students where stu_num=20188888 or stu_age=22;

# not 取反
select * from students where stu_age not between 21 and 22;
7.4、模糊查询

在while子句的条件中可以使用like关键字

# 语法
# %表示任意多个字符,'%o%'即包含o
# _表示任意一个字符,'_o%'即第二个字符为o
select * from <tableName> where <columnName> like '%o%';

# eg 筛选出名字中含有o的
select * from students where stu_name like '%o%';
7.5、查询结果的处理
  • 设置查询列

    声明显示查询结果的指定列

    # 语法
    select <columnName1>,<columnName1>... from <tableName> where <direction>;
    
  • 计算列

    对从数据表中查询的记录的列进行一定的计算之后显示出来

    # eg
    select 2021-stu_age from students where stu_name like '%o%';
    
  • 字段别名

    我们可以为查询结果的列名取一个语义性更强的名字

    # eg
    select 2021-stu_age as birth from students where stu_name like '%o%';
    
  • 消除重复记录

    从查询结果中讲重复的记录消除

    select distinct stu_age from students;
    
  • 排序

    将查询到的值按照升序或者降序排列

    # eg 不声明的话是升序,默认asc
    select * from students where stu_age>20 order by stu_gender;
    
    # 可以用desc声明
    select * from students where stu_age>20 order by stu_gender desc;
    
    # 多字段的话,先满足第一个排序规则,已经满足第一个规则时再按照第二个排序
    select * from students where stu_age>20 order by stu_gender desc,stu_age asc;
    
7.6、聚合函数

SQL中提供了一些可以对查询的记录的列进行计算的函数

  • count()

    统计满足条件的指定字段的个数

    # eg
    select count(stu_num) from students;
    # eg
    select count(stu_num) from students where stu_gender='m'
    
  • max()

    查询满足条件的记录中指定列的最大值

    # eg
    select max(stu_num) from students;
    # eg
    select max(stu_num) from students where stu_gender='m';
    
  • min()

    查询满足条件的记录中指定列的最小值

    # eg
    select min(stu_num) from students;
    # eg
    select min(stu_num) from students where stu_gender='m';
    
  • sum()

    计算和,查询满足条件的记录中指定列的和

    # eg
    select sum(stu_num) from students;
    # eg
    select sum(stu_num) from students where stu_gender='m';
    
  • avg()

    计算和,查询满足条件的记录中指定列的平均值

    # eg
    select avg(stu_num) from students;
    # eg
    select avg(stu_num) from students where stu_gender='m';
    
7.7、日期函数和字符串函数

当我们向日期类型的列添加数据时,我们可以通过字符串赋值(字符串的格式固定)

我们要获取当前的时间是可以使用 now(),sysdate()

# 查询当前时间
select now();

# 查询当前系统时间
select sysdate();

通过sql指令对字符串进行处理

# 字符串拼接
select concat('df','edu');
select concat(stu_name,'-',stu_gender) from students;

# 转换大写,将字段的值转换为大写,中文不动
select upper(stu_name) from students;

# 转换小写,将字段的值转换为大写,中文不动
select lower(stu_name) from students;

# 截取字符串,从7开始截取4位
select stu_name,substring(stu_tel,7,4) from students;
7.8、分组查询

分组-就是将数据表中的记录按照指定的列进行分组

# 语法
select 分组字段/聚合函数 from 表名 [where directions] group by 分组列名;

# eg 按照性别分组 
select * from students group by stu_gender;

select后使用*对查询结果进行分组,只会得到第一条记录,这样的结果往往没有多大的意义

select后通常显示分组字段和聚合函数对分组后的数据进行统计

# eg 按照性别进行统计
select stu_gender,count(stu_gender) from students group by stu_gender;

心中熟记SQL魔咒:select from where group by having order by

7.9、分页查询

当数据表中的记录比较多的时候,如果一次性全部展示给用户,用户的可读性不好,因此我们可以进行分页展示

# 对数据表中的学生进行分页显示,limit的第一个参数代表从哪儿开始,第二个参数代表每页几个数据
select * from students limit 0,3;

directions] group by 分组列名;

#eg 按照性别分组 
select * from students group by stu_gender;

select后使用*对查询结果进行分组,只会得到第一条记录,这样的结果往往没有多大的意义

select后通常显示分组字段和聚合函数对分组后的数据进行统计

# eg 按照性别进行统计
select stu_gender,count(stu_gender) from students group by stu_gender;

心中熟记SQL魔咒:select from where group by having order by

7.9、分页查询

当数据表中的记录比较多的时候,如果一次性全部展示给用户,用户的可读性不好,因此我们可以进行分页展示

# 对数据表中的学生进行分页显示,limit的第一个参数代表从哪儿开始,第二个参数代表每页几个数据
select * from students limit 0,3;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LyaJpunov

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值