SQL结构化查询语句

SQL定义了查询所有关系型数据库的规则。

1、通用语法

  • SQL语句可以单行或者多行书写,以分号结尾
  • 可以使用空格和缩进增强可读性
  • 不区分大小写,但是关键字建议大写
  • 3种注释

注释内容;多行注释/*;-- 注释内容

2、SQL分类

  • DDL(Date Definition Language)数据定义语言
  • 用来定义数据库对象:数据库、表、列等,包括关键字:create,drop、alte
  • DML(Data Manipulation Language)数据操作语言,增删改
  • 用来对数据库的表中的数据进行增删查改。关键字:insert、delete、update
  • DQL(Date Query Language)数据查询语言,查
  • 用来查询数据库表中的记录。关键字:select、where
  • DCL(Data Control Language)数据控制语言
  • 用来定义数据库的访问权限,安全级别,以及创建用户,关键字:GRANT、REVOKE

3、DDL操作数据库、表

操作数据库:CRUD

  • C(create)创建

SQL语句

描述

CREATE database (if not exists) 数据库名 (character set 字符集名称);

创建一个新的数据库,括号是一个判断是否存在、设定该数据库的字符集

  • R(Retrieve)查询:

SQL语句

描述

show databases;

查看所有的数据库名称

show create database 数据库名;

查看某个数据库的创建语句

  • U(Update)修改

SQL语句

描述

alter database 数据库名 character set 字符集名称;

修改数据库使用的字符集

  • D(Delete)删除,使用前三思

SQL语句

描述

drop database (if exits )数据库名;

判断存在就删除数据库

  • 查询当前在使用的数据库

SQL语句

描述

select database();

查询当前在使用的数据库

  • 使用数据库

SQL语句

描述

use 数据库名称

使用某个数据库

2、操作数据库表

  • C(create)创建
    语法
create table 表名称(
    列名1 数据类型1,
    列名2 数据类型2,
    列名3 数据类型3,
    ...
    列名n 数据类型n
); # 最后一列不要加逗号,分号等,分号是结束标志
create table 表名称(
    列名1 数据类型1,
    列名2 数据类型2,
    列名3 数据类型3,
    ...
    列名n 数据类型n
); # 最后一列不要加逗号,分号等,分号是结束标志

其他创建表语句create table table1_copied like table1,创建一个表,复制table1

数据类型:

数据类型

描述

int

整数

double(n, m)

浮点数类型,指定一共有n位,小数点后保留m位

date

日期类型,只包含年月日,yyyy-MM-dd

datetime

日期时间类型,包含年月日时分秒,yyyy-MM-dd HH:mm:ss

timestamp

时间戳类型,包含年月日时分秒,yyyy-MM-dd HH:mm:ss,如果将来不给这个字段赋值为null,就自动使用系统时间

varchar(n)

字符串类型,要指定最大为n个字符

  • R(Retrieve)查询,进到某个数据库后

SQL语句

描述

show tables;

查看该数据库所有的表

desc 表名称;

查询一个表的表结构,有什么字段,字段类型,是否主键等信息

  • U(Update)修改
  • 修改表名:alter table 表名称 rename to 新表名称;
  • 修改表的字符集:alter table 表名称 character set 字符集名称;
  • 修改列名,数据类型:
  • alter table 表名称 change 列名称 新列名称 新数据类型;
  • alter table 表名称 modify 列名称 新数据类型;
  • 删除列:alter table 表名称 drop 列名称;
  • 添加列:alter table 表名称 add 列名称 数据类型;
  • D(Delete)删除表

SQL语句

描述

drop table (if exists) 表名称

删除表,如果表存在

4、DML:操作表中的数据

  1. 添加数据
  • 语法:insert into 表名称(列名1, 列名2.....列名n) values(值1, 值2......值n)
    注意
  • 列名和值要一一对应
  • 如果不写列名,就默认要给所有列添加数据
  • 除了数字类型,其他类型都要用引号引起来
  1. 删除数据
  • 语法:delete from 表名 [where 条件]
    注意
  • delete from 表名:不写条件,就删除表中所有的数据
  • TRUNCATE TABLE 表名:先删除表,再创建一张一样的空表,推荐使用这个语句删除所有记录
  1. 修改数据
  • 语法:update 表名 set 列名1 = 值1,列名2 = 值2,...[where 条件]

5、DQL:查询表中的数据

DQL查询语句

  1. select * from 表名称:查询一个表的全部数据
  2. 排序查询,语法:order by 句子
  • order by 排序字段1 排序方式1, 排序字段2 排序方式2,......;这里的意思是,首先按照排序方式一,如果方式一一样,那么使用方式二排序;(也就是只有第一种方式一样时,才会判断第二种方式)
    注意:排序方式:
    升序:ASC;降序:DESC
    select * from student order by age DESC;(按照年龄降序排序)
  1. 聚合函数,将一列数据作为一个整体,进行纵向的计算。
  • count:计算个数select count(列名称) from 表名称
  • 注意:聚合函数排除了空的(NULL)的行,解决方法
  • 替换NULL值的方法:select count(ifNULL(name, " ")) from student;
  • 尽量使用统计的列不要有空值的类,一般是主键
  • 使用count(*)
  • max:计算最大值select max(列名) from 表名
  • min:计算最小值select min(列名) from 表名
  • sum:求和select sum(列名) from 表名
  • avg:计算平均值select avg(列名) from 表名
  1. 分组查询:统计具有相同特征的
    语法:group by 字段 select sex, avg(age), count(id), min(age) from student group by sex;
    注意
  • 分组之后只能查询的字段,只有分组字段和聚合函数
  • where 在分组之前限定,如果不满足条件,就不参与分组;having是在分组之后进行限定,如果不满足条件就不会被查询出来
  • where后不可以跟聚合函数,having后可以进行聚合函数的判断
  • select sex, avg(age), count(id), min(age) from student where age > 20 group by sex having count(id) <= 2;
  • 一般可以在聚合函数后写一个别名,这样就可以在判断的时候使用别名
  • select sex, avg(age), count(id) peopleCount, min(age) from student where age > 20 group by sex having peopleCount <= 2;

分页查询

  • 语法:limit 开始的索引,每页查询的条数
  • 公式:开始的索引 = (当前的页码 - 1) × 每页显示的条数
  • 分页操作是每个数据库的操作方法是不一样的,limit关键字只是在MySQL可以使用,其他关系型数据库有自己的语法

6、基础查询

  • 多字段查询语法:SELECT 字段1, 字段2, ... FROM table;
  • 去重:SELECT DISTINCT sex from student;
  • 计算:自己写一个字段参与参与查询:SELECT name, math, english, (math + english) FROM student;
  • 注意:如果有NULL参与计算,结果都为NULL,可以使用函数IFNULL()解决:IFNULL(English, 0)。意思是如果English这一列的值有NULL,就用0替代参与计算
  • 别名:可以给自己写的列起一个别名,使用关键字AS(可以省略):SELECT name, ifnull(math, 0) + english AS 总分 FROM student;

7、条件查询

  1. 关键字WHERE后面跟着条件
  2. 运算符:

运算符

描述

<, >, =, !=, <=, >=

不等于可以使用!=或者<>, 没有==

BETWEEN ... AND

相当于使用 AND连接条件

IN(集合)

相当于使用OR连接条件

IS NULL

NULL值不能使用=判断,要使用IS或者 IS NOT

LIKE

SELECT * FROM student WHERE math > 60;

SELECT * FROM student WHERE math > 90 AND math <= 92;
SELECT * FROM student WHERE math BETWEEN 90 AND 92;

SELECT * FROM student WHERE math = 90 OR math = 92;
SELECT * FROM student WHERE math IN (90, 92, 100);

SELECT * FROM student WHERE math is NULL;-- NULL要使用关键字 IS判断
SELECT * FROM student WHERE math IS NOT NULL;-- NULL要使用关键字 IS判断
SELECT * FROM student WHERE math > 60;

SELECT * FROM student WHERE math > 90 AND math <= 92;
SELECT * FROM student WHERE math BETWEEN 90 AND 92;

SELECT * FROM student WHERE math = 90 OR math = 92;
SELECT * FROM student WHERE math IN (90, 92, 100);

SELECT * FROM student WHERE math is NULL;-- NULL要使用关键字 IS判断
SELECT * FROM student WHERE math IS NOT NULL;-- NULL要使用关键字 IS判断
  1. 模糊查询
    LIKE
    占位符:%(任意多个字符),_(单个任意字符)
SELECT * FROM student WHERE name LIKE '____'; -- name 是四个字符的人
SELECT * FROM student WHERE name LIKE '孙%'; -- 第一个字是孙的人
SELECT * FROM student WHERE name LIKE '%八%'; -- 中间有八字的人
SELECT * FROM student WHERE name LIKE '_八%';-- 第二个子是八的人  
SELECT * FROM student WHERE name LIKE '____'; -- name 是四个字符的人
SELECT * FROM student WHERE name LIKE '孙%'; -- 第一个字是孙的人
SELECT * FROM student WHERE name LIKE '%八%'; -- 中间有八字的人
SELECT * FROM student WHERE name LIKE '_八%';-- 第二个子是八的人