一、SQL语言分类:
1、DDL:数据库定义语言;用于数据库、表、视图、等的建立、删除。
DDL包括create、alter、drop等。
2、DML:数据库操纵语言:用于增、删、改、查。
DML包括insert、delete、update。
3、DCL:数据库控制语言;数据库对象的权限管理和事务管理。
DCL包括commit、rollback、grant等。
4、DQL:数据查询语言;查询是数据库的基本功能。
DQL使用select查询数据库表中记录。
二、DDL:
1、DDL之数据库:
DDL对数据库的操作主要有两种
1)、创建数据库:
CREATE DATABASE 数据库名
2)、删除数据库:
DROP DATABASE 数据库名
2、DDL之数据表:
在DDL中,对数据表的操作主要有3种:创建、修改和删除。 创建数据表,需要定义的信息主要包括:表名、字段名、字段类型 。1)、MySQL的建表语法
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name [(create_definition,…)] [table_options]
[select_statement]
TEMPORARY:表示创建临时表,在当前会话结束后将自动消失
IF NOT EXISTS:在建表前,先判断表是否存在,只有该表不存在时才创建
create_definition:建表语句的关键部分,用于定义表中各列的属性
table_options:表的配置选项,例如:表的默认存储引擎、字符集
select_statement:通过select语句建表
2)、操作已经存在表
对于已经存在的表,可以使用alter命令添加、修改、删除字段,也可以对表进行删除操作。
#添加字段sex,类型为VARCHAR(1)
ALTER TABLE contacts ADD sex VARCHAR(1);
#修改字段sex的类型为tinyint
ALTER TABLE contacts MODIFY sex tinyint;
#删除字段sex
ALTER TABLE contacts DROP COLUMN sex;
#删除contacts表
DROP TABLE contacts;
三、DML:
1、插入数据(INSERT ):
在MySQL中,使用insert into语句向数据表中插入数据。INSERT 插入单条数据:
INSERT INTO table_name (field1, field2, ..., fieldN) VALUES (value1, value2, ..., valueN);
INSERT 插入多条数据:
INSERT INTO table_name (field1, field2, ..., fieldN) VALUES (valueA1, valueA2, ..., valueAN), (valueB1,
valueB2, ..., valueBN), …, (valueN1, valueN2, ..., valueNN);
注意事项:
1、如果字段是字符型,值必须使用单引号或者双引号,如”value”;如果值本身带单引号或双引号,需要转义
2、如果所有列都要添加数据,insert into语句可以不指定列,即
INSERT INTO table_name VALUES (value1, value2, ..., valueN);
2、修改数据(update):
在MySQL中,使用update语句来修改数据表中的数据。update语法:
UPDATE table_name SET field1=newValue1, field2=newValue2 [WHERE Clause]
注意事项:
1、可以同时更新一个或多个字段
2、可以通过where子句来指定更新的范围,如果不带where,则更新数据表中的所有记录
3、删除数据(delete):
在MySQL中,使用delete语句来删除数据表中的数据。delete语法:
DELETE FROM table_name [WHERE Clause]
注意事项:
1、可以通过where子句来指定删除的范围,如果不带where,则删除数据表中的所有记录
四、DQL:
1、条件查询(where)
单条件查询
#SQL语句中使用where子句语法
SELECT column_name FROM table_name WHERE column_name 运算符 value
多条件查询
#and、or运算符语法
SELECT column_name FROM table_name WHERE condition1 AND condition2 OR condition3
2、去重查询(distinct):
distinct用于在查询中返回列的唯一不同值(去重复);如果在查询数据时,希望得到某列的所有 不同值,可以使用distinct。#distinct语法
SELECT DISTINCT column_name, column_name
FROM table_name;
3、分组查询:
#group by
group by表示根据某种规则对数据进行分组,它必须配合聚合函数进行使用,对数 据进行分组后可以进行count、sum、avg、max和min等运算。#group by语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
说明:
1.
aggregate_function表示聚合函数。
2.
group by可以对一列或多列进行分组。
#group_concat语法
group_concat([distinct] column_name [order by column_name asc/desc ] [separator '分隔符'])
group_concat配合group by一起使用,用于将某一列的值按指定的分隔符进行拼接,MySQL默认
的分隔符为逗号
4、having的使用
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。HAVING 子句可 以对分组后的各组数据进行筛选。#having语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
5、查询结果排序与分页
order by的使用
在SQL中,使用order by对查询结果集进行排序,可以按照一列或多列进行排序。#order by语法
SELECT column_name1, column_name2
FROM table_name1, table_name2
ORDER BY column_name, column_name [ASC|DESC]
说明:
1.
ASC表示按升序排列,DESC表示按降序排列。
2.
默认情况下,对列按升序排列。
limit的使用
在SELECT语句中使用LIMIT子句来约束要返回的记录数,通常使用LIMIT实现分页。#limit语法
SELECT column_name1, column_name2
FROM table_name1, table_name2
LIMIT [offset,] row_count
说明:
1.
offset指定要返回的第一行的偏移量。第一行的偏移量是0,而不是1。
2.
row_count指定要返回的最大行数。
5、自连接查询
自连接是一种特殊的表连接,它是指相互连接的表在物理上同为一张表,但是逻辑上是多张表。自 连接通常用于表中的数据有层次结构,如区域表、菜单表、商品分类表等。#自连接语法
SELECT A.column, B.column
FROM table A, table B
WHERE A.column = B.column;
6、IN和LIKE的使用
#where子句使用in语法
SELECT column_name FROM table_name WHERE column_name IN(value1, value2, …)
#where子句使用like语法
SELECT column_name FROM table_name WHERE column_name LIKE ‘%value%’
说明:
1、LIKE子句中的%类似于正则表达式中的*,匹配任意0个或多个字符
2、LIKE子句中的_匹配任意单个字符
3、LIKE子句中如果没有%和_,就相当于运算符=的效果
7、子查询in、exists
#子查询in语法
SELECT column_name FROM table_name
WHERE column_name IN(
SELECT column_name FROM table_name [WHERE]
);
#子查询exists
EXISTS是子查询中用于测试内部查询是否返回任何行的布尔运算符。将主查询的数据放到子查询中 做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否保留。#where子句使用exists语法
SELECT column_name1
FROM table_name1
WHERE EXISTS (SELECT * FROM table_name2 WHERE condition);