@[toc]目录
#5).排序查询 (关键字: order by , asc ,desc)
#6).分页查询(关键字:limit 请求页数,请求的条数 )
#2.模糊查询 _ 表示一个未知字符 %表示0或多个未知字符
#1).子查询 将一条sql的查询结果作为另一条sql条件的值
#概述
用来存储数据和管理数据的仓库,主要分成两类:关系型数据库 和 非关系型数据库
#安装
一路next,注意几个地方:端口号默认是3306,字符集改成utf-8,密码:root
sql是结构化查询语言,专门用来操作数据库的语言.是一种标准化语言,可以操作各种数据库产品.
分类:
1,DML : 数据操纵语言,是指对数据进行CRUD
2,DDL: 数据定义语言,是指创建的SQL语法
3,DCL: 数据控制语言,是指权限的分配
4,DQL: 数据查询语言,是指对数据的各种查询语法
常用操做:
对数据库的操作,对表的操作,对数据/记录的操作
#sql语句
创建数据库 create database 库名 default character set utf8;
查看所有数据库 show databases;
删除数据库 drop database 库名;
使用数据库 use 库名;
创建表 create table 表名(字段名 字段类型(字段最大长度),字段名 字段类型(字段最大长度)....);
查看所有表 show tables;
删除表 drop table 表名
查看表结构 desc 表名
添加字段 alter table 表名 add column 列名 字段类型(字段长度);
查看所有表 select * from 表名;
插入数据 insert into 表名 values(100,'text','男'); 值的个数、顺序和字段一致;
修改字段名 update 表名 set 字段名=新值;
删除数据 delete from 表名;
防止中文乱码 set names gbk;
导入sql脚本 source D:/demo.sql
开启事务 begin;
创建视图 create view 视图名 as select * from 表名 where条件
使用视图,就当做一张表来用 select * from 视图名
#事务
–1,概述
能保证多条SQL要么全成功要么全失败
4个特性:ACID
原子性:多个SQL处于同一个事务里,要么全成功要么全失败
一致性:保证数据在不同的电脑里是一致的
隔离性:数据库支持并发访问,保证事务间是隔离的,互不影响
持久性:对数据库的操作是永久的
–2,事务的隔离级别
读未提交:性能最好,数据的安全性最差
读提交:Oracle的默认的隔离级别 – 性能较好,安全性较差
可重复读:Mysql的默认的隔离级别 – 性能较差,安全性较好
串行化:安全性最高,但是表级的锁,效率低
#增删改查!!
#一、增:有2种方法
1.使用insert插入单行数据:
语法: insert into 表名 列名 values 值
例如: insert into hero (name,sex,job) values ('亚索','男','中单');
2.使用insert,select语句将现有表中的 数据添加到已有的新表中
语法:insert into <已有的新表> <列名> select <原表列名> from <原表名>
例:insert into hero ('姓名','年龄','性别')select name,age,sex from user
注意:查询得到的数据个数、顺序、数据类型等,必须与插入的项保持一致
#二、删:有2种方法
1.使用delete删除数据某些数据
语法:delete from <表名> [where <删除条件>]
例:delete from hero where name='亚索'(删除表hero中列值为亚索的行)
注意:删除整行不是删除单个字段,所以在delete后面不能出现字段名
2.使用truncate table 删除整个表的数据
语法:truncate table <表名>
例:truncate table hero
注意:删除表的所有行,但表的结构、列、约束、索引等不会被删除;不能用于有外建约束引用的表
#三、改 使用update更新修改数据
语法:update <表名> set <列名=更新值> [where <更新条件>]
例:update hero set age=18 where name='亚索'
注意:set后面可以紧随多个数据列的更新值(非数字要引号);where子句是可选的(非数字要引号),用来限制条件,如果不选则整个表的所有行都被更新
#四、 查
1.普通查询
语法:select <列名> from <表名> [where <查询条件表达试>] [order by <排序的列名>[asc或desc]]
#1).查询所有数据行和列
例:select * from hero
说明:查询hero表中所有行和列
#2).查询部分行列--条件查询
例:select name,age from hero where id=1
说明:查询表hro中id=1的所有行,并显示name,age 2列
比较运算符 > < >= <= = != <>
and类似java中的&&,同时满足多个条件的时候使用
or类似java中的||,满足一个条件的时候使用
数值计算 + - * / %
#3).在查询中使用AS更改列名
例:select name as 姓名 from hero where sex='男'
说明:查询hero表中性别为男的所有行,显示name列,并将name列改名为(姓名)显示
#4).查询空行
例:select name from hero where job is null
说明:查询hero表中job列为空的所有行,并显示name列;SQL语句中用is null或者is not null来判断是否为空行
#5).排序查询 (关键字: order by , asc ,desc)
例: select name from hero where age>18 order by age desc
说明: 查询hero表中年龄大于18人的姓名升序排列 desc为升序关键字 默认为降序
#6).分页查询(关键字:limit 跳过的条数,请求的条数#每页的条数)
例子: select name from hero where age>18 limit 0,3
说明: limit跳过的条数(请求的页数-1)*每页的条数
#7).去重查询 distinct
select distinct job from emp
说明: 查询emp表中的都有什么部门 distinct去掉重复的部门只显示一个
#2.模糊查询 _ 表示一个未知字符 %表示0或多个未知字符
#1).使用like进行模糊查询
例:select * from hero where name like '亚%'
说明:查询显示hero表中,name字段第一个字为亚的记录
#2).使用between在某个范围内进行查询
例:select * from hero where age between 18 and 20
说明:查询显示表hero中年龄在18到20之间的记录
#3).使用in在列举值内进行查询(in后是多个的数据)
例:select name from hero where id in (5,7,9)
说明:查询hero表中id值为5,7,9的记录,显示name字段
#3.分组查询
#1).使用group by进行分组查询
例:select AVG(age) as 平均年龄 from hero group by job
说明: 查询hero表中每个job的平均年龄
#2).使用having子句进行分组筛选
例:select AVG(age) from hero group by job having count(age)>1
说明:接上面例子,显示分组后count()>1的行,由于where只能在没有分组时使用,分组后只能使用having来限制条件
#4.聚合函数
对查询的多条数据进行统计查询
1).平均值 avg(字段名) select avg(sal) from emp where deptid=1;
2).最大值 max(字段名) select max(sal) from emp where deptid=1;
3).最小值 min(字段名) select min(sal) from emp where deptid=1;
4).求和 sum(字段名) select sum(sal) from emp where deptid=1;
5).计数 count(*/字段名) select count(sal) from emp where sal>2000;
#5.多表查询
#1).子查询 将一条sql的查询结果作为另一条sql条件的值
例: select * from emp where sal> (select avg(sal) from emp where deptid=1);
说明: 查询工资高于1号部门平均工资的员工信息
#2).关联查询
#等值连接 查询的是两张表交集的数据
格式: select * from A,B where 关联关系 and 其他条件
例: select distinct loc from emp e,dept d where e.deptid=d.deptid and job='程序员'
说明:查询程序员的工作地点
#内连接 内连接和等值连接一样查询的都是两个表的交集数据
格式: select * from A join B on 关联关系 where 其他条件
select e.name from emp e join dept d on e.deptid=d.id where d.name='神仙' and job='销售'
#外连接 外连接查询的是一张表的全部和另一张表的交集
格式: select * from A left/right join B on 关联关系 where 其他条件
left join : join左侧的表是全部 ,右侧是交集
right join :right右侧是表的全部,左侧是交集
查询所有员工的姓名和对应的部门名
select e.name ,d.name from emp e left join dept d on e.deptid=d.id
#6.索引
好处:给加完索引的列,提高查询效率
坏处:索引本质上就是一张表,如果表的体积太大,比较占内存 主键本身就有索引、
分类:
单值索引(一个索引只包含着一个列)
复合索引(一个索引包含着多个列)
唯一索引(一个索引只包含着一个列,但是要求列的值不能相同)
1).创建普通索引 create index 索引名 on 表名(字段名)
2).查看索引 (观察三列:表名/字段名/索引名) show index from dept
3).使用索引 explain select * from dept where dname like '%a%'
4).创建唯一索引 alter table 表名 add unique (字段名)
5).创建复合索引 alter table 表名 add index 索引名 (字段名,字段名...)
6).删除索引 alter table 表名 drop index 索引名
#7.约束
#外键约束
#外键约束
create table tb_user(
id int primary key auto_increment,
name varchar(20),
age int
)
create table tb_user_addr(
user_id int primary key auto_increment,
addr varchar(200) ,
#描述了两张表之间通过哪个字段关联着--外键约束
# 外键 (子表的字段) 参考 主表名称(主表的字段)
foreign key(user_id) references tb_user(id)
)
#默认约束
create table h(
id int primary key auto_increment,
sex char(3) default '女' #default设置默认值,给指定的字段设置默认值
)
#检查约束
create table i(
id int primary key auto_increment,
age int,
check(age>0 and age<=150)#检查约束:给字段增加检查条件,符合才能操作,不符合不能操作
)
#唯一约束
#唯一约束:字段的值不能重复
create table g( name varchar(10) unique )
#非空约束
#非空约束:字段的值不能为空
create table e( name varchar(10) not null )
#主键约束
#主键约束自动递增,id的值不能重复,不能是null,而且自动递增
create table c(id int PRIMARY key auto_increment)
#函数
lower–全转小写
upper–全转大写
length–求长度
concat–拼接串
substr–截取字符串
replace–替换字符串
ifnull–对null元素的替换
round–对小数四舍五入
ceil–对小数向上取整
floor–对小数向下取整
now–获取当前的年月日时分秒
year–获取日期里的年
month–获取日期里的月
day–获取日期里的日
hour–获取日期里的时
minute–获取日期里的分
second–获取日期里的秒
转义字符 ’
————————————————
lower:全转小写 upper:全转大写 SELECT ename,empno,LOWER(ename),UPPER(ename) FROM emp
length:获取长度,一个字母或数字长度为1,一个汉字长度是3
SELECT dname,LENGTH(dname),loc,LENGTH(loc) FROM dept
#concat:拼接字符串,第一个参数是字段名,后面的参数都是要拼接的数据
SELECT dname,CONCAT(dname,'hello',123,789) FROM dept
#substr(1,2):截取字符串,1是字段名,2是从哪个字符开始
SELECT dname,SUBSTR(dname,3) FROM dept
#substr(1,2,3):1是字段名,2是从哪个字符开始,3是截取长度 SELECT dname,SUBSTR(dname,5,3) FROM dept
#replace(1,2,3):1是字段名,是要把2换成3
SELECT dname,REPLACE(dname,'a','666') FROM dept
#ifnull(1,2):1是字段名,判断1如果是null就换成2
SELECT comm,IFNULL(comm,200) FROM emp#计算月薪
SELECT sal,comm,sal+IFNULL(comm,0) FROM emp
SELECT sal,comm,sal+IFNULL(comm,0),sal*12+IFNULL(comm,0)*12 FROM emp
#round四舍五入, ceil向上取整 , floor向下取整 SELECT comm,ROUND(comm),CEIL(comm),FLOOR(comm) FROM emp
#日期函数 now当前时间 #year年 month月 day日 hour时 minute分 second秒
SELECT YEAR('2020-08-26'),MONTH(NOW()),DAY(NOW())
#转义符号\
SELECT 'xi\'an' SELECT "xi'an"