SQL通用语法
-
SQL通用语法
(1)SQL语句可可以执行单行或多行书写,以分号结尾;
(2)SQL语句可以使用空格/缩进来增加语句的可读性;
(3)MySQL数据库的SQL语句不区分大小写,关键字建议使用大写;
(4)注释:单行注释:--注释内容 或 #注释内容(MySQL特有的)
多行注释: /* 注释内容 */
-
SQL语句的分类
(1)DDL Date Definition Language 数据定义语言,用来定义数据库对象(数据库,表,字段)
(2)DML Date Manipulation Language 数据操作语言,用来对数据表的数据进行增删改
(3)DQL Date Query Language 数据查询语言,用来查询数据库中表的记录
(4)DCL Date Control Language 数据控制语言,用来创建数据库用户、控制数据库的访问权限
-
DDL-数据库操作
(1)查询:
查询所有的数据库:SHOW DATABASES;
查询当前数据库: SELECT DATABASE();
(2)创建:[]后的参数是可选的
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集 ] [CONTROL 排序规则];
(3)删除:
DROP DATABASE [IF EXISTS] 数据库名;
(4)使用:
USE 数据库名;
-
DDL-表操作-查询
(1)查询当前数据库所有表
SHOW TABLES;
(2)查询表结构
DESC 表名;
(3)查询指定表的建表语句
SHOW CREATE TABLE 表名;
-
DDL-表操作-创建
(1)创建表
CREATE TABALE 表名(
字段1 字段1类型,
字段2 字段2类型,
... ,
字段n 字段类型
)[COMMENT 表注释];
注意:最后一个字段不要假逗号
(2)CREATE TABLE 新表名 AS SELECT * FROM 旧表名; #复制表结构和数据到新的表里边
(3)CREATE TABLE 新表名 Like 旧表名; #复制表结构到新表
-
DDL-表操作-修改
(1)添加字段
ALTER TABLE 表名 ADD 字段名 类型 (长度) [COMMENT 注释] [约束];
(2)修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
(3)修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度);
-
DDL-表操作-删除
(1)删除字段:
ALTER TABLE 表名 DROP 字段名;
(2)删除表:
DROP TABLE [ IF EXISTS] 表名;
(3)删除制定表,并重新创建该表
TRUNCATE TABLE 表名;
-
DDL-表操作-修改
修改表名:ALTER TABEL 表名 RENAME TO 新表名;
-
DML-添加数据(INSERT)
(1)给指定的字段添加数据
INSERT INTO 表名 (字段名1,字段名2,...) VALUES(值1,值2,...);
(2)给全部字段添加数据
INSERT INTO 表名 VALUES(值1,值2,...); #没有指定字段名,就是给所有的字段添加值
(3)批量添加数据
INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...);
INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,..),(值1,值2);
(4)复制旧表的内容到新表
INSERT INTO new_table SELECT * FROM old_table;
注意:插入数据时,指定的字段顺序需要和值的顺序是一一对应的
字符串和日期型数据应该包含在引号中
插入的数据大小,应该在字段的规定范围内
-
DML-修改数据(UPDATE)
UPDATE 表名 SET 字段名1=值1,字段名2=值2,...[WHERE 条件]; #没有条件时,则说明要修改表中该字段所有的值
-
DML-删除数据(DELETE)
DELETE FROM 表名 [WHERE 条件]; #没有加where时,表示的删除表中所有数据
-
DQL-数据查询语言
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表(聚合函数 count max min count avg sum)
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
(1)DQL-基本查询
1)查询多个字段
SELECT 字段1,字段2,字段3... FROM 表名;
SELECT * FROM 表名;
尽量不要写*
2)设置别名
SELECT 字段1 [AS 别名1],字段2 [AS 别名2] ... FROM 表名;
3)去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
(2)DQL-条件查询
1)语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
2)条件
比较运算符
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<> 或 != 不等于
BETWEEN ... AND ... 在某个范围之内(含最大值、最小值)
IN(...) 在IN之后的列表中的值,多选....
LIKE 占位符 模糊匹配(_匹配单个字符,%匹配任意一个字符)
IS NULL 是NULL
逻辑运算
AND 或 && 并且(多个条件同时成立)
OR 或 || 或者(多个条件任意一个成立)
NOT 或 ! 非,不是
(3)聚合函数
1)介绍
将一列数据作为一个整体,进行纵向计算
2)常见聚合函数
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和
3)语法
SELECT 聚合函数(字段列表) FROM 表名; #null值不参与计算
(4)分组查询
1)语法
SELECT 字段列表 FROM [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
2)where和having区别
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤;
判断条件不同:where不能对聚合函数进行判断,而having可以
select gender,count(*) from 528_1 group by gender;
注意:
执行顺序:where > 聚合函数 >HAVING
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
select gender, count(*) from 528_1 group by gender; 根据性别进行分组,统计男性和女性人员的数量
select gender,avg(age) from 528_1 group by gender; 根据性别进行分组,统计男性和女性人员的平均年龄
select summery,count(*) from 528_1 where age < 30 group by summery having count(*) > 3; 查询年龄小于30,并根据总结分组,获取总数大于3的总结
select summery,count(*) as a1 from 528_1 where age < 30 group by summery having a1 > 3;
(5)排序查询(多字段排序,第一个字段值相同,则用第二个字段排序)
1)语法
SELECT 字段列表 FROM 表名 GROUP BY 字段1 排序方式1,字段2 排序方式2;
2)排序方式
ASE 升序(默认)
DESC 降序
select * from 528_1 order by age asc;
select * from 528_1 order by name desc ;
select * from 528_1 order by age asc,name desc;
(6)分页查询
1)语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
注意:
起始索引从0开始,起始索引 = (查询页码-1) * 每页显示记录数
分页查询是数据库的方言,不同的数据库有不同的分页的实现,MySQL中是LIMIT
如果查询的是第一页,起始索引可以忽略,直接简写为limit 10
(7)练习
查询年龄为22,25,26的员工信息
select * from 528_1 where gender='女' and age in(22,25,26);
查询性别为男,且年龄为28-40以内名词为4位数的员工信息
select * from 528_1 where `528_1`.gender='男' and (age between 26 and 40) and name like '____';
根据性别分组,查询男性人数和女性人数小于30的总数
select gender,count(*) from 528_1 where age < 30 group by `528_1`.gender;
查询所有年龄小于等于30岁的员工的姓名和年龄,并对查询结果年龄升序排序,如果年龄相同则按入职时间降序
select name,age,date from 528_1 where age <= 30 order by age asc , date desc;
查询性别为男,且年龄为22-26岁的3个员工信息,对查询结果按年龄升序排序,年龄相同按时间排序
select * from 528_1 where gender='男' and (age between 22 and 30) order by age,date desc limit 3;
(8)执行顺序
编写顺序 执行顺序
SELECT ④ FROM
字段列表
FROM ① WHERE
表名列表
WHERE ② GROUP BY
条件列表
GROUP BY ③ SELECT
分组字段列表
HAVING ORDER BY
分组后条件列表
ORDER BY ⑤ LIMIT
排序字段列表
LIMIT ⑥
分页参数
-
DCL -管理用户
(1)查询用户
USE mysql;
SELECT * FORM user;
(2)创建用户
CREATE USER ‘用户名'@’主机名' IDENTIFIED BY '密码';
create user `itcast`@`localhost` identified by '123456'; #只能在本机访问数据库
create user `itcast`@`%` identified by '123456';
(3)修改用户密码
ALTER TALBE ‘用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
alter user `itcast`@`localhost` identified with mysql_native_password BY '123';
(4)删除用户
DROP USER '用户名'@'主机名';
-
DCL-权限控制
(1)查询权限
SHOW GRANTS FOR `用户名`@`主机名`;
(2)授予权限
GRANT 权限列表 ON 数据库名.表名 TO `用户名`@`主机名`;
(3)撤销权限
REMOVE 权限列表 ON 数据库名.表名 FROM `用户名`@`主机名`;