/**
DDL:操作数据库
**/ -- 查询所有数据库
SHOW DATABASES;-- 创建数据库
CREATE DATABASE stu;-- 创建数据库的第二种方式:先判断数据库是否存在,存在就创建
CREATE DATABASE
IF
NOT EXISTS stu2;-- 删除数据库
DROP DATABASE stu;-- 删除数据库的第二种方式:先判断数据库是否存在,存在就删除
DROP DATABASE
IF
EXISTS stu2;-- 使用数据
USE del;-- 查看当前使用的数据库
SELECT DATABASE
();
/**
DDL:操作表
**/-- 查询表
SHOW TABLES;-- 查询表结构
DESC onetable;-- 创建表
CREATE TABLE twotable ( id INT, NAME VARCHAR ( 20 ), PASSWORD VARCHAR ( 32 ) ) -- 创建表的练习
/**
需求:设计一张学生表,请注重数据类型、长度的合理性
1. 编号
2. 姓名,姓名最长不超过10个汉字
3. 性别,因为取值只有两种可能,因此最多一个汉字
4. 生日,取值为年月日
5. 入学成绩,小数点后保留两位
6. 邮件地址,最大长度不超过 64
7. 家庭联系电话,不一定是手机号码,可能会出现 - 等字符
8. 学生状态(用数字表示,正常、休学、毕业...
*/
CREATE TABLE threetable (
id INT,-- 编号
NAME VARCHAR ( 20 ),-- 姓名
gender CHAR ( 1 ),-- 性别
birthday date,-- 生日
score DOUBLE ( 5, 2 ),-- 入学成绩
email VARCHAR ( 64 ),-- 电子邮件
tel VARCHAR ( 15 ),-- 家庭联系方式
STATUS TINYINT -- 学生状态
) -- 删除表
DROP TABLE onetable;-- 删除表的第二种方式:先判断数据库是否存在,存在就删除
DROP TABLE
IF
EXISTS twotable;-- 修改表名
ALTER TABLE threetable RENAME TO onetable -- 添加一列 也就是新增一个字段
ALTER TABLE onetable ADD address VARCHAR ( 50 );-- 给 onetable 表新增一个字段:address 这个字段类型是 varchar(50)
-- 修改一列 也就是修改一个字段的类型
ALTER TABLE onetable MODIFY address CHAR ( 50 );-- 给 onetable 表修改一个字段:address 这个字段的类型修改成 char(50)
-- 修改字段的名称和类型 也就是字段名和类型都修改
ALTER TABLE onetable CHANGE address addr VARCHAR ( 50 );-- 把 onetable 表中的 address字段修改成 addr,并且把类型修改成 varchar(50)
-- 删除某一个字段
ALTER TABLE onetable DROP addr;
/**
DML:对表中的数据进行 增删改查
**/-- 查询所有数据
SELECT
*
FROM
onetable;-- 给指定的表添加数据
INSERT INTO onetable
VALUES
( 1, "测试1号", '男', '2000-09-15', 83.24, '[email protected]', '15245236523', 1 );-- 第二种添加数据方式:给指定的列添加数据
INSERT INTO onetable ( id, NAME )
VALUES
( 2, "测试2号" );
INSERT INTO onetable ( id, NAME )
VALUES
( 8, "测试8号" );-- 批量添加数据
INSERT INTO onetable
VALUES
( 3, "测试3号", '男', '2000-09-15', 83.24, '[email protected]', '15245236523', 2 ),(
4,
"测试4号",
'男',
'2000-09-15',
83.24,
'[email protected]',
'15245236523',
1
);-- 修改某一条数据
UPDATE onetable
SET gender = '女',
birthday = '1999-09-15'
WHERE
id = 2;-- 删除某条数据
DELETE
FROM
onetable
WHERE
id = 8;
/**
DQL:对表中的数据进行 查询
**/-- 先准备一些数据,方便进行查询演示
-- 删除stu表
DROP TABLE
IF
EXISTS stu;-- 创建stu表
CREATE TABLE stu (
id INT,-- 编号
NAME VARCHAR ( 20 ),-- 姓名
age INT,-- 年龄
sex VARCHAR ( 5 ),-- 性别
address VARCHAR ( 100 ),-- 地址
math DOUBLE ( 5, 2 ),-- 数学成绩
english DOUBLE ( 5, 2 ),-- 英语成绩
hire_date date -- 入学时间
);
-- 添加数据
INSERT INTO stu ( id, NAME, age, sex, address, math, english, hire_date )
VALUES
( 1, '马运', 55, '男', '杭州', 66, 78, '1995-09-01' ),
( 2, '马花疼', 45, '女', '深圳', 98, 87, '1998-09-01' ),
( 3, '马斯克', 55, '男', '香港', 56, 77, '1999-09-02' ),
( 4, '柳白', 20, '女', '湖南', 76, 65, '1997-09-05' ),
( 5, '柳青', 20, '男', '湖南', 86, NULL, '1998-09-01' ),
( 6, '刘德花', 57, '男', '香港', 99, 99, '1998-09-01' ),
( 7, '张学右', 22, '女', '香港', 99, 99, '1998-09-01' ),
( 8, '德玛西亚', 18, '男', '南京', 56, 65, '1994-09-02' );-- 基础查询 查询所有字段
SELECT
*
FROM
stu;-- 基础查询 查询指定的字段
SELECT NAME
,
sex
FROM
stu;-- 去除重复的记录
SELECT DISTINCT
sex
FROM
stu;-- 基础查询练习:查询姓名、数学成绩、英语成绩,并且通过 as 给math和english起备用名
SELECT NAME
,
math AS '数学成绩',
english AS '英语成绩'
FROM
stu;-- 条件查询
SELECT NAME
,
math AS '数学成绩'
FROM
stu
WHERE
sex = '男';-- 条件查询练习:查询年龄大于20
SELECT
*
FROM
stu
WHERE
age > 20;-- 条件查询练习:查询年龄大于等于20
SELECT
*
FROM
stu
WHERE
age >= 20;-- 条件查询练习:查询年龄大于20并且小于30
SELECT
*
FROM
stu
WHERE
age > 20 && age < 30; SELECT * FROM stu WHERE age > 20
AND age < 30;
SELECT
*
FROM
stu
WHERE
age BETWEEN 20 adn 30;-- 条件查询练习:查询入学日期在 1998-09-01 到 1999-09-01
SELECT
*
FROM
stu
WHERE
hire_date BETWEEN '1998-09-01' adn '1999-09-01';-- 条件查询练习:查询年龄不等于18
SELECT
*
FROM
stu
WHERE
age != 18;
SELECT
*
FROM
stu
WHERE
age <> 18;-- 条件查询练习:查询年龄等于18 或者 等于20 或者 等于22
SELECT
*
FROM
stu
WHERE
age = 18
OR age = 20
OR age = 22;
SELECT
*
FROM
stu
WHERE
age IN ( 18, 20, 22 );-- 条件查询练习:查询英语成绩为null
SELECT
*
FROM
stu
WHERE
english IS NULL;
SELECT
*
FROM
stu
WHERE
english IS NOT NULL;-- 英语成绩不等于 null
-- 模糊查询练习
/*
模糊查询使用 like 作为关键字
_:代表单个任意字符
%:代表任意个数字符
**/-- 模糊查询练习:查询 姓‘马’的信息
SELECT
*
FROM
stu
WHERE
NAME LIKE '马%' -- 模糊查询练习:查询第二个字是‘花’的信息
SELECT
*
FROM
stu
WHERE
NAME LIKE '_花%' -- 模糊查询练习:查询名字中包含‘德’的信息
SELECT
*
FROM
stu
WHERE
NAME LIKE '%德%' -- 排序查询
/**
ASC:升序排序
DESC:降序排序
*/-- 排序查询练习:查询学生信息,按照年龄升序排序
SELECT
*
FROM
stu
ORDER BY
age;-- 排序查询练习:查询学生信息,按照数学成绩降序排序
SELECT
*
FROM
stu
ORDER BY
math DESC;-- 排序查询练习:查询学生信息,按照数学成绩排序,如果数学成绩一样,在按照英语成绩升序排序
SELECT
*
FROM
stu
ORDER BY
math DESC,
english ASC;-- 聚合函数
/**
count 统计数量
max 最大值
min 最小值
sum 求和
avg 平均值
**/-- 聚合函数练习:统计班级一共多少学生
SELECT
count(*)
FROM
stu;-- 聚合函数练习:查询数学最高分
SELECT
max( math )
FROM
stu;-- 聚合函数练习:查询数学最低分
SELECT
min( math )
FROM
stu;-- 聚合函数练习:查询数学平均分
SELECT
avg( math )
FROM
stu;-- 聚合函数练习:查询数学总分
SELECT
sum( math )
FROM
stu;-- 分组查询
/**
语法:
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
**/-- 分组查询练习:查询男生和女生各自的平均分
SELECT
sex,
avg( math )
FROM
stu
GROUP BY
sex;-- 分组查询练习:查询男生和女生各自的平均分已经各自人数
SELECT
sex,
avg( math ),
count(*)
FROM
stu
GROUP BY
sex;-- 分组查询练习:查询男生和女生各自的平均分已经各自人数,要求:低于70分的不参与分组
SELECT
sex,
avg( math ),
count(*)
FROM
stu
WHERE
math > 70
GROUP BY
sex;-- 分组查询练习:查询男生和女生各自的平均分已经各自人数,要求:低于70分的不参与分组,分组后人数大于2个的
SELECT
sex,
avg( math ),
count(*)
FROM
stu
WHERE
math > 70
GROUP BY
sex
HAVING
count(*) > 2;-- 分页查询
/**
语法:
SELECT 字段列表 FROM 表名 LIMINT 起始索引,查询条数
起始索引 = (当前页码 - 1)* 每页显示的条数
**/-- 分页查询练习,查询3条数据
SELECT
*
FROM
stu
LIMIT 0,
3;-- 分页查询练习,每页显示2条,查询第一页的数据
SELECT
*
FROM
stu
LIMIT 0,
2;-- 分页查询练习,每页显示2条,查询第二页的数据
SELECT
*
FROM
stu
LIMIT 2,
2;-- 分页查询练习,每页显示2条,查询第三页的数据
SELECT
*
FROM
stu
LIMIT 4,
2;
/***
多表查询
**/
DROP TABLE
IF
EXISTS emp;
DROP TABLE
IF
EXISTS dept;
# 创建部门表
CREATE TABLE dept ( did INT PRIMARY KEY AUTO_INCREMENT, dname VARCHAR ( 20 ) );
# 创建员工表
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR ( 10 ),
gender CHAR ( 1 ),-- 性别
salary DOUBLE,-- 工资
join_date DATE,-- 入职日期
dep_id INT,
FOREIGN KEY ( dep_id ) REFERENCES dept ( did ) -- 外键,关联部门表(部门表的主键)
);-- 添加部门数据
INSERT INTO dept ( dNAME )
VALUES
( '研发部' ),(
'市场部'
),(
'财务部'
),(
'销售部'
);-- 添加员工数据
INSERT INTO emp ( NAME, gender, salary, join_date, dep_id )
VALUES
( '孙悟空', '男', 7200, '2013-02-24', 1 ),
( '猪八戒', '男', 3600, '2010-12-02', 2 ),
( '唐僧', '男', 9000, '2008-08-08', 2 ),
( '白骨精', '女', 5000, '2015-10-07', 3 ),
( '蜘蛛精', '女', 4500, '2011-03-14', 1 ),
( '小白龙', '男', 2500, '2011-02-14', NULL );
-- 多表查询练习
select * from emp,dept where dept.did=emp.dep_id;
-- 多表查询之 内连接查询
/**
语法:
-- 隐式内连接
SELECT 字段列表 FROM 表1,表2.。。 WHERE 条件
-- 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON条件
**/
-- 隐式内连接
select * from dept,emp where dept.did=emp.dep_id;
select t1.NAME,t1.gender,t2.dname from dept t2,emp t1 where t2.did=t1.dep_id;
-- 显示内连接
select * from emp inner join dept on emp.dep_id = dept.did;
-- 多表查询之 外连接查询
/**
语法:
-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件
-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件
**/
-- 左外连接
select * from emp left join dept on emp.dep_id = dept.did;
-- 右外连接
select * from emp right join dept on emp.dep_id = dept.did;
-- 多表查询之 子查询
select * from emp where salary > (select salary from emp where name = '猪八戒');
> MySQL卸载:https://www.bilibili.com/video/BV1AG4y1B7sW/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=ebff660a6ef0a6cd2d5ffbfcf97a5312
> MySQL安装:https://www.bilibili.com/video/BV1Kr4y1i7ru?spm_id_from=333.788.videopod.episodes&vd_source=ebff660a6ef0a6cd2d5ffbfcf97a5312&p=3
# DDL
> 用来定义数据库对象:数据库、表、列等
## 1.1查询数据库
> show databases;
## 1.2创建数据库
> + 创建数据库
>
> > create database 数据库名称;
>
> + 创建数据库(判断,如果不存在就创建)
>
> > create database if not exists 数据库名称;
## 1.3删除数据库
> + 删除数据库
>
> > drop database 数据库名称;
>
> + 删除数据库(判断,如果存在就删除)
>
> > drop database if exists 数据库名称;
## 1.4使用数据库
> + 查看当前使用的数据库
>
> > select database();
>
> + 使用数据库
>
> > use 数据库名称;
## 2.1查询表结构
+ 查询当前数据库下所有表名称
> show tables;
+ 查询表结构
> desc 表名称;
## 2.2创建表
```sql
create table cesione(
id int,
name varchar(30),
password varchar(12)
);
# 注意:最后一行不能加逗号
修改表名
alter table 表名 rename to 新表名;
添加一列
alter table 表名 add 列名 数据类型;
修改数据类型
alter table 表名 modify 列名 数据类型;
修改列名和数据类型
alter table 表名 change 旧表名 新列名 新数据类型;
删除列
alter table 表名 drop 列名;
# 查询数据库 show databases;
SHOW DATABASES;
# 创建数据库 create database 数据库名称;
CREATE DATABASE de1;
# 创建数据库(判断,如果不存在就创建) create database if not exists 数据库名称;
CREATE DATABASE IF NOT EXISTS 数据库名称;
# 删除数据库 drop database 数据库名称
DROP DATABASE 数据库名称;
# 删除数据库,判断数据库是否存在,存在就删除
DROP DATABASE IF EXISTS del;
# 查看使用的数据库
SELECT DATABASE();
# 使用某个数据库
USE de1;
#查询当前使用数据库下所有表名称
SHOW TABLES;
# 查询表结构
DESC newCeSi_table;
DESC onetable;
# 创建表 注意:表字段最后一位不能加逗号
CREATE TABLE onetable (
id INT,
NAME VARCHAR ( 30 ),
PASSWORD VARCHAR ( 12 )
);
# 修改表名
alter table cesione rename to newCeSi_table;
# 添加一列
alter table onetable add likes varchar(30);
alter table onetable add chengji varchar(30);
# 修改数据类型
alter table onetable modify chengji int;
# 修改列名和数据类型
alter table onetable change PASSWORD password varchar(30);
# 删除某一列
alter table onetable drop chengji;
用来对数据库中的数据进行增删改
--查询所有数据
select * from onetable;
--给指定列提那就数据
insert into onetable(id,NAME) values(1,'清');
--给全部列添加数据
insert into onetable values(2,'嘿','131313');
--批量添加数据
insert into onetable values(3,'黑龙1','1111'),(3,'黑龙2','2222'),(3,'黑龙3','3333');
insert into onetanle(id,NAME,PASSWORD) values(4,'黑龙4','4444'),(5,'黑龙5','55555'),(6,'黑龙6','6666');
--修改数据
update onetable set PASSWORD='55555' where name='清'&&id=1;
--注意:update语句如果没有加where条件,则会将表中所有数据全部修改
--删除数据
delete from onetable where NAME="芳";
--注意:delete语句如果没有加where条件,则会将表中所有数据全部删除
用来查询数据库中表的数据
--基础查询==============
--例子:查询name,age两列
select name,age from stu;
--例子:查询所有字段
select * from stu;
-- 查询地址信息---这个是不去重的
select address from stu;
-- 查询地址信息---这个是去重的
select distinct address from stu;
--查询姓名,数学成绩,英语成绩----这个是不带别名
select name,math,english from stu;
--查询姓名,数学成绩,英语成绩----这个是带别名
select name as 姓名,math as 数学成绩,english as 英语成绩 from stu;
符合 | 功能 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
= | 等于 |
<>或!= | 不等于 |
between…and… | 在某个范围之内(都包含) |
in(…) | 多选一 |
link 占位符 | 模糊查询、单个任意字符 %多个任意字符 |
is null | 是 null |
is not null | 不是 null |
and 或 && | 并且 |
or 或 || | 或者 |
not 或 ! | 非,不是 |
-- 模糊查询 like =====================
/*
通配符:
(1)_:代表单个任意字符
(2)%:代表任意个数字符
*/
-- 1.查询年龄大于20岁的学员信息
select * from stu where age > 20;
-- 2.查询年龄大于等于20岁的学员信息
select * from stu where age >= 20;
-- 3.查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息
select * from stu where age >= 20 && age <= 30;
select * from stu where age >= 20 and age <= 30;
select * from stu where age BETWEEN 20 and 30;
-- 4.查询入学日期在'1998-09-01' 到 '1999-09-01' 之间的学员信息
select * from stu where hire_date BETWEEN '1998-09-01' and '1999-09-01';
-- 5. 查询年龄等于18岁的学员信息
select * from stu where age = 18;
-- 6. 查询年龄不等于18岁的学员信息
select * from stu where age != 18;
select * from stu where age <> 18;
-- 7. 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
select * from stu where age = 18 or age = 20 or age = 22;
select * from stu where age in (18,20 ,22);
-- 8. 查询英语成绩为 null的学员信息
-- 注意: null值的比较不能使用 = != 。需要使用 is is not
select * from stu where english = null; -- 不行的
select * from stu where english is null;
select * from stu where english is not null;
-- 模糊查询 like =====================
/*
通配符:
(1)_:代表单个任意字符
(2)%:代表任意个数字符
*/
-- 1. 查询姓'马'的学员信息
select * from stu where name like '马%';
-- 2. 查询第二个字是'花'的学员信息
select * from stu where name like '_花%';
-- 3. 查询名字中包含 '德' 的学员信息
select * from stu where name like '%德%';
/*
排序查询:
* 语法:SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;
* 排序方式:
* ASC:升序排列(默认值)
* DESC:降序排列
*/
-- 1.查询学生信息,按照年龄升序排列
select * from stu order by age ;
-- 2.查询学生信息,按照数学成绩降序排列
select * from stu order by math desc ;
-- 3.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
select * from stu order by math desc , english asc ;
函数名 | 功能 |
---|---|
count(列名) | 统计数量(一般选用不为null的列) |
max(列名) | 最大值 |
min(列名) | 最小值 |
sum(列名) | 求和 |
avg(列名) | 平均值 |
聚会函数语法:SELECT 聚合函数名(列名) FROM 表;
> 注意:null 值不参与所有聚合函数运算
上面语句根据某个字段进行统计,如果该字段某一行的值为null的话,将不会被统计。所以可以在count(*) 来实现。* 表示所有字段数据,一行中也不可能所有的数据都为null,所以建议使用 count(*)
select count(*) from stu;
查询数学成绩的最高分
select max(math) from stu;
查询数学成绩的最低分
select min(math) from stu;
查询数学成绩的总分
select sum(math) from stu;
查询数学成绩的平均分
select avg(math) from stu;
查询英语成绩的最低分
select min(english) from stu;
/*
分组函数
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]…;
*/
select * from stu ;
-- 1. 查询男同学和女同学各自的数学平均分
select sex, avg(math) from stu group by sex;
-- 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
select name, sex, avg(math) from stu group by sex;
-- 2. 查询男同学和女同学各自的数学平均分,以及各自人数
select sex, avg(math),count(*) from stu group by sex;
-- 3. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
select sex, avg(math),count(*) from stu where math > 70 group by sex;
-- 4. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的。
select sex, avg(math),count(*) from stu where math > 70 group by sex having count(*) > 2;
/*
分页查询:
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数
* 起始索引:从0开始
*/
select * from stu ;
-- 1. 从0开始查询,查询3条数据
select * from stu limit 0 , 3;
-- 2. 每页显示3条数据,查询第1页数据
select * from stu limit 0 , 3;
-- 3. 每页显示3条数据,查询第2页数据
select * from stu limit 3 , 3;
-- 4. 每页显示3条数据,查询第3页数据
select * from stu limit 6 , 3;
-- 起始索引 = (当前页码 - 1) * 每页显示的条数
--查询所有数据
select * from stu;
-- 创建stu表
CREATE TABLE stu (
id int, -- 编号
name varchar(20), -- 姓名
age int, -- 年龄
sex varchar(5), -- 性别
address varchar(100), -- 地址
math double(5,2), -- 数学成绩
english double(5,2), -- 英语成绩
hire_date date -- 入学时间
);
-- 添加数据
INSERT INTO stu(id,NAME,age,sex,address,math,english,hire_date)
VALUES
(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');
--基础查询==============
--例子:查询name,age两列
select name,age from stu;
--例子:查询所有字段
select * from stu;
-- 查询地址信息---这个是不去重的
select address from stu;
-- 查询地址信息---这个是去重的
select distinct address from stu;
--查询姓名,数学成绩,英语成绩----这个是不带别名
select name,math,english from stu;
--查询姓名,数学成绩,英语成绩----这个是带别名
select name as 姓名,math as 数学成绩,english as 英语成绩 from stu;
--条件查询==============
/**
语法:select 字段列表 from where 添加列表
*/
- 1.查询年龄大于20岁的学员信息
select * from stu where age > 20;
-- 2.查询年龄大于等于20岁的学员信息
select * from stu where age >= 20;
-- 3.查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息
select * from stu where age >= 20 && age <= 30;
select * from stu where age >= 20 and age <= 30;
select * from stu where age BETWEEN 20 and 30;
-- 4.查询入学日期在'1998-09-01' 到 '1999-09-01' 之间的学员信息
select * from stu where hire_date BETWEEN '1998-09-01' and '1999-09-01';
-- 5. 查询年龄等于18岁的学员信息
select * from stu where age = 18;
-- 6. 查询年龄不等于18岁的学员信息
select * from stu where age != 18;
select * from stu where age <> 18;
-- 7. 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
select * from stu where age = 18 or age = 20 or age = 22;
select * from stu where age in (18,20 ,22);
-- 8. 查询英语成绩为 null的学员信息
-- 注意: null值的比较不能使用 = != 。需要使用 is is not
select * from stu where english = null; -- 不行的
select * from stu where english is null;
select * from stu where english is not null;
-- 模糊查询 like =====================
/*
通配符:
(1)_:代表单个任意字符
(2)%:代表任意个数字符
*/
-- 1.查询年龄大于20岁的学员信息
select * from stu where age > 20;
-- 2.查询年龄大于等于20岁的学员信息
select * from stu where age >= 20;
-- 3.查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息
select * from stu where age >= 20 && age <= 30;
select * from stu where age >= 20 and age <= 30;
select * from stu where age BETWEEN 20 and 30;
-- 4.查询入学日期在'1998-09-01' 到 '1999-09-01' 之间的学员信息
select * from stu where hire_date BETWEEN '1998-09-01' and '1999-09-01';
-- 5. 查询年龄等于18岁的学员信息
select * from stu where age = 18;
-- 6. 查询年龄不等于18岁的学员信息
select * from stu where age != 18;
select * from stu where age <> 18;
-- 7. 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
select * from stu where age = 18 or age = 20 or age = 22;
select * from stu where age in (18,20 ,22);
-- 8. 查询英语成绩为 null的学员信息
-- 注意: null值的比较不能使用 = != 。需要使用 is is not
select * from stu where english = null; -- 不行的
select * from stu where english is null;
select * from stu where english is not null;
-- 模糊查询 like =====================
/*
通配符:
(1)_:代表单个任意字符
(2)%:代表任意个数字符
*/
-- 1. 查询姓'马'的学员信息
select * from stu where name like '马%';
-- 2. 查询第二个字是'花'的学员信息
select * from stu where name like '_花%';
-- 3. 查询名字中包含 '德' 的学员信息
select * from stu where name like '%德%';
/*
排序查询:
* 语法:SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;
* 排序方式:
* ASC:升序排列(默认值)
* DESC:降序排列
*/
-- 1.查询学生信息,按照年龄升序排列
select * from stu order by age ;
-- 2.查询学生信息,按照数学成绩降序排列
select * from stu order by math desc ;
-- 3.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
select * from stu order by math desc , english asc ;
--聚合函数
/**
| 函数名 | 功能 |
| ----------- | -------------------------------- |
| count(列名) | 统计数量(一般选用不为null的列) |
| max(列名) | 最大值 |
| min(列名) | 最小值 |
| sum(列名) | 求和 |
| avg(列名) | 平均值 |
*/
-- 查询当前表有多少数据
select count(*) from stu;
-- 查询数学成绩的最高分
select max(math) from stu;
/*
分组函数
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]…;
*/
select * from stu ;
-- 1. 查询男同学和女同学各自的数学平均分
select sex, avg(math) from stu group by sex;
-- 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
select name, sex, avg(math) from stu group by sex;
-- 2. 查询男同学和女同学各自的数学平均分,以及各自人数
select sex, avg(math),count(*) from stu group by sex;
-- 3. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
select sex, avg(math),count(*) from stu where math > 70 group by sex;
-- 4. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的。
select sex, avg(math),count(*) from stu where math > 70 group by sex having count(*) > 2;
/*
分页查询:
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数
* 起始索引:从0开始
*/
select * from stu ;
-- 1. 从0开始查询,查询3条数据
select * from stu limit 0 , 3;
-- 2. 每页显示3条数据,查询第1页数据
select * from stu limit 0 , 3;
-- 3. 每页显示3条数据,查询第2页数据
select * from stu limit 3 , 3;
-- 4. 每页显示3条数据,查询第3页数据
select * from stu limit 6 , 3;
-- 起始索引 = (当前页码 - 1) * 每页显示的条数
用来定义数据库的访问权限和安全基本,及创建用户
约束名称 | 描述 | 关键字 |
---|---|---|
非空约束 | 保证列中所有数据不能有null值 | not null |
唯一约束 | 保证列中所有数据各不相同 | unique |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | primary yek |
检查约束 | 保证列中的值满足某一条件 | check |
默认约束 | 保存数据时,未指定值则采用默认值 | default |
外键约束 | 外键用来让两个表的数据之间建立连接,保证数据的一致性和完整性 | poreign key |
CREATE TABLE emp(
id INT PRIMARY KEY, -- 员工id,主键且自增长
ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
joindate DATE NOT NULL, -- 入职日期,非空
salary DOUBLE(7,2) NOT NULL, -- 工资,非空
bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金就默认为0
);
INSERT INTO emp(id,ename,joindate,salary,bonus)values(1,'张三','1999-11-11',8000,5000);
-- 演示主键约束:非空且唯一
INSERT INTO emp(id,ename,joindate,salary,bonus)values(null,'张三','1999-11-11',8000,5000);
INSERT INTO emp(id,ename,joindate,salary,bonus)values(1,'张三','1999-11-11',8000,5000);
-- 演示非空约束
INSERT INTO emp(id,ename,joindate,salary,bonus)values(2,null,'1999-11-11',8000,5000);
-- 演示唯一约束
INSERT INTO emp(id,ename,joindate,salary,bonus)values(2,'张三','1999-11-11',8000,5000);
SELECT * from emp;
show tables;