SQL基础语法

1 什么是SQL

结构化查询语言(Structured Query Language)简称SQL
SQL语句就是对数据库进行操作的一种语言

2 SQL语句的分类

1、DDL(Data Definition Language) 数据定义语言 用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter等
2、DML(Data Manipulation Language) 数据操作语言 用来对数据库中表的数据进行增删改。关键字:insert, delete, update等
3、DQL(Data Query Language) 数据查询语言 对数据库进行数据查询,关键字select
4、DCL(Data Control Language)数据控制语言(了解)是用来设置或更改数据库用户或角色权限的语句,这个比较少用到

3 SQL通用语法

1、SQL语句可以单行或多行书写,以分号结尾
2、可使用空格和缩进来增强语句的可读性
3、MySQL数据库的SQL语句不区分大小写,关键字建议使用大写

4 SQL的注释

单行注释: - - 注释
多行注释: /注释 /
MYSQL特有的单行注释:# 注释

5 DDL 操作(操作数据库和表)

5.1 DDL 操作数据库

5.1.1 创建数据库

1、直接创建数据库

CREATE DATABASE 数据库名;

2、判断是否存在并创建数据库

CREATE DATABASE IF NOT EXISTS 数据库名;

3、创建数据库并指定字符集(编码表)

CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

5.1.2 查看数据库

1、查看所有的数据库

SHOW DATABASES;

2、查看某个数据库的定义信息

SHOW CREATE DATABASE 数据库名;

5.1.3 修改和删除数据库

1、修改数据库字符集

ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 新字符集;

2、删除数据库

DROP DATABASE 数据名;

5.1.4 使用和切换数据库

1、查看正在使用的数据库

SELECT DATABASE();

2、使用/切换数据库

USE 数据库名;

5.2 DDL 操作表

5.2.1 创建表

1、创建表

CREATE TABLE 表名(
    字段名 数据类型, 
    字段名 数据类型
);

2、快速创建一个表结构相同的表,只是表没有数据

CREATE TABLE 表名 LIKE 其他表;

5.2.2 查看表

1、查看某个数据库中的所有表

SHOW TABLES;

2、查看表结构

DESC 表名;

3、查看创建表的SQL语句

SHOW CRETE TABLE 表名;

5.2.3 删除表

1、直接删除表

DROP TABLE 表名;

2、判断表是否存在并删除表

DROP TABLE IF EXISTS 表名;

5.2.4 修改表结构

1、添加一列(字段)

ALTER TABLE 表名 ADD 字段名 字段类型;

2、修改列类型(MODIFY只能修改类型)

ATLER TABLE 表名 MODIFY 字段名 新的类型;

3、修改列名(CHANGE可以同时修改字段和类型)

ALTER TABLE 表名 CHANGE 老字段名 新字段名 类型;

4、删除列

ALTER TABLE 表名 DROP 字段名;

5、修改表名

RENAME TALBE 旧表名 TO 新表名;

6、修改表的字符集

ALTER TABLE 表名 DEFAULT CHARACTER SET 新字符集;

6 DML 操作(操作数据/记录)

DML是对表中的数据进行增删改

6.1 插入操作

6.1.1 插入全部字段

-- 所有的字段名都写出来:
INSERT INTO 表名 (字段名1, 字段名2...) VALUES (字段值1, 字段值2);

-- 不写字段名
INSERT INTO 表名 VALUES (字段值1, 字段值2);

-- 同时参入多个条记录
INSERT INTO 表名 VALUES (字段值1, 字段值2),(字段值1, 字段值2),(字段值1, 字段值2);

6.1.2 插入部分字段

-- 只需要指定要插入数据的字段,没有添加数据的字段会使用NULL
INSERT INTO 表名 (字段名1, 字段名2...) VALUES (字段值1, 字段值2);

6.1.3 注意事项

1、值与字段必须对应,个数相同,类型相同
2、值的数据大小必须在字段的长度范围内
3、除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号)
4、如果要插入空值,可以不写字段,或者插入null

6.1.4 DOS命令窗口操作数据乱码问题

/* 
	在dos命令窗口执行sql操作的时候,由于MySQL的客户端设置编码是utf8,
	而系统的DOS命令行编码是gbk,编码不一致会导致乱码问题
    以下方式为临时方案,退出DOS命令行就失效了,需要每次都配置
*/

set names gbk;

6.2 更新/修改操作

6.2.1 不带条件的更新数据库记录

UPDATE 表名 SET 字段名=新的值;

6.2.2 带条件更新数据库记录

UPDATE 表名 SET 字段名=新的值 WHERE 条件;

6.3 删除操作

6.3.1 带条件删除数据

DELETE FROM 表名 WHERE 字段名=值;

6.3.2 不带条件删除数据

DELETE FROM 表名;

6.3.3 DELETE和TRUNCATE的区别

-- 扩展delete和truncate的区别
-- delete只删除数据,不会重置主键的值,比如删表前最后的id=100,那么重新插入数据会从id=101开始
DELETE FROM st6;
INSERT INTO st6 (NAME,age) VALUES ('哈吉',21),('敬理',23),('王大',29);

-- truncate删除这张表,在创建一张一样的表,主键重置,比如删表前最后的id=100,那么重新插入数据会从id=1开始
TRUNCATE  st6;
INSERT INTO st6 (NAME,age) VALUES ('哈吉',21),('敬理',23),('王大',29);

7 DQL 操作

查询不会对数据库中的数据进行修改,只是一种显示数据的方式

7.1 查询表中的所有数据

1、写出查询每列的名称

SELECT 字段名1, 字段名2,... FROM 表名;

2、使用*表示所有列

SELECT * FROM 表名;

7.2 查询表中指定列

SELECT 字段名1, 字段名2 FROM 表名;

7.3 查询时使用别名

-- AS可以省略,使用别名的好处是方便观看和处理查询到的数据

SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名 AS 表别名;

7.4 清除重复值查询

SELECT DISTINCT 字段名 FROM 表名;

7.5 查询结果参与运算

参与运算的必须是数值类型
1、某列数据和固定值运算

SELECT 字段名 + 数值 FROM 表名;

2、某列数据和其他列数据参与运算

SELECT 字段1 + 字段2 FROM 表名;

7.6 蠕虫复制

7.6.1 什么是蠕虫复制

将一张表的数据复制,插入到另一张表中

7.6.2 语法格式

INSERT INTO 表名1 SELECT * FROM 表名2;

7.6.3 具体操作步骤

1、创建student2表,student2结构和student表结构一样

CREATE TABLE student2 LIKE student;

2、将student表中的数据添加到student2表中

INSERT INTO student2 SELECT * FROM student;

注意事项:如果只想复制student表中name,age字段数据到student2表中使用如下格式

INSERT INTO student2(NAME, age) SELECT NAME, age FROM student;

7.7 条件查询

7.7.1 格式

SELECT 字段 FROM 表名 WHERE 条件;

7.7.2 查询条件可能用到的运算符

7.7.2.1 比较运算符

>            -- 大于 
<            -- 小于
<=           -- 小于等于
>=           -- 大于等于
=            -- 等于
<>、!=       -- 不等于

7.7.2.2 逻辑运算符

and(&&)        -- 多个条件同时满足
or(||)         -- 多个条件其中一个满足
not(!)         -- 不满足,取反

7.7.2.3 IN关键字

1、in里面的每个数据都会作为一次条件,只要满足条件的就会显示
2、格式:

SELECT * FROM 表名 WHERE 字段名 IN (值1, 值2, 值3);

7.7.2.4 BETWEEN…AND…范围查询

1、范围包括头也包括尾
2、格式:

SELECT * FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值2;

7.8 模糊查询 LIKE

1、格式

SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';

2、说明
满足通配符字符串规则的数据就会显示出来

-- MySQL通配符有两个:

%     表示任意多个字符
_     表示一个字符

7.9 排序查询

1、格式

SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名 [ASC|DESC];

[]表示可以不要
|表示二选一
ASC: 升序(默认的)
DESC: 降序

7.9.1 单列排序

单列排序就是使用一个字段排序

-- 按照年龄的降序查询学生所有的信息
select * FROM student order by age DESC;

7.9.2 组合排序

组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推
1、格式

SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名 [ASC|DESC], 字段名 [ASC|DESC];
-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序

SELECT * FROM student ORDER BY age DESC, math DESC;

7.10 聚合函数查询

聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值NULL。

-- 五个聚合函数:
count: 统计指定列记录数,记录为NULL的不统计
sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为0
max: 计算指定列的最大值(要求是数值类型才计算)
min: 计算指定列的最小值(要求是数值类型才计算)
avg: 计算指定列的平均值(要求是数值类型才计算)

1、格式

SELECT 聚合函数 FROM 表名 WHERE 过滤条件;
--  注意:统计数量常用*号
SELECT COUNT(*) FROM student;

7.11 分组查询(和聚合函数一起使用)

对查询后的结果进行分组

7.11.1 格式

SELECT * FROM 表名 WHERE 条件 GROUP BY 字段名;

上面的SQL会将sex相同的数据作为一组,然后返回每组的第一条数据
SQL基础语法_第1张图片

7.11.3 案例说明分组函数的原理

GROUP BY将分组字段的相同值作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。

分组后聚合函数的作用:不是操作所有数据,而是分别操作每组数据。

一般按什么字段名分组,SELECT后面就写什么字段名

SELECT SUM(math), sex FROM student3 GROUP BY sex;

执行上面SQL后效果如下:
在这里插入图片描述
实际上是将每组的math进行求和,返回每组统计的结果
SQL基础语法_第2张图片

7.11.4 案例

需求:查询年龄大于25岁的人,按性别分组,统计每组的人数

1.先过滤掉年龄小于25岁的人
2.再分组
3.最后统计每组的人数
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex;

SQL基础语法_第3张图片
注意事项:对于分组后的条件需要使用having子句(WHERE先执行,然后执行GROUP BY,最后才执行HAVING)

-- having与where的区别

having是在分组后对数据进行过滤
where是在分组前对数据进行过滤

having后面可以使用聚合函数
where后面不可以使用聚合函数

7.12 LIMIT语句:用做分页

1、格式

-- offset  跳过的记录数,不写则默认为0。
-- length  要显示的总记录数
SELECT * FROM 表名 WHERE 条件 LIMIT offset, length;
-- 跳过前面2条,显示(取)6条数据
SELECT * FROM student3 LIMIT 2,6;

7.13 SQL查询的执行顺序

SELECT 字段名 FROM 表名 WHERE 条件 GROUP BY 分组列名 HAVING 条件 ORDER BY 排序列名 LIMIT 跳过的行数, 显示的行数;
-- 顺序如下
1.FROM:      从哪个表中获取数据
2.WHERE:     过滤表中的数据
3.GROUP BY:  将过滤后的数据进行分组
4.HAVING:    对分组后的数据再进行过滤
5.SELECT:    获得结果集(过滤、分组之后的数据-- 看做是一张新的表)
6.ORDER BY:  将结果集按照某种顺序对数据进行排序
7.LIMIT:      将排序后的数据分页显示

注意:GROUP BY之后计算SELECT后面的集合函数

8 数据库约束

8.1 数据库约束的作用

对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性

8.2 数据库约束的种类

PRIMARY KEY:  主键约束
UNIQUE:       唯一约束
NOT NULL:     不为空
DEFAULT:      默认约束
FOREIGN KEY:  外键约束 (笔记在多表的查询)

8.3 主键约束(PRIMARY KEY)

每张表都应该有一个主键,并且每张表只能有一个主键

8.3.1 主键的作用

== 区分表中的记录==

8.3.2 那个字段作为主键

通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行

8.3.3 主键的特点

主键必须唯一,不能重复
主键不能为NULL

8.3.4 创建主键的方式

8.3.4.1 在创建表的时候给字段添加主键

CREATE TABLE 表名 (
	字段名 字段类型 PRIMARY KEY,
	字段名 字段类型
);

8.3.4.2 在已有表中添加主键

ALTER TABLE 表名 ADD PRIMARY KEY(字段名);

8.3.4.3 删除主键

ALTER TABLE 表名 DROP PRIMARY KEY;

8.3.4.4 主键自增(PRIMARY KEY AUTO_INCREMENT)

CREATE TABLE 表名 (
	字段名 字段类型 PRIMARY KEY AUTO_INCREMENT,
	字段名 字段类型
);

注意事项:AUTO_INCREMENT表示自动增长(修饰的字段类型必须是整数类型)

8.3.4.5 修改自增长起始值

默认地AUTO_INCREMENT 的开始值是1,如果希望修改起始值,请使用下列SQL语法

ALTER TABLE 表名 AUTO_INCREMENT=起始值;

8.4 唯一约束(UNIQUE)

8.4.1 唯一约束的作用

这个字段的值不能够重复

8.4.2 唯一约束的格式

CREATE TABLE 表名 (
	字段名 字段类型 UNIQUE,
	字段名 字段类型
);

8.5 非空约束(NOT NULL)

8.5.1 非空约束的作用

限制表中数据不能为空

8.5.2 非空约束的格式

CREATE TABLE 表名 (
	字段名 字段类型 NOT NULL,
	字段名 字段类型
);

8.5.3 主键和定义为非空唯一的普通字段的区别

1.一张表只能有一个主键,可以有多个唯一非空的字段
2.主键可以自动增长,普通字段不行

8.6 默认值(DEFAULT)

8.6.1 默认值的作用

如果这个字段不设置值,就使用默认值。

8.6.2 默认值的格式

CREATE TABLE 表名 (
	字段名 字段类型,
	字段名 字段类型 DEFAULT 默认值
);

你可能感兴趣的:(MySQL)