sql基础语法
一.SQL(结构化查询语言)
1.mysql是一个数据库管理系统,可以科学有效的管理我们的数据,安装在操作系统上。
2.优点
简单易学体积小
二.关系型数据库与非关系型数据库
1.关系型:mysql,oracle,SqlServer,db2
(通过表与表,行与列之间的关系进行数据的存储)
2.非关系型数据库:Redis,mongDB
(用对象的方式进行存储,通过对象的自身属性来决定数据)
三.SQL的分类
1.DDL(定义):操作库,表,列
操作库:
create database if not exists `库名` character set utf8;
drop database `库名`(要备份);
alter databases character set utf8;use `库名`;
show databases;show create databases `库名`;
操作表:
create table `表名`(列名 数据类型,。。。);
drop table if not exists `表名`;
alter table `表名`+rename to`新表名`/character set gbk/
add `列名` int / modify `新列名`int / drop `列名`;
show tables;show create table `表名`;desc `表名`;(查看表的结构)
2.DML(操作):操作表里的数据
insert into `表名`(列名,...)valus(值,...);
- values 不能写成 value
- 在mysql中单引号和双引号都是支持的,但是我们推荐使用单引号
- 除了整数和小数,其他数据类型都要用单引号引起来
- 如果insert语句添加带中文的数据报错了,那么要考虑数据库和表的字符集
- 列名和值要一一对应(注意类型)
- 简化写法:省略表名后面的小括号,如果省略不写,默认表示要添加所有的列信息
delete from`表名`where+删除条件; turncate table `表名`;(删除时效率更高)
update `表名` set 列名=值,... where+修改条件;
3.DQL(查询):查询表里的数据
Select 属性列表
From 表名
join 联表
Where 条件语句
Group by 分组字段
having 过滤分组后的信息
Order by 排序字段
Limit分页属性
1.基础select
select `字段`from `表名`; `*`表示所有的(凡是带星的效率都偏低)
2.去重select
select distinct `字段`from `表名`;
3.计算查询
*Null值与任何数值做四则运算,结果null。
*字符串和任何数值做四则运算,字符串为0
IFNULL(你要判断的值,你想要替换的值)
3.5联表查询
当一张表无法满足我们的查询需求时就需要从多张表中查询
隐式内连接
select * from `表名1` as t1,`表名2` as t2
where t1.`字段`=t2.`字段`;
(此种方式查会产生笛卡尔积,造成查询数据冗余,效率低)
显示内连接
select `字段列表`
from `表名1` as t1 inner/left join `表名2` as t2
on 条件
自连接
自己的表和自己一分为二
4.where 条件select
> >= < <= = !=
Between...and
In 在...里面 a in (a1,a2,...) a在其中返回true(效率比较低)
Is null
Is not null
And &&
Or ||
Not
(SELECT * FROM emp WHERe sal IN (1100,1600); # in 效率略低)
5.模糊select
select * from `表名` where `列名` like '_k%';
5.5 子查询(嵌套查询)
SELECt * FROM emp WHERe sal = (SELECt MAX(sal) FROM emp);
外面的是父对象,查询时由里及外
6.排序select
select * from `表名` order by `字段` asc(升序)/desc(降序);
7.聚合函数(用来对某一列进行纵向计算)
count()计数;sum()求和;max();min();avg();
select count(ifnull(`字段`,值)) from `表名`;
8.分组select
select `字段`,`字段`... from `表名` group by `分组字段` having +分组后条件;
注意:分组之后的查询字段:分组字段、聚合函数
一般聚合函数都会其别名
Where和having的区别?
*where是在分组之前进行过滤的,having是在分组之后进行过滤的
*where后面不能跟聚合函数,having可以
9.分页查询
select * from `表名` limit 0,5; 0=(n-1)*pagesize ,5=pagesize
4.DCL(控制):操作访问权限和安全等级
GRANT,DENY
四.数据库三大范式
1.数据库表的每一列的值,不可再分割
2.基于第一范式,如果是单主键,主键以外的列必须安全依赖于主键,如果是符合主键,主键以外的列必须安全依赖于主键,不能只依赖主键的一部分(消除部分依赖从而消除了冗余数据)
3.基于第二范式,非主键列之间不能相关依赖
五.数据类型
int double(3,1)12.1 decimal
varchar text
date datetime time timestamp year
六.基本sql语句
1.net start/stop mysql80
2.mysql -uroot -p¥¥¥¥¥¥
3.sc delete mysql (清空sql服务,重装)
4.localhost(修改用户密码)
5.flush privileges(刷新权限)
七.约束
约束:限制,用来限制表中的数据
约束的类型
- 非空约束:not null
- 唯一约束:unique
- 主键约束:primary key
- 外键约束:foreign key
- 非空约束
- 在创建表的时候添加非空约束 //掌握
CREATE TABLE stu(
id INT,
NAME VARCHAr(20) NOT NULL
);
- 删除非空约束 //了解
ALTER TABLE stu MODIFY NAME VARCHAr(20);
- 创建完表之后,添加非空约束 //了解
ALTER TABLE stu MODIFY NAME VARCHAr(20) NOT NULL;
- 唯一约束
不能重复 Duplicate:重复的(要求记忆)
- 创建表时添加唯一约束 //掌握
DROP TABLE stu;
CREATE TABLE stu(
id INT UNIQUE,
NAME VARCHAr(20)
);
- 删除唯一约束 //了解
ALTER TABLE stu DROP INDEX id;
- 创建完表之后,添加唯一约束 //了解
ALTER TABLE stu MODIFY id INT UNIQUE;
- 主键约束
主键 = 非空 + 唯一
特点:
一张表只能有一个主键,作为表中记录的唯一标识
- 创建表时添加主键约束 //掌握
DROP TABLE stu;
CREATE TABLE stu(
id INT PRIMARY KEY,
NAME VARCHAr(20)
);
- 删除主键约束 //了解
ALTER TABLE stu DROP PRIMARY KEY;
- 创建完表之后,添加主键约束 //了解
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
- 外键约束
外键的作用:让多表之间的数据产生关联,从而使得我们的数据更加的准确和有效
语法:
CONSTRAINT 外键名称 FOREIGN KEY (需要关联其他表的字段) REFERENCES 另外一张表的名称(要关联的字段)
- 创建表时添加外键约束
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAr(20),
age INT,
dep_id INT, -- 外键对应主表的主键
CONSTRAINT emp_dep_fk FOREIGN KEY(dep_id) REFERENCES department(id)
)DEFAULT CHARSET UTF8;
- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;
- 建完表之后,添加外键约束
ALTER TABLE `employee` ADD CONSTRAINT em_dep_fk FOREIGN KEY(DEP_ID) REFERENCES `department`(ID);
八.表设计
我们怎么去设计一张表
- 表关系
- 一对一 //了解
Mysql中基本见不到,因为一对一的关系我们会设计成一张表
举例:一个人和身份证号码之间就是一对一的关系
一个人只能有一个身份证号码
一个身份证好么只能对应一个人
- 一对多
Mysql中很常见
举例:员工和部门之间
一个员工只能有一个部门
一个部门可以有多个员工
- 多对多
在mysql中时无法直接表示的(使用中间表实现)
举例:
学生和课程之间
一个学生可以选择多门课程
一个课程可以被多个学生选择
设计数据库和表的总结:
创建数据库:
CREATE DATABASE 数据库名称CHARACTER SET utf8;
CREATE DATABASE db4 CHARACTER SET utf8;
创建表:
CREATE TABLE 表名(
id INT PRIMARY KEY AUTO_INCREMENT,
。。。。
)DEFAULT CHARACTER SET utf8;
九.事务(俗称业务)
*** if 一起活着
else 一起去死****
事物的三个操作,1.开启事务2.回滚3.提交事务
- start transaction:开启事务
- Rollback:回滚操作
- Commit:提交操作
四大原则
1.原子性:把事务当成一个不可分割的最小单位,要么同时成功,要么同时失败
2.一致性 : 执行事务前后数据总和不变
3.持久性:事务没提交就回滚,事务一旦提交就存入数据库中持久存活
4.隔离性:多个事物,相互要独立,互不影响
事务的隔离级别
多个事务之间,是相互独立的,但是当多个事务操作同一批数据的时候,就会出现问题,我们需要设置不同的隔离级别来解决
问题:
脏读:一个事务读取到了另外一个事务没有提交的数据
不可重复读:一个事务读取到了另外一个事务已经提交的update语句
幻读:一个事务读取到了另外一个事务已经提交的insert语句
隔离级别:
Read uncommited:读未提交
可能出现脏读、不可重复读、幻读
Read commited:读已提交 (oracle默认隔离级别)
可能出现不可重复读、幻读
Repeatable read:可重复读(mysql默认隔离级别),可能出现幻读
Serializable:串行化,不会出问题
十.索引
(index:帮助mysql高效获取数据的数据结构)
1.分类
主键索引:primary key 唯一标识
唯一索引:unique key 避免重复的列出现,本身可以重复
常规索引:key/index
全文索引:full test
2.索引原则
不要对经常变动的数据加索引
小数据量不要加索引
索引不是越多越好
索引一般加载到常用查询的字段上
//explen 分析sql执行的状况
//delimter $$ 写函数之前必须要写的



