1.C create创建
*创建数据库
craete database 数据库名称;
craete database if not exists 数据库名称; //判断是否存在
craete database 数据库名称 character set gbk; //创建数据库并指定字符集
*创建一个数据库 判断是否存在并指定字符集
create database if not exists 数据库名称 character set gbk;
2.R Retrieve 查询
*查询所有数据库的名称
show databases;
*查看某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称;
3.U Update 修改
*修改数据库的字符集
alter database 数据库名称 character set utf8;
4.D Delete 删除
*删除数据库
drop database 数据库名称;
*判断数据库是否存在并进行删除
drop database if not exists 数据库名称;
5.使用数据库
*查询当前正在使用的数据库
select database();
*使用数据库
use 数据库名称;
1.语法:group by 分组字段;
2.注意:
1.分组之后查询的字段:分组字段
-- 按照性别分组 分别查询男同学女同学的平均分
SELECT sex,SUM(math),COUNT(NAME),AVG(math)
FROM student
GROUP BY sex
2.where和having 的区别?
1.where在分组之前进行限定,如果不满足条件,则不参与分组。having 在分组之后进行限定,如果不满足结果则不会被查询出来
2.where 后不能跟聚合函数 having后可以跟集合函数
4.分页查询
1.语法
limit 开始的索引,每页的条数
2.-- 公式:开始的索引 = (当前的页码-1)*每页显示的条数
-- 每页显示3条
SELECT *
FROM student
LIMIT 0,3
SELECT *
FROM student
LIMIT 3,3
SELECT *
FROM student
LIMIT 6,3
3.分页操作limit是mysql方言
1.在创建表时添加约束
CREATE TABLE stus(
id INT,
NAME VARCHAR(20) NOT NULL -- name 为非空
)
2.创建完成后,添加非空约束
ALTER TABLE stus MODIFY NAME VARCHAR(20) NOT NULL
3.删除表的约束
ALTER TABLE stus MODIFY NAME VARCHAR(20)
*唯一约束 unique ,某一列不能有重复值
1.注意:
*唯一约束可以有null值,但是只能有一条记录为null
2-- 在创建表时添加约束
CREATE TABLE stus(
id INT,
phont VARCHAR(20) UNIQUE -- 手机号
)
3.-- 删除唯一约束
ALTER TABLE stus DROP INDEX phont
4.创建完成后,添加非空约束
ALTER TABLE stus MODIFY phont VARCHAR(20)
*主键约束:primary key
1.注意:
1.含义:非空且唯一
2.一张表只能有一个字段为主键
3.主键是表中记录的唯一标识
2.在创建时添加主键
CREATE TABLE stus(
id INT PRIMARY KEY, -- 添加主键
NAME VARCHAR(20)
)
3.-- 删除主键
ALTER TABLE stus DROP PRIMARY KEY
4.-- 创建完表之后添加主键
ALTER TABLE stus MODIFY id INT PRIMARY KEY
5.自动增长
*概念:如果某一列是数值类型的,使用 auto_increment 可以完成值的自动增长
1.创建表时添加自动增长
CREATE TABLE stus(
id INT PRIMARY KEY AUTO_INCREMENT, -- 添加主键
NAME VARCHAR(20)
)
2.-- 添加自动增长
ALTER TABLE stus MODIFY id INT AUTO_INCREMENT
3.-- 删除自动增长
ALTER TABLE stus MODIFY id INT
*外键约束 foreign key,让表与表之间产生关系,从而保证数据的正确性
1.在创建表时添加外键
*语法
creat table 表名(
....
外键列
constraint 外键名称 foreign key 外键列名称 reference 主表名称(主表列名称)
)
2.删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk
3.在创建表之后添加外键
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id)
4.级联操作
-- 在表创建之后 添加外键 设置级联的更新 设置级联删除
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE --级联更新
ON DELETE CASCADE --级联删除
1.隐式内连接
-- 查询员工表的名称,性别,部门表的名称
SELECT emp.`NAME`,emp.`gender`,dept.`NAME`
FROM dept,emp
WHERE emp.`dept_id` = dept.`id`
SELECT
t1.name, -- 员工表的名称
t1.gender,-- 员工表的性别
t2.name -- 部门表的名称
FROM
emp t1,dept t2
WHERE
t1.dept_id = t2.id
2.显式内连接
*语法:
select 字段列表
from 表名 inner join 表名 ON 条件
SELECT *
FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`
3.内连接查询:
1.从哪些表中查询数据
2.条件是什么
3.查询哪些字段
4.查询的两个表的交集部分
2.外连接查询
1.左外连接
* 语法:
select 字段列表 from 表1 left join 表2 ON 条件;
*查询的是左表的所有数据及其交集
2.右外连接
* 语法:
select 字段列表 from 表1 right join 表2 ON 条件;
*查询的是右表的所有数据及其交集
3.子查询
*概念:
查询中嵌套查询,称子查询
-- 查询工资最高的员工信息
-- 查询最高的工资
SELECT MAX(salary)
FROM emp
-- 查询员工信息
SELECT *
FROM emp
WHERE emp.`salary` = 9000
-- 一条语句查询
SELECT *
FROM emp
WHERE emp.`salary` = (SELECT MAX(salary)FROM emp)
*子查询的不同情况
1.子查询的结果是单行单列的
*子查询可以作为条件,使用运算符去判断 运算符>< >= <=
-- 查询员工工资小于平均工资的人
SELECT *
FROM emp WHERE emp.`salary`<(
SELECT AVG(salary)
FROM emp
)
2.子查询的结果是多行单列的
-- 查询财务部和开发部所有的员工信息
SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '开发部'
SELECT *
FROM emp
WHERE emp.`dept_id` IN (2,3)
-- 子查询
SELECT *
FROM emp
WHERE emp.`dept_id` IN (
SELECT id
FROM dept
WHERE NAME = '财务部' OR NAME = '开发部'
)
3.子查询的结果是多行多列的
-- 查询员工的入职日期是2011-11-11日之后的员工信息和部门信息
SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.`join_date`>'2011-11-11') t2
WHERE t1.id = t2.dept_id