SQL
SQL通用语法:
SQL分类:
DDL:
数据库操作
查询:
SHOW DATABASES;
创建:
CREATE DATABASE[IF NOT EXISTS] 数据库名 [DEFAULT CHARSET字符集] [COLLATE 排序规则];
删除:
DROP DATABASE [IF EXISTS] 数据库名;
使用:
USE 数据库名;
DDL - 表操作 - 查询:
查询当前数据库所有表
SHOW TABLES;
查询表结构:
DESC 表名
查询指定表的建表语句:
SHOW CREATE TABLE 表名;
DDL - 表操作 - 创建:
DDL - 表操作 - 数据类型
create table emp(
-> id int comment '编号',
-> workno varchar(10) comment '员工工号',
-> name varchar(10) comment '姓名',
-> gender char(1) comment '性别',
-> age tinyint unsigned comment '年龄',
-> idcard char(18) comment '身份证号',
-> entrydate date comment '入职时间'
-> ) comment '员工表';
DDL - 表操作 - 修改
添加字段:
ALTER TABLE 表名 ADD 字段名 类型(长度)[COMMENT 注释][约束];
修改数据类型:
ALTER TABLE MODIFY 字段名 新数据类型(长度)
修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)[COMMENT 注释]
删除字段:
ALTER 表名 DROP 字段名;
修改表名:
ALTER TABLE 表名 RENAME TO 新表名;
DDL - 表操作 - 删除
删除表
DROP TABLE [IF EXISTS] 表名
删除指定表,并重新创建该表
TRUNCATE TABLE 表名;
相当于清空
DML:
DML - 添加数据
给指定字段添加数据
INSERT INTO 表名(字段1,字段2)VALUES(值1,值2);
给全部字段添加数据
INSERT INTO 表名 VALUES(值1,值2);
批量添加数据
INSERT INTO 表名(字段1,字段2) VALUES (值1,值2),(值1,值2),(值1,值2);
INSERT INTO 表名 VALUES(值1,值2),(值1,值2);
注:
- 插入数据时,指定的字段顺序需要与值的顺序是一一对应的
- 字符串和日期数据应该在包含在引号中
- 插入的数据应该在范围内
DML - 修改数据
UPDATE 表名 SET 字段名1 = 值1,字段名2 = 值2,[WHERE ...]
注:修改语句的条件可以有,也可以没有,如果么有条件,则会修改整张表的所有数据。
DML - 删除数据
DELETE FROM 表名 [WHERE 条件];
DQL:
语法:
DQL - 基本查询:
查询多个字段
SELECT 字段1,字段2,字段3 ... FROM 表名;
SELECT * FROM 表名
设置别名
SELECT 字段1 [AS 别名1],字段2 [AS 别名2]... FROM 表名;
去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
DQL - 条件查询:
语法:
SELECT 字段列表 FROM 表名 WHERE 条件列表;
-- --------------------------------------------------- > 查询需求 <----------------------------------------------
-- 基本查询
-- 1. 查询指定字段 name workno age 返回
select name,workno,age from emp;
-- 2. 查询所有字段返回
select * from emp;
-- 3. 查询所有员工的工作地址,起别名
select workaddress as '工作地址' from emp;
-- 4. 查询公司员工的上班地址(不重复)
select distinct workaddress '工作地址' from emp;
-- 条件查询
-- A. 查询年龄等于 88 的员工
select * from emp where age = 88;
-- B. 查询年龄小于 20 的员工信息
select * from emp where age <= 20;
-- D. 查询没有身份证号的员工信息
select * from emp where idcard is null;
-- E. 查询有身份证号的员工信息
select * from emp where idcard is not null;
-- F. 查询年龄不等于 88 的员工信息
select * from emp where age <> 88;
-- G. 查询年龄在15岁(包含) 到 20岁(包含)之间的员工信息
select * from emp where age >=15 && age<=20;
select * from emp where age >=15 AND age<=20;
select * from emp where age between 15 and 20; -- between 跟最小值
-- H. 查询性别为 女 且年龄小于 25岁的员工信息
select * from emp where gender = '女' and age <25;
-- I. 查询年龄等于18 或 20 或 40 的员工信息
select * from emp where age = 18 || age = 20 || age = 40 ;
select * from emp where age in(18,20,40);
-- J. 查询姓名为两个字的员工信息 _ %
select * from emp where name like '__';
-- K. 查询身份证号最后一位是X的员工信息
select * from emp where idcard like '%X';
聚合函数:
分组查询:
排序查询:
分页查询:
DQL -聚合函数:
常见聚合函数
语法:
SELECT 聚合函数(字段列表) FROM 表名;
注:null值不参与所有聚合函数的运算
-- ------------------------------------> 聚合函数--
-- A. 统计该企业员工数量
select count(*) from emp;
select count(idcard) from emp;
-- B. 统计该企业员工的平均年龄
select avg(age) from emp;
-- C. 统计该企业员工的最大年龄
select max(age) from emp;
-- D. 统计该企业员工的最小年龄
select min(age) from emp;
-- E. 统计西安地区员工的年龄之和
select sum(age) from emp where workaddress = '西安';
DQL -分组函数:
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
where 和 having区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以
-- 分组查询
-- A. 根据性别分组 , 统计男性员工 和 女性员工的数量
select gender,count(*) from emp group by gender ;
-- B. 根据性别分组 , 统计男性员工 和 女性员工的平均年龄
select gender,avg(age) from emp group by gender;
-- C. 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址
select workaddress,count(*) address_count from emp where age <45 group by workaddress having address_count >= 3;
-- D. 统计各个工作地址上班的男性及女性员工的数量
select workaddress,gender,count(*) '数量' from emp group by gender, workaddress;
- 执行顺序:where > 聚合函数 > having
- 分组之后,查询字段一般为聚合函数和分组字段,查询其他字段无任何意义。
DQL -排序查询:
语法:
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
排序方式:
-- 排序查询
-- A.根据年龄对公司的员工进行升序排序
select * from emp order by age asc;
select * from emp order by age desc ;
-- B. 根据入职时间, 对员工进行降序排序
select * from emp order by entrydate desc;
-- C. 根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序
select * from emp order by age asc, entrydate desc;
注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
DQL -分页查询:
语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
-- 分页查询
-- A. 查询第1页员工数据, 每页展示10条记录
select * from emp limit 10;
-- B. 查询第2页员工数据, 每页展示10条记录 --------> (页码-1)*页展示记录数
select * from emp limit 10,10;
练习:
-- 2.6.8 案例
-- 1). 查询年龄为20,21,22,23岁的员工信息。
select * from emp where gender = '女' and age in(20,21,22,23);
-- 2). 查询性别为 男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。
select * from emp where gender = '男' and (age between 20 and 40) and name like '___';
-- 3). 统计员工表中, 年龄小于60岁的 , 男性员工和女性员工的人数。
select gender,count(*) from emp where age < 60 group by gender;
-- 4). 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
select name '姓名',age '年龄' from emp where age <= 35 order by age asc,entrydate desc ;
-- 5). 查询性别为男,且年龄在20-40 岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
select * from emp where gender = '男' and (age between 20 and 40) order by age asc,entrydate desc limit 5;
DQL -执行顺序:
DCL:
DCL - 管理用户:
1) 查询用户
select * from mysql.user; 1
2). 创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; 1
3). 修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ; 1
4). 删除用户
DROP USER '用户名'@'主机名' ;
注意事项:
• 在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户。
DCL- 权限控制