入门SQL语句
数据的增删改查(CRUD)
C: create 增加
R: Retrieve 获取/查询
U:Update 更新
D:Delete 删除
注释方式:
注释语法说明
-- 空格单行注释
/* */多行注释
#单行注释
DDL语句(Data Definition Language 数据定义语言)
作用:创建数据库、创建表、修改表结构
DDL操作数据库:
*创建指定的数据库:
CREATE DATABASE 数据库名;
*指定数据库名或指定数据库字集一般都指定为utf8:
CREATE DATABASE db1_1 CHARACTER SET utf8;
*切换数据库:
USE 数据库名;
*查看当前正在使用的数据库:
SELECT DATABASE 数据库名;
*查看Mysql中都有哪些数据库:
SHOW DATABASES;
*查看一个数据库的定义信息:
SHOW CREATE DATABASE 数据库名;
*将数据库db1 的字符集 修改为 utf8:
ALTER DATABASE db1 CHARACTER SET unf8;
*从MySql中永久的删除某个数据库:
DROP DATABASE 数据库名;
DDL操作数据表:
INT整型、DOUBLE浮点型、VACHAR字符串型、DATA日期型
*创建表:
CREATETABLE
category(
cid INT,
caname VARCHA(20)
);
*创建一个表结构相同的表(复制表结构)
CREATE TABLE 新表名LIKE旧表名;
*查看表结构
DESC 表名;
*查看当前数据库中的所有表名:
SHOW TABLES;
*查看创建表的SQL语句:
SHOW CREATE TABLE CATEGORY;
*删除表:(从数据库中永久删除一张表)
DROP TABLE 表名;
*判断表是否存在, 存在的话就删除,不存在就不执行删除
DROP TABLE IF EXISTS 表名;
*修改表名:
RENAME TABLE 旧表名TO 新表名;
*向表中添加列(ADD):
ALTER TABLE 表名ADD 字段名称 字段类型;
*修改表中列的数据类型或长度(MODIFY)
ALTER TABLE 表名MODIFY 字段名称 字段类型;
*修改列名称(CHANGE):
ALTER TABLE 表名CHANGE 旧列名 新列名 类型(长度);
*删除列(DROP):
ALTER TABLE 表名DROP 列名;
DML语句(Data
Manipulation Language 数据操纵语言)
针对table数据表中数据的增删改,使用DML
*插入数据:
INSERT
INTO 表名(字段1,字段2)
VALUES(字段值1,字段值2);
例:表名student
表中字段:
学员ID, sid int
姓名,sname varchar(20)
年龄,age int
性别,sex char(1)
地址,address varchar(40)
-----第一步:创建表
CREATETABLE
student(
sid INT,
snameVARCHAR(20),
age INT,
sexCHAR(1),
address VARCHAR(40)
);
-----第二步插入数据方式一:插入全部字段,将所有字段名写出
INSERT
INTO student(sid,sname,age,sex,address)VALUES
(1,‘赵一’,20,‘女’,‘花果山’);
-----方式二:插入全部字段,不写字段名
INSERT
INTO student VALUES (2,‘张三’,21,‘男’,‘宇宙’);
-----方式三:插入指定字段的值
INSRET
INTO CATEGORY (sname) VALUES (‘王五’);
*修改数据
UPDATE
student set address‘成都’where sname‘王五’------把sname王五那行数据的address列改成成都;
UPDATE
student set address=‘成都’;------把student表中的地址全改成北京
也可以同时改两列:UPDATE
student set address=‘成都’,sex=‘女‘;
*删除数据:
Delete
from 表名(删除所有数据)
Delete
from 表名where sid=1;(删除指定数据)
Truncate table 表名(推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高,当一个表中条数非常多,又要做删除动作的时候,如果用delete会很慢,那我们可以使用truncate)
*(Data Query Language 数据查询语言)
针对table数据表中数据的查询操作,使用DQL
简单查询:
*查询表中的所有数据
Select from 表名;
*查询部分字段
Select ename,salaryfrom emp;
*查询一共有几个部门(DISTINCT)
Select DISTINCTdept_name FROM emp;
*将所有员工的工资 +1000 元进行显示
Selectename,salary+1000 from emp;
条件查询:
* select 列名from 表名where 条件表达式
比较运算符
运算符
说明
> < <= >= = <> !=大于、小于、小于(大于)等于、等于、不等于
BETWEEN ...AND...
显示在某一区间的值
例如: 2000-10000之间: Between 2000 and 10000
IN(集合)
集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒)
in中的每个数据都会作为一次条件,只要满足条件就会显示
LIKE '%张%'模糊查询
IS NULL查询某一列为NULL的值, 注: 不能写 = NULL
条件运算符
运算符
说明
And &&多个条件同时成立
Or ||多个条件任一成立
Not不成立,取反。
*查询员工姓名为黄蓉的员工信息
Select * from emp
where ename=‘黄蓉’;
*查询薪水价格为5000的员工信息
select * from empwhere salary=5000;
*查询薪水价格不是5000的所有员工信息
select * from empwhere salary!=5000;
*查询薪水价格大于6000元的所有员工信息
Select * from empwhere salary>6000;
*查询薪水价格在5000到10000之间所有员工信息
Select *from empwhere salary between 5000 and 6000;
*查询薪水价格是3600或7200或者20000的所有员工信息
Select * from empwhere salary=3600 or salary=7200 or salary=20000;
Select * from empwhere salary in(3600,7200,20000);
*查询含有'精'字的所有员工信息(模糊)
Select * from emp
where ename like '%精%';
*查询以'孙'开头的所有员工信息
Select * from emp
where ename like '%孙';
*查询第二个字为'兔'的所有员工信息(要表示第一个字符 用下划线)
Select * from emp
where ename like '_兔%';
*查询没有部门的员工信息
Select * from empwhere dept_name is NULL;
*查询有部门的员工信息
Select * from empwhere dept_name is not null;
第二部分MySQL核心查询
单列排序:通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据)
语法结构:SELECT 字段名 FROM表名 [WHERE 字段 = 值]ORDER BY 字段名 [ASC / DESC]
*使用 salary 字段,对emp 表数据进行排序 (升序/降序)
Select * from emp order by salary; (默认升序)
Select * from emp order by salary desc;
组合排序:同时对多个字段进行排序, 如果第一个字段相同 就按照第二个字段进行排序,以此类推
*在薪水排序的基础上,再使用id进行排序, 如果薪水相同就以id 做降序排序
SELECT * FROM emp ORDER BY salary DESC, eid DESC;
聚合函数:求员工最高工资/平均工资/工资总和,都是聚合函数来做的
语法结构: SELECT 聚合函数(字段名) FROM 表名;
聚合函数
作用
count(字段)统计指定列不为NULL的记录行数
sum(字段)计算指定列的数值和
max(字段)计算指定列的最大值
min(字段)计算指定列的最小值
avg(字段)计算指定列的平均值
*查询员工的总数
Select count(*)from emp; (*也可以用1代替,也可以用字段)
注:count会忽略计算空值
*查看员工总薪水
Select sum(salary)
from emp; 可以单独求
Select sum(salary)‘薪水总和’,max(salary)’最高薪水’,min(salary)‘最低薪水’,avg(salary)‘平均薪水’from emp; 也可以整体一起求
*查询薪水大于4000员工的个数
Select count(*)from emp where salary>4000;
*查询部门为教学部的所有员工的个数
Select count(*)
from emp where dept_name=’教学部’;
*查询部门为市场部的所有员工的平均薪水
Select avg(salary)
from emp where dept_name=’市场部’;
分组:
分组往往和聚合函数一起时候,对数据进行分组,分完组之后在各个组内进行聚合统计分析
比如:求各个部门的员工数
指的是使用 GROUP
BY 语句,对查询的信息进行分组,相同数据作为一组,
语法格式:
Select 分组字段/聚合函数 from 表名group by 分组字段[having条件];
Having是针对条件的过滤
*通过性别字段进行分组,求各组的平均薪资
Select sex,avg(salary)from emp group by sex;
注:1)group by的字段必须出现在select的位置
2)前面select的位置除了出现group by的字段、聚合函数,不能出现其他字段
*查询每个部门的平均薪资
Select dept_name ,avg(salary) from emp groupby dept_name;
*查询每个部门的平均薪资,部门名称不能为null
Select dept_name ,avg(salary)
from emp where dept_name is not null group by dept_name
*查询平均薪资大于6000的部门
Select dept_name ,avg(salary) from emp where dept_name is not nullgroup by dept_name having avg(salary)>6000;
[endif]
Where 与having 的区别:
Where:进行分组前的条件过滤;where后面不能写聚合函数
Having:对分组后的数据进行过滤;having后面可以写聚合函数
[if !mso]
[endif]分析:
[if !supportLists]1) [endif]
[endif]
having
[if !mso]
[endif]需要在分组后,对数据进行过滤,使用 关键字
[if !supportLists]2) [endif]分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
Limit关键字查询:
lmit是限制的意思,用于 限制返回的查询结果的行数 (可以通过limit指定查询多少行数据)
SELECT 字段1,字段2... FROM 表名LIMIT offset , length;
offset 起始行数, 从0开始记数, 如果省略 则默认为 0
length 返回的行数
SELECT * FROM emp LIMIT 1,3;
起始页测偏移量怎么计算:
(当前页-1)*每页条数
SQL约束
用SQL语句来创建数据库约束
1)约束的作用:
对表中的数据进行进一步的限制,从而保证数据的正确性、有效性、完整性. 违反约束的不正确数据,将无法插入到表中
注意:约束是针对字段的
2)常见约束
约束名
约束关键字
主键primary key
唯一unique
非空not null
外键foreign key
主键的作用:用来表示数据库中的每一条记录(用来唯一标识数据表中的一条记录)
语法格式:字段名 字段类型primary key
创建表时可以加在前面 也可以在后面添加
给已经存在的数据表添加主键约束
Alter table emp addprimary key(eid);
删除主键
Alter table emp dropprimary key(eid);
主键自增
*创建表时指定主键,同时指定主键自增
Create table 表名(
eid intprimary key auto_increment,
DELETE和TRUNCATE对自增长的影响
清空表数据的方式
特点
DELETE只是删除表中所有数据,对自增没有影响
TRUNCATE
truncate 是将整个表删除掉,然后创建一个新的表自增的主键,重新从 1开始
非空约束
语法结构:字段名 字段类型 not null
*为 ename 字段添加非空约束
CREATE TABLE emp2(
eid INT PRIMARY
KEY AUTO_INCREMENT,
ename VARCHAR(20) NOTNULL,
sex CHAR(1)
);
但凡插入enamel为NULL的数据时会报错
唯一约束
唯一约束的特点: 表中的某一列的值不能重复( 对null不做唯一的判断 )
语法结构:字段名 字段类型 unique
*添加唯一约束
ename VARCHAR(20)unique,
插入相同数据时会提示不能重复
主键约束与唯一约束的区别:
1. 主键约束 唯一且不能够为空(主键约束=非空约束+唯一约束)
2. 唯一约束,唯一 但是可以为空
3. 一个表中只能有一个主键 , 但是可以有多个唯一约束
默认值约束
语法结构:字段名 字段类型 DEFAULT 默认值
*创建emp4表, 性别字段默认女
CREATE TABLE emp4(
eid INT PRIMARY
KEY AUTO_INCREMENT,
ename VARCHAR(20) DEFAULT ‘女', sex CHAR(1)
);
多表查询
外键约束
主键:数据表A中有一列,这一列可以唯一的标识一条记录
外键:数据表A中有一列,这一列指向了另外一张数据表B的主键
什么是外键:
是在从表中与主表的主键对应的那个字段,比如员工表的 dept_id,就是外键
外键约束可以让两张表之间产生一个对应关系,从而保证主从表的引用的完整性
多表关系中的主表和从表
主表: 主键id所在的表,约束别人的表从表: 外键所在的表多, 被约束的表
外键所在的表叫做从表,外键所指向的表叫做主表
创建外键约束
语法格式:
*新建表时添加外键
[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
*已有表添加外键
ALTER TABLE 从表 ADD
[CONSTRAINT] [外键约束名称]
FOREIGN KEY (外键字段名)
REFERENCES 主表(主 键字段名);
*重新创建employee表, 添加外键约束
CREATETABLE employee(
eid INT PRIMARYKEY AUTO_INCREMENT, ename VARCHAR(20),
age INT,
dept_id INT, -- 外键字段类型要和主表的主键字段类型保持一致
-- 添加外键约束
CONSTRAINT emp_dept_fkFOREIGN KEY(dept_id) REFERENCES department(id)
);
从表外键 对应主表主键 有值就能插入,主键无值就无法插入对应数据
删除外键约束:
语法格式
alter table 从表 drop foreign key 外键约束名称
*删除从表中的外键约束
Alter table employee dropforeign key emp_dep_fk;
Alter table employee
add foreign key (dept_id) reference department(id);
外键约束的注意事项:
[if !supportLists]1) [endif]从表外键类型必须与主表主键类型一致 否则创建失败.
[if !supportLists]2) [endif]添加数据时,应该先添加主表中的数据.