(二)、SQL 编程语言
1.SQL通用语法
- SQL语句可以单行或多行书写,以
分号结尾
。 - SQL语句可以使用
空格缩进
来增强语句的可读性。 - MySQL数据库的SQL语句
不区分大小写
,关键字建议使用大写。 - 注释:
- 单行注释:
- -
注释内容 或#
注释内容(MySQL特有) - 多行注释:
/ * 注释内容 * /
2.SQL 四大分类
Data Definition Language(DDL)
:数据定义语言,用来定义数据库对象(数据库,表,字段)。Data Manipulation Language(DML)
: 数据操纵语言,用来对数据库表中的数据进行增删改。Data Query Labguage(DQL)
: 数据查询语言,用来查询数据库中表的记录。Data Control Language(DCL)
: 数据控制语言,用来创建数据库用户、控制数据库的访问权限。
3.DDL (数据定义语言)
(1).数据库操作 ->(增删改查)
1.查询
show databases; #查询所有的数据库
select database(); #查询当前数据库
2. 创建
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则]; #假如不存在这个数据库我们就进行创建
3.删除
drop database [if exists] 数据库名; # 假如存在这个数据库就删除
4. 使用
use 数据库名; # 使用我们指定的数据库
(2).表操作 -> (增删改查)
- DDL_表操作_查询
1. 查询当前数据库所有表
show tables; # 展示所有的表
2.查询表结果
DESC 表名;
3.查询指定表的建表语句
show create table 表名;
- DDL_表操作_创建
1.表的创建
create table 表名( 字段1 字段1类型 [comment '字段1注释'], 字段2 字段1类型 [comment '字段2注释'], 字段3 字段3类型 [comment '字段3注释'] )[comment '表注释'];
create table tb_user( id int(4) comment '编号', name varchar(20) comment '姓名', age int(4) comment '年龄', gender varchar(4) comment '性别' ) comment '用户表';
- DDL_表操作_添加
1.给表中添加字段
alter table 表名 add 字段名 字段类型(长度) [comment 注释] [约束];
- DDL_表操作_修改
1.修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
2.修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 新/旧类型(长度) [comment 注释] [约束]; • 1
3.修改表名
alter table 表名 rename to 新表名;
- DDL_表操作_删除
1.删除字段
alter table 表名 drop 字段名;
2.删除表,数据和表结构都删除
drop table[if exists] 表名;
3.删除指定表,并重新创建该表
truncate table 表名;
4.DML (数据操纵语言)
DML英文全称是 Data Manipulation language
(数据操纵语言),用来对数据库中的数据记录进行增删改操作。
- 添加操作 (insert)
- 修改操作(update)
- 删除操作(delete)
(1).DML_添加数据
- 给指定字段添加数据
insert into (字段名1,字段名2...) values(值1,值2...); # 给字段添加数据
- 给全部字段添加数据
insert into 表名 values(值1,值2...);
- 批量添加数据
insert into 表名(字段1,字段2...) values(值1,值2...),(值1,值2...)
insert into 表名 values(值1,值2...),(值1,值2...),(值1,值2...);
注意:
- 插入数据时,指定的字段顺序需要与值得顺序是一一对应的。
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小,应该在字段的规定范围内。
(2).DMl_修改数据
1.多个字段数据修改
update 表名 set 字段1=值1, 字段名2=值2, ... [where 条件];
2.单个字段数据修改
update 表名 set 字段1=值1 [where 条件];
注意:
- 如果不加where条件的话,默认会修改整个表的数据。
- 如果加了where条件的话,默认只会修改单个字段的数据。
(3).DML_删除数据
delete from 表名 [where 条件]
注意:
- delete语句的条件可以有,也可以没有,如果没有的话,则会删除整张表的所有数据。
- delete 语句不能删除某一个字段的值(可以使用update)
5.DQL (数据查询语言) -执行顺序在这 ⭐
DQL 英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。
/* Navicat Premium Data Transfer Source Server : 我的MySQL Source Server Type : MySQL Source Server Version : 60011 Source Host : localhost:3306 Source Schema : itcast Target Server Type : MySQL Target Server Version : 60011 File Encoding : 65001 Date: 29/08/2023 19:17:22 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS `emp`; CREATE TABLE `emp` ( `ID` int(11) NULL DEFAULT NULL COMMENT '编号', `WORKNO` varchar(10) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT NULL COMMENT '工号', `NAME` varchar(10) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT NULL COMMENT '姓名', `GENDER` char(1) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT NULL COMMENT '性别', `AGE` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '年龄', `IDCARD` char(18) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT NULL COMMENT '身份证号', `WORKADDRESS` varchar(50) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT NULL COMMENT '工作地址', `ENTRYDATE` date NULL DEFAULT NULL COMMENT '入职时间' ) ENGINE = InnoDB CHARACTER SET = gbk COLLATE = gbk_chinese_ci COMMENT = '员工表' ROW_FORMAT = Compact; -- ---------------------------- -- Records of emp -- ---------------------------- INSERT INTO `emp` VALUES (1, '1', '柳岩', '女', 20, '123456789012345678', '北京', '2000-01-01'); INSERT INTO `emp` VALUES (2, '2', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01'); INSERT INTO `emp` VALUES (3, '3', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01'); INSERT INTO `emp` VALUES (4, '4', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01'); INSERT INTO `emp` VALUES (5, '5', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01'); INSERT INTO `emp` VALUES (6, '6', '杨道', '男', 28, '12345678931234567X', '北京', '2006-01-01'); INSERT INTO `emp` VALUES (7, '7', '范骚', '男', 40, '123456789212345670', '北京', '2005-05-01'); INSERT INTO `emp` VALUES (8, '8', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-01'); INSERT INTO `emp` VALUES (9, '9', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01'); INSERT INTO `emp` VALUES (10, '10', '陈友凉', '男', 53, '123456789012345670', '上海', '2011-01-01'); INSERT INTO `emp` VALUES (11, '11', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-01'); INSERT INTO `emp` VALUES (12, '12', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01'); INSERT INTO `emp` VALUES (13, '13', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-01'); INSERT INTO `emp` VALUES (14, '14', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01'); INSERT INTO `emp` VALUES (15, '15', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01'); INSERT INTO `emp` VALUES (16, '16', '周芷若', '女', 18, NULL, '北京', '2012-06-01'); SET FOREIGN_KEY_CHECKS = 1;
(1).DQL语法
1.SQL的Select 执行顺序如下:
(1) FROM (3) JOIN (2) ON (4) WHERE (5)GROUP BY (开始使用SELECT中的别名,后面的语句中都可以使用) - 也就是非聚合函数可以使用了 (6) AVG,SUM.... (7)HAVING (8) SELECT (9) DISTINCT (10) ORDER BY (11)LIMIT
2.常见的SQL语法
select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后排序列表 order by 排序字段列表 limit 分页参数
(2).DQL_基本查询
1.查询多个字段
select 字段1,字段2.. from 表名;
2.查询全部字段
select *from 表名;
3.设置别名
select 字段1 [as 别名1],字段2[as 别名2] ... from 表名;
4.去除重复记录
select distinct 字段列表 from 表名;
(3).DQL_条件查询
1.基本语法
select 字段列表 from 表名 where 条件列表;
2.条件
- 比较运算符
> >= 大于 < <= 小于 = 等于 <> != 不等于 between ... and ... 在某个范围之内包含本身 in(...) 在in之后的列表中的值,任选一个即可 like '占位符' 模糊匹配( 占位符是 _ 匹配单个字符, 占位符是 % 匹配任意个字符) is null 值为空 is not null 值不为空
- 逻辑运算符
and && 且条件 or || 或条件 not ! 非,不是
(4).聚合函数
聚合函数: 将一列数据作为一个整体,进行纵向计算。
1.常见的聚合函数
count() #统计数量->统计的是条数不是求和 max() #最大值 min() #最小值 avg() #平均值 sum() #求和
2.聚合函数语法
select 聚合函数(字段列表) from 表名;
注意:
- null值不参与聚合函数运算。
(5).DQL_分组查询
1.语法
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
2.where与having的区别
- 执行时机 : where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。 也就是说where的优先级高
- 判断条件不同 : where不能对聚合函数进行判断,而having可以。 也就是说having的优先级比较低
- 示列
3.1根据性别分组,同级男性员工 和 女性员工的数量
SELECT gender,COUNT(*) FROM emp GROUP BY gender; • 1
3.2根据性别分组,同级男性员工 和 女性员工的平均年龄
SELECT gender,avg(age) FROM emp GROUP BY gender; • 1
3.3查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
SELECT WORKADDRESS,COUNT(*) FROM emp WHERE age<45 GROUP BY WORKADDRESS HAVING COUNT(*)>=3; • 1
注意:
- 进行分组查询的时候,返回的字段通常是分组的条件,返回其他的没有意义。并不是说会报错只是没有意义。
(6).DQL_排序查询
1.支持多条件排序
先按照第一种字段进行排序,假如顺序相同那么就按照第二种字段进行排序。
select 字段列表 from 表名 order by 字段1 排序方式1, 字段2 排序方式2; #先按照第一种字段进行排序,假如顺序相同那么就按照第二种字段进行排序
2.排序方式
- ASC: 升序(默认值)
- DESC: 降序
- 示列
3.1根据年龄对公司员工进行升序排序
SELECT * FROM emp ORDER BY age ASC;
3.2 根据入职时间对员工进行降序排序
SELECT * FROM emp ORDER BY ENTRYDATE DESC; • 1
3.3 根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序
SELECT * FROM emp ORDER BY age ASC,ENTRYDATE DESC; • 1
(7).DQL_分页查询
1.分页语法
select 字段列表 from 表名 limit 起始索引,查询记录数;
注意:
- 起始索引从0开始, 起始索引=(查询页码-1)*每页显示数
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是Limit
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
- 示列
2.1 查询第一页员工数据,每页展示10条
SELECT * FROM emp LIMIT 10
2.2 查询第二页的十条数据
SELECT * FROM emp LIMIT 10,10 • 1
(8).DQL_示列
1.查询年龄为20,21,22,23岁的女性员工信息。
SELECT * FROM emp WHERE gender = '女' AND age in(20,21,22,23); • 1
2.查询性别为男,并且年龄在 20-40 岁以内的姓名为三个字的员工。
SELECT * FROM emp WHERE gender = '男' AND name like'___' AND age BETWEEN 20 AND 40 • 1
3.统计员工表中,年龄小于60岁的,男生员工和女性员工的人数
SELECT gender,count(*) FROM emp WHERE age<60 GROUP BY gender • 1
4.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按照入职降序排序
SELECT name,gender,age FROM emp WHERE age<=35 ORDER BY age ASC,entrydate DESC • 1
5.查询性别为男,且年龄在20-40岁以内的前5个员工,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序
SELECT * FROM emp WHERE gender='男' AND age BETWEEN 10 and 70 ORDER BY age asc, entrydate desc LIMIT 5 • 1
6. DCL (数据控制语言)
(1).DCL 介绍
DCL英文全称是 Data Controller Language (数据控制语言),用来管理数据库用户、控制数据库的访问权限。简单的说就是不同的用户具有不同的管理权限。
(2).DCL 管理用户
- 查询用户
use mysql; select * from user;
- 创建用户
create use '用户名'@'主机名' identified by '密码'
- 修改用户
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
- 删除用户
drop user '用户名'@'主机名';
(3).DCL_权限控制
MySQL 中定义了很多中权限,但是常用的就以下几种。
1.查询权限
show grants for '用户名'@'主机名';
2.授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
3.撤销权限
revoke 权限列表 on 数据库名 from '用户名'@'主机名'