【自用复习笔记】SQL基础语法总结

DDL 操作数据库和表

C(create):创建

创建数据仓库:create database 名称;
创建仓库,当不存在时才执行 :create database if not exists 名称;

练习:
1.编写SQL ,在数据库"heiheihei" 不存在时创建它
create database if not exists heiheihei;
2.创建指定名称的数据仓库及编码格式: 
create database 名称 character set 编码表;
*这里的编码表不可以是UTF-8 
create database heihei2 character set gbk;

R(retrieve): 查询

查询已有的数据库:show database;
查询某个库的创建语句: show create database 数据库名称;

练习:写出SQL,查询库名为db01的创建语句
SHOW DATABASES;
SHOW CREATE DATABASE db01;

U(update):修改

修改数据库编码:alter database 数据库名称 character set 字符集名称;

练习:修改heihei2库的编码为 utf8mb4(UTF-8)
alter database heihei2 character set utf8mb4;
	ALTER DATABASE heihei2 CHARACTER SET utf8mb4;

D(delete):删除

删除数据库:drop database 数据库名称
当数据库存在时,删除它:drop database if exists 数据库名称;

练习:删除乱七八糟的库
drop database if exists heihei2;
DROP DATABASE IF EXISTS db01;

数据库的使用

选择数据库: use 数据库名称;
查看当前选择的数据库: select database();

USE db1;
SELECT DATABASE();

DQL 数据查询语言

完整语法

select 字段列表(多个字段名之间用,隔开) from 表名 where(条件) 条件列表 group by 分组字段 having 分组条件 order by 排序字段 排序方式 limit 分页限定

基础语法1 查询单个表格的单个字段数据

语法: select 字段名称 from 表名;

练习:查询员工表格(emp)的员工职位(job)信息:
select job from emp;	
去除重复: 在查询语句字段列表的前面添加关键字 distinct
SELECT job FROM emp;
SELECT DISTINCT job FROM emp;

基础语法2 查询单个表格的多个字段数据

语法:select 字段1,字段2… from 表名;

练习:查询员工表格(emp)的员工姓名(ename)、职位(job)、月薪(sal)信息:
SELECT ename,job,sal FROM emp;

基础语法3 查询单个表格的所有字段信息

语法: select *from 表名;

练习:查询emp表格中的所有字段数据
SELECT * FROM emp;

基础语法4 查询列数据的运算

语法格式: 对于查询预计的字段名称可以直接使用四则运算计算
如:
计算emp表格中的员工日薪,要求显示姓名和日薪

SELECT ename,sal/21.75 FROM emp;

– 计算emp表格中的员工年薪(16薪),显示姓名和年薪

SELECT ename,sal*16 FROM emp;

– 计算emp表格中的员工年薪(16个月的月薪sal+12个月的提成comm),显示姓名和年薪

SELECT ename,sal*16+comm*12 FROM emp;

出现问题,原因:null参与任何运算,结果都是null
解决方法: 可以使用替换的方式将null替换为指定值
语法: ifnull(参数1,参数2):如果参数1为null,使用参数2替换,如果参数1不为null就用参数1

SELECT ename,sal*16+IFNULL(comm,0)*12 FROM emp;

给查询的字段或表名起别名

语法:在字段名 或 表格名的后面 加上 空格 别名即可
SELECT ename,sal*16+IFNULL(comm,0)*12 y_sal,job FROM emp;

条件查询

语法:

select 字段列表 from 表名 where 条件;
比较运算符:> <  =  >= <=   注意 不等于:<> != 等于=
条件链接符:and(&&)、or(||)、not(!) 

例如:1.查询薪资大于1000的员工所有信息
2.查询部门编号deptno 等于10的员工所有信息
3.查询员工薪资在1200(含)-2500(含)之间的员工信息(可以使用between…and简写)
4.查询员工薪资等于800、1250、3000的员工信息(可以使用in简写)

SELECT * FROM emp WHERE sal>1000;
SELECT * FROM emp WHERE deptno =10;
-- 3.
SELECT * FROM emp WHERE sal>=1200 AND sal<=2500;
-- 3.简写
SELECT * FROM emp WHERE sal BETWEEN 1200 AND 2500;
-- 4.
SELECT * FROM emp WHERE sal=800 OR sal=1250 ||sal=3000;
-- 4.简写
SELECT * FROM emp WHERE sal IN (800,1250,3000);

对于null的查询

需要通过is null 或 is not null 完成
练习:查询提成comm等于null的员工信息

SELECT * FROM emp WHERE comm IS NULL;
SELECT * FROM emp WHERE comm IS NOT NULL;

模糊查询 查询关键字

语法: 字段名 like 占位符;
占位符: _任意一个字符 ;% 0-n个字符
例如:
1.查询员工的姓名中包含克字的员工信息
2.查询员工姓名中以斯结尾的

SELECT * FROM emp WHERE ename LIKE "%克%";
SELECT * FROM emp WHERE ename LIKE "%斯";

排序查询 :对查询的结果按照某列的顺序排列(升序或者降序)

单字段排序:

语法:select 字段列表 from 表名 order by 排序字段 排序方式;

排序方式:默认升序,可以不写(ASC)  ;  降序 DESC

练习:查询员工信息,按照薪资sal倒叙排列

SELECT * FROM emp ORDER BY sal DESC;

排序查询 :多字段

语法:select 字段列表 from 表名 order by 排序字段1 排序方式,排序字段2 排序方式;
练习:查询员工信息,按照薪资sal倒叙排列,薪资相同按照提成倒叙;

SELECT * FROM emp ORDER BY sal DESC, comm DESC;

聚合函数:

将一列所有数据作为一个整体进行运算,并得到一个结果

统计个数:count(列名)
统计最大值: max(列名)
统计最小值: min(列名)
求和:sum(列名)
求平均值:avg(列名)

例子:1.查询员工总数
2.计算评价薪资(sal)

SELECT COUNT(ename) FROM emp;
SELECT AVG(sal) FROM emp;

注意:

  • 聚合函数不支持 SELECT ename,AVG(sal) FROM emp; 不能与其它普通列同时查询
  • 聚合函数统计null值会忽略
SELECT COUNT(comm) FROM emp;

分组查询

不带条件语法:select 字段列表 from 表名 group by 分组字段;
带条件语法: 上面的语法 having 分组条件;

案例:统计员工每个部门的员工数量
注意:
分组查询 只能查询分组字段或聚合函数的结果

SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;

练习:统计员工每个部门的平均薪资

SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;

where 和 having区别:

where在分组前判断,没满足的不会参与分组;
having 在分组后判断,不满足having条件的不显示

例子: 计算每个部门的员工数量,条件是:只统计薪资大于1500的员工
*/

SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;

分组条件:例子+满足条件的组员小于三个的不显示

SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno HAVING COUNT(*)>=3;

练习:查询每个部门的平均薪资,条件是:平均薪资低于2000的不显示;

SELECT deptno,AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal)>=2000;

分页查询 (是方言)

语法:select 字段列表 from 表名 limit 开始的索引,每页查询行数;
常见计算开始索引的公式:(页码-1)*每页显示的条数
练习:查询emp表,要求分页查询,每页4名员工;写出前三页

SELECT * FROM emp LIMIT 0,4;
SELECT * FROM emp LIMIT 4,4;
SELECT * FROM emp LIMIT 8,4;

DDL 数据定义语句

C(create):创建

创建格式

create table 表名(
				列名1 数据类型,
				列名2 数据类型,
				...
				列名n 数据类型
				);

常用数据类型:

  1. int(长度) 整形数形,默认长11位
    例:age int (3),

  2. double(长度,小数点后位数) 浮点值属性
    例:定义一个小数点后2位,小数点前3位的数
    x double(5,2)

  3. date 日期,显示格式 “yyyy-MM-dd”
    例: “2022-04-18”

  4. datetime 日期时间,显示格式 “yyyy-MM-dd HH:mm:ss”
    例: “2022-04-18 14:06:00”

  5. timestamp 时间戳 13位数字,从1970年1月1日开始
    例: “2022-04-18 14:06:00”

  6. varchar(长度) 变长字符串 更常用
    例: name varchar(20)

  7. char(长度) 定长字符串
    例: name char(20)

案例:创建学生表,包含:学号id,姓名name,成绩score,入学日期indate

*/
CREATE TABLE student(
	id INT(10),
	NAME VARCHAR(32),
	score DOUBLE (5,2),
	indate DATE
);

回顾:查询入职日期大于等于1987年1月1日的员工(emp)

SELECT * FROM emp WHERE HIREDATE >= "1987-1-1";

练习:创建图书表book,包含图书编号id,图书名称name,图书简介

desecription
CREATE TABLE book(
	id INT(10),
	NAME VARCHAR(128),
	dercription VARCHAR(1024)
);

R(retrieve)查询

查询某个数据库中所有的表名称;
show tables;
查询表结构
desc 表名;

SHOW TABLES;
DESC book;

U(update)修改

1.修改表名: alter table 表名 rename to 新表名;
2.修改表字符编码表: alter table 表名 character set 字符集名称;
3.修改表结构:添加一列: alter table 表名 add 列名 数据类型;
4.修改表结构:删除一列: alter table 表名 drop 列名;
5.修改表结构:修改一列: alter table表名 change 原列名 新列名 数据类型;
alter table表名 modify 原列名 数据类型;

练习:修改book为book2
ALTER TABLE book RENAME TO book2;
练习:修改book2字符名称
ALTER TABLE book2 CHARACTER SET gbk;
练习:book2 添加一列 haha vaechar(32)
ALTER TABLE book2 ADD haha VARCHAR(32);
DESC book2;
练习:删掉haha
ALTER TABLE book2 DROP haha;
把name 改掉
ALTER TABLE book2 CHANGE NAME name2 INT;
ALTER TABLE book2 MODIFY name2  VARCHAR(32);

D (delete)删除

删除某表: drop table 表名;
当表存在时,删除某表:drop table if exists 表名;

DROP TABLE IF EXISTS book2;

字段默认值设置

1.创建表格时,设置默认值;

create table 表名(
			列名1 数据类型 default 默认值,
			列名1 数据类型 default 默认值,
			...
			列名n 数据类型 default 默认值
		);

2.修改字段信息时,设置字段默认值
添加列:alter table 表名 add 列名 数据类型 default 默认值;
修改列:alter table表名 change 原列名 新列名 数据类型 default 默认值;
alter table表名 modify 原列名 数据类型 default 默认值;

练习:创建person表,包含字段:id,name,age,sex ;
默认值:id 0;name 韩梅梅; age 18 ;sex无默认值
CREATE TABLE person(
	id INT(11) DEFAULT 0,
	NAME VARCHAR(32) DEFAULT "韩梅梅",
	age INT DEFAULT 18,
	sex VARCHAR(32)
);
DESC person;

DML 数据操作语句(重点)

添加数据

语法:
insert into 表名 (列名1,列名2…列名n) values (值1,值2…值n);
向所有列添加:insert into 表名 values (值1,值2…值n);

-- 练习:向person中插入:id=1,张三,19,男
INSERT INTO person VALUES(1,"张三",19,"男");
INSERT INTO person (id,NAME,age,sex) VALUES(1,"张三",19,"男");
SELECT * FROM person;

删除数据

语法:delete from 表名 where 条件;

练习:删除年龄小于20的所有person数据
DELETE FROM person WHERE age<20;

注意:

  • 不添加where条件就是删除所有数据;
  • 删除所有数据建议使用: truncate table 表名 ; 此方法是删除表格再创建新表,比较高效

修改数据

语法: update 表名 set 列名1=值1,列名2=值2,… 列名n= 值n where 条件;

练习:修改id为1的person数据,修改name=李四,age=16
UPDATE person SET NAME="李四",age =16 WHERE id=1;

注意:

  • 不加where条件就是修改所有数据

多表查询

内连接查询

隐式内连接

语法 select 列名列表 from 表名列表 where…

SELECT * FROM emp,dept;

上述语法会产生笛卡尔积,产生56行数据,实际查询部门编号和员工匹配要加限制条件

SELECT * FROM emp,dept WHERE emp.deptno = dept.deptno;

显式内连接

语法
select 字段列表 from 表名1 inner join 表名2 on 条件

SELECT * FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;

外连接查询

语法
左外连接:基表在左边,从表(参考表)在右边
select 字段列表 from 基表表名 left outer join 参考表名 on 条件;
右外连接:基表在右边
select 字段列表 from 参考表名 right outer join 基表表名 on 条件;

SELECT * FROM dept LEFT OUTER JOIN emp ON emp.deptno = dept.deptno;
SELECT * FROM emp RIGHT OUTER JOIN dept ON emp.deptno = dept.deptno;

注意:表的顺序

子查询

子查询:在一条查询语句中嵌套另一个查询语句
1.子查询结果单行单列:可以应用于查询条件(例子1)
2.子查询结果多行单列:可以使用in 应用于查询条件(例子2)
3.子查询结果多行多列:可以将查询结果当作一个虚拟报表进行查询(例子3)

例子1:

查询emp表格中的最小sal 
查询薪资最小的人
SELECT MIN(sal) FROM emp ;
SELECT * FROM emp WHERE sal=800;
-- 使用子查询:
SELECT * FROM emp WHERE sal =(SELECT MIN(sal) FROM emp);

例子2

查询dept表的部门编号字段deptno,找到部门名称dname=会计 或销售 的编号
根据会计或销售部门编号,查询员工信息
SELECT deptno FROM dept WHERE dname="会计" OR dname = "销售";
SELECT * FROM emp WHERE deptno IN(10,30);
-- 使用子查询
SELECT * FROM emp WHERE deptno IN(SELECT deptno FROM dept WHERE dname="会计" OR dname = "销售");

例子3

合并表emp 和dept 中的销售信息
SELECT * FROM emp WHERE deptno=30;
SELECT * FROM dept ,(SELECT * FROM emp WHERE deptno=30) emp30 WHERE dept.deptno = emp30.deptno;

视图

是select语句查询的结果 ;
作用:可以当作表格进行数据的增删改查
注意:对视图内容进行修改时,会影响到原表格
(原因:视图不占用空间,每次使用视图其实是在间接操作原表格的数据)

语法

创建视图:

create view 自定义名称 as 查询语句;
replace view 自定义名称 as 查询语句;

删除视图:

drop view if exists 视图名称;
drop view 视图名称;

修改视图:会影响原表格

SELECT emp.empno,emp.ename,emp.sal,dept.dname,dept.loc FROM emp,dept WHERE emp.deptno = dept.deptno;
-- 创建视图
CREATE VIEW myemp AS SELECT emp.empno,emp.ename,emp.sal,dept.dname,dept.loc FROM emp,dept WHERE emp.deptno = dept.deptno;
-- 使用视图
SELECT * FROM myemp ORDER BY sal;
UPDATE myemp SET sal =801 WHERE sal =800;
UPDATE myemp SET sal =800 WHERE sal =801;
-- 删除视图
DROP VIEW myemp;

约束

约束:为了保证表中数据的正确、有效、完整,需要对表中的数据进行限定。会对性能造成影响

约束的五种类型

1.主键约束: 保证唯一且不为空 ,相当于非空约束+唯一约束 ,关键词primary key 一个表只有一个主键
2.非空约束: 值不能为null ,关键字:not null
3.唯一约束: 值不能重复(非空情况下),关键字:unique
4.检查约束(旨在部分数据库有,mysql没有 Oracle有)
5.外键约束:完整性约束

案例

2.非空约束例子

2.1创建表格时,给表格的某个字段添加非空约束;

create table 表名(
    		字段名 数据类型 not null,
    		...
    	);

创建book 包含id\name id不为空

CREATE TABLE book(
	id INT NOT NULL ,
	NAME VARCHAR(32)
	);
ALTER TABLE book MODIFY NAME VARCHAR(32) NOT NULL; 
INSERT INTO book VALUES(1,"金苹果")
ALTER TABLE book MODIFY NAME VARCHAR(32) ; 
INSERT INTO book VALUES(1,NULL)

2.2 通过修改字段添加非空约束

alter table 表名 modify 列名 数据类型 not null;

2.3 删除字段的约束

alter table 表名 modify 列名 数据类型;

3.唯一约束例子

3.1创建表格时,添加唯一约束;

create table 表名(
字段名 数据类型 unique,

);

3.2 通过修改字段添加唯一约束

alter table 表名 modify 列名 数据类型 unique;

3.3 删除字段的唯一约束(这和非空不同)

alter table 表名 drop index 字段名;
  DROP TABLE book;
    CREATE TABLE book(
    	id INT UNIQUE,
    	NAME VARCHAR(32)
    	);
    INSERT INTO book VALUES(1,"金苹果");
    INSERT INTO book VALUES(2,"银苹果");
    ALTER TABLE book MODIFY NAME VARCHAR(32) UNIQUE; 
    ALTER TABLE book DROP INDEX NAME;
    INSERT INTO book VALUES(4,"苹果");

1.主键约束例子

1.1创建表格时,添加主键约束;

create table 表名(
    		字段名 数据类型 primary key,
    		...
    	);

1.2 通过修改字段添加主键约束

alter table 表名 modify 列名 数据类型 primary key;

1.3 删除字段的主键约束(这和非空不同)

alter table 表名 drop primary key;

1.4 主键约束+自动增长
自动增长:如果某一列是数值,可以使用 auto_increment 实现自动增长填充

CREATE TABLE book(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	NAME VARCHAR(32)
    	);
    INSERT INTO book (NAME) VALUES ("张三");
    INSERT INTO book (NAME) VALUES ("李四");

5.外键约束

一个表可以有多个外键

索引

数据库通过消耗大量的空间来达到加速查询的目的 的技术
语法

创建索引;create index 名称 on 表名(字段名);
	索引命名规范:表名_字段名_index
	删除索引:drop index 名称;

事务

开始事务: start transaction;
事务开启后的DML操作,在提交事务之前不会对数据源产生影响;如果回退则数据还原到事务开启前的状态
提交事务: commit;
对事务中的所有操作进行确认生效
回滚事务: rollback;
对事务中的所有操作进行撤销回退

DCL 管理用户、授权

DBA数据库管理员

管理用户

1.1 添加用户:
语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
1.2删除用户:
语法:DROP USER '用户名'@'主机名';
1.3查询用户:

--1.切换到mysql数据库
USE myql;
 -- 2. 查询user表
SELECT * FROM USER;

* 通配符: % 表示可以在任意主机使用用户登录数据库

权限管理:

1.查询权限:

 SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'lisi'@'%';
  1. 授予权限:
 grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
-- 给张三用户授予所有权限,在任意数据库任意表上
GRANT ALL ON *.* TO 'zhangsan'@'localhost';

3.撤销权限:

revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
  REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值