1、SQL分类
SQL语句,根据其功能,主要分为四类:DDL、DML、DQL、DCL。
DDL :数据定义语言,用来定义数据库对象(数据库,表, 字段)
DML:数据操作语言,用来对数据库表中的数据进行增删改
DQL:数据查询语言,用来查询数据库中表的记录
DCL:数据控制语言,用来创建数据库用户、控制数据库的 访问权限
2、数据库操作
(2.1)、查看所有数据库
show databases ;
(2.2)、查询当前使用数据库
select database() ;
(2.3)、创建一个ack、数据库(注:在同一个数据库不能创建相同的数据库名,否则会报错)
create database ack ;
(2.4)、创建一个abc数据库,并指定字符集
create database abc default charset utf8mb4;
(2.5)、删除ack数据库
drop database ack ;
(2.6)、切换数据库
use (数据库名);
3、数据表操作
(3.1)、查询当前数据库所有表
show tables ;
(3.2)创建表结构(如:重新创建一张user的表)
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 '员工表';
(3.3)、查看数据表结构
desc emp
(3.4)、查询指定表的建表句
show create table emp;
(3.5)、添加新字段,为emp表增加一个新的字段”昵称”为nickname,类型为varchar(20)
alter table emp(数据表) add nickname(字段) varchar(20)(类型) comment ‘昵称’;
alter table emp add nickname varchar(20) comment '昵称';
(3.6)、修改数据类型
案列:将emp表的nickname字段修改为username,类型为varchar(30)
alter table emp change nickname username varchar(30) comment '昵称';
(3.7)、删除字段
案列:将emp表的字段username删除
alter table emp drop username ;
(3.8)、修改表名
案列:将emp表的表名修改为 abc
alter table emp rename to abc;
(3.9)、添加数据
案列:给abc表所有的字段添加数据
insert into abc(id,workno,name,gender,age,idcard,entrydate) values(1,'1','Itcast','男',10,'123456789012345678','2000-01-01');
(3.10)、查询数据sql语句(查询数据表首先要进到该数据表的数据库)
select * from abc
(3.11)、删除表
drop table abc ;
四、数据查询的结构
1、操作表,数据表类型
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型
1.1、数值类型
类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
TINYINT | 1byte | (-128,127) | (0,255) | 小整 数值 |
SMALLINT | 2bytes | (-32768,32767) | (0,65535) | 大整 数值 |
MEDIUMINT | 3bytes | (-8388608,8388607) | (0,16777215) | 大整 数值 |
INT/INTEGER | 4bytes | (-2147483648,2147483647) | (0,4294967295) | 大整 数值 |
BIGINT | 8bytes | (-2^63,2^63-1) | (0,2^64-1) | 极大 整数 值 |
FLOAT | 4bytes | (-3.402823466 E+38, 3.402823466351 E+38) | 0 和 (1.175494351 E38,3.402823466 E+38) | 单精 度浮 点数 值 |
DOUBLE | 8bytes | (-1.7976931348623157 E+308, 1.7976931348623157 E+308) | 0 和 (2.2250738585072014 E-308, 1.7976931348623157 E+308) | 双精 度浮 点数 值 |
DECIMAL | 依赖于M(精度)和D(标度) 的值 | 依赖于M(精度)和D(标度)的 值 | 小数 值(精 确定 点数 |
1.2、字符串类型
类型 | 大小 | 描述 |
CHAR | 0-255 bytes | 定长字符串(需要指定长度) |
VARCHAR | 0-65535 bytes | 变长字符串(需要指定长度) |
TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
1.3、日期类型
类型 | 大 小 | 范围 | 格式 | 描述 |
DATE | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续 时间 |
YEAR | 1 | 1901 至 2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时 间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时 间值,时间戳 |
案列:实操
首先创建一个表结构类型(表名为emp)
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 '身份证号',
workaddress varchar(50) comment '工作地址',
entrydate date comment '入职时间' )
comment '员工表';
(4.1)、给emp表添加数据
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (1, '00001', '光头强', '男', 18, '123456757123845670', '狗熊岭', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (2, '00002', '熊大', '男', 19, '123456757123845670', '狗熊岭', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (3, '00003', '熊二', '男', 17, '123456757123845670', '狗熊岭', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (4, '00004', '毛毛', '男', 23, '123456757123845670', '狗熊岭', '2009-12-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (5, '00005', '毛球', '男', 26, '123456757123845670', '狗熊岭', '2009-12-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (6, '00006', '李老板', '男', 30, '123456757123845670', '狗熊岭', '2009-12-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (7, '00007', '贝贝', '男', 26, '123456757123845670', '唐门', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (8, '00008', '唐雅', '女', 25, '123456757123845670', '唐门', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (9, '00009', '唐梧桐', '女', 26, '123456757123845670', '唐门', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (10, '00010', '马小跳', '女', 26, '123456757123845670', '唐门', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (11, '00011', '彩儿', '女', 21, '123456757123845670', '王座', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (12, '00012', '立儿', '女', 21, '123456757123845670', '星辰', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (13, '00013', '比比东', '女', 80, '123456757123845670', '斗罗', '2009-12-01');
(4.2)、基本语法的结构
基本查询(不带任何条件)
条件查询(WHERE)
聚合函数(count、max、min、avg、sum)
分组查询(group by)
排序查询(order by)
分页查询(limit)
(4.3)、表查询实操案例
A、查询emp表指定字段 name, workno, age ,
select name,workno,age from emp;
B、查询emp表所有字段
select * from emp;
C、查询所有员工的工作地址,起别名
select workaddress '工作地址' from emp;
D、查询公司员工的上班地址有哪些(不要重复)
select distinct workaddress from emp;
也可以使用select distinct workaddress from emp ; 来查询
4.4、常用的运算符如下
条件查询
比较运算符 | 功能 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN ... AND ... | 在某个范围之内(含最小、最大值) |
IN(...) | 在in之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配(_匹配单个字符, %匹配任意个字符) |
IS NULL |
(4.5)、实操
A、案列:查询年龄等于80的员工
select * from emp where age=80
B、查询年龄小于20的员工信息
select * from emp where age < 20 ;
C、查询年龄不等于80的员工信息
select * from emp where age != 80;
select * from emp where age <> 80;
D、查询年龄在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;
E、查询性别是,女,且年龄小于30岁的员工信息
select * from emp where gender = '女' and age < 25;
F、查询年龄等于18,21,81的员工信息
select * from emp where age = 18 or age = 21 or age =81;
G、查询姓名为立儿的员工信息
select * from emp where name like '立儿';
六、聚合函数
1、常见的聚合函数
函数 | 功能 |
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
2、语法(注意 : NULL值是不参与所有聚合函数运算的)
案列:
A、统计企业员工的数量
select count(*) 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 = '狗熊岭';
六.二分组查询
1.where和having的区别
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组 之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。
注意事项
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
• 执行顺序: where > 聚合函数 > having 。
• 支持多字段分组, 具体语法为 : group by columnA,columnB
案列:
A、根据性别分组,统计男性员工和女性员工的数量
select gender, count(*) from emp group by gender ;
B、统计男性员工和女性员工的平均年龄
select gender, avg(age) from emp group by gender ;
C、统计各个工作地址上班的男性女性员工数量
select workaddress, gender, count(*) '数量' from emp group by gender , workaddress ;