MySQL的查询方面语法

mysql数据库是免费的,SQL server是需要收费的,但是MySQL和SQL server都是使用的标准的SQL语言
安装MySQL有两种方式,一种是.exe的直接安装的,这种虽然简单,但是用户在安装的时候有些东西都是无法更改设置的;
还有一种是下载压缩包,然后改一下配置文件.ini,来进行使用的,虽然第二种麻烦一点,但是还是建议选择第二种方式。
以下都是我以我数据库中的表作为例子来叙述的(写的有些乱,望见谅)
DQL:(数据库查询语言)查询语句,凡是select语句都是DQL
DML:(数据库操作语言)insert delete update 对表中的数据进行增删改
DDL:(数据库定义语言)create drop alter,对表结构的增删改
TCL:(事务控制语言)commit,提交事务,rollback回滚事务
DCL:(数据控制语言)grant授权、revoke撤销权限
登录:mysql -uroot -p //此处的如果你在安装的时候有密码,就需要把密码写在-p后面 root为用户名
查看有哪些数据库
show databases;
mysql自带的数据库
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
±-------------------+
自己创建数据库的语句
create database song;(其中这song是我创建的数据库名字
使用数据库
use song;
查看当前正在使用的数据库
select database();
查看数据库的版本
select version();
查看数据库当中的表
show tables
初始化数据
source 加上文件路径 (其实这一步就是创建表)
例如: source D:\软件软件\mysql数据库\文件\table01.sql
再次查看该库中的表:
show tables;
±---------------+
| Tables_in_song |
±---------------+
| song01 |
±---------------+
删除数据库
drop database song;
查看表结构
desc 表名;
例如 desc song01;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| name | varchar(12) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
±------±------------±-----±----±--------±------+
查看表中的数据
select * from 表名;
结束一条语句
\c
查看其他数据库当中的表(这种情况就是当你在一号数据库中,想看二号数据库当中的表时,才进行使用);
show tables from 表名;
查看你创建表的语句
show create table 表名;

增加字段
alter table 表名 add 字段名 数据类型 null/not null;
修改表中数据
update 表名 set 要修改的列(字段) [where 修改指定位置所需要的条件](如果没有where,就是直接修改整个字段的数据)
sql语句比较重要的就是查询语句
简单的查询
语法格式:select 字段名1,字段名2,字段名3… from 表名;
提示:任何一条语句以";"结尾
sql语句不分大小写
在查询的时候,可以对字段进行一些数学运行,如加减乘除,那么出来
的表中数据,就是原有数据经过运算得出的
给查询结果的列重命名
select 字段名1(就是原来的名字) as 重命名之后的名字 from 表名;
如果重命名之后的名字与中文需要用单引号’'夹起来
但是标准sql语句字符串是单引号括起来的,
as可以省略不写
select * from 表名;
使用*号是查询所有字段(但是效率慢)

insert into命令格式:insert into <表名> [(<字段名1>[,…<字段名n > ])] values ( 值1 )[, ( 值n )];

例如:往表 MyClass中插入两条记录,这两条记录表示:编号为1的名为Tom的成绩为96.45,
编号为2 的名为Joan 的成绩为82.99,编号为3 的名为Wang 的成绩为96.5。
insert into MyClass values(1,‘Tom’,96.45),(2,‘Joan’,82.99), (2,‘Wang’, 96.59);
条件查询
语法格式:select
字段,字段 …,
from
表名
where
条件;
执行顺序是:先from 再where 最后select
在写的时候,是: select 字段 from 表名 where 条件;(如果有多个字段,用“,”隔开)
where条件的一些细节写法
<>这个是不等号!=这个也可以
and是和的意思 between表示两者之间,
例如between 100 and 200这个是一百到两百之间,并且包括100和200(用在数字是两边都是闭区间)
如果用在字符串之间,那么是左闭右开
is null 表示为空
is not null表示不为空
and是和 or是或者 in是包括的意思 not in就是不包括的意思
select name from people where xin=‘li’ or xin=‘wang’;这个就是在people表中找出姓li和wang的人的姓名
select name from people where xin in(‘li’,‘wang’);这个就是在people表中找出姓li和wang的人的姓名
//所有in和or的效果差不多

模糊查询
like(在模糊查询中,%代表任意字符,_下划线代表一个字符)
如果你想查到字符中含有下划线的,用转义字符_这样就可以了
select name from people where xin like ‘%k%’;查到姓氏中带有k的人的姓名
select name from people where xin like ‘_k%’;找到姓氏中第二个字母是k的人的姓名

排序查询
排序
select
字段1,字段2…
from
表名
order by
按照排序的字段 asc/desc; //(是按照姓名排序,还是年龄排序,就写那个字段)
//其中asc表示升序desc表示降序 不填默认是升序
例如 select name , age from people order by age ;//这个就是按照年龄“升序”排序
例如 select name , age from people order by age desc;//这个就是按照年龄“降序”排序
例如 select name , age from people order by age asc;//这个就是按照年龄”升序“排序
特殊
例如 select name , age from people order by age desc , name asc;//这个就是先按照年龄降序排序,
当有年龄相同时,这几个年龄相同的按照名字进行升序排列
例如 select name , age from people order by 2 desc;//这个就是按照“年龄”降序排序
例如 select name , age from people order by 1 desc;//这个就是按照”姓名“降序排序
例如 select * from people order 4 desc/asc ;//这个就是按people表中第4个字段进行比较排序的 ,这样写不怎么安全,不建议
排序查询
select name,age from people where xin in(‘li’,‘wang’) order by age asc;//找到姓氏li和wang的人,并按照年龄大小进行升序排列

**********************去除重复记录
select distinct 字段名 from 表名;//distinct只能出现在该代码的这个位置,他的前面不能再写字段名
//如果在distanct后面的字段名有多个,那么就是联合的去重
连接查询
在实际开发过程中,大部分查询数据都不是单表查询,一般都是多张表联合查询
关于表的别名
select q.age m.name from sdf q,jkl m;
//这个就是把表进行重命名,然后前面的字段用别名来标注,这样在查找的时候,就会提高效率
//如果不加的话,age这个字段,会在sdf和jkl两张表进行查找这个字段
连接查询的分类
根据语法的年代划分
SQL92
SQL99
根据表的连接方法划分
内连接
等值连接
非等值连接
自链接
外连接
左外连接(左连接)
右外连接(右链接)
全连接(很少用)
在表的连接查询方面有一种现象被称为:笛卡尔积现象。(笛卡尔乘积现象)
当两张表进行连接查询的时候,没有任何条件限制,最终的查询结果的条数是两张表记录条数的乘积。
要减少笛卡尔乘积现象,就用where语法来判断

等值连接
一张学生表student 有学号cno 姓名name
还有一张班级情况表 class 有学号cno 学生电话phone
现在要找到对应学生名字和手机号
SQL92:(太老了,不使用了)
select
s.name , c.phone
from
student s , class c
where
s.cno=c.cno;
SQL99:
select
s.name , c.phone
from
student sdf
inner join //inner(内)可以省略,带着她就是可读性好一些
class class
on
s.cno=c.cno;
SQL99的好处就是把表的连接关系与where语句分离了,表更加清晰了
非等值连接
现在有一张高考成绩表salary 有学生名字name 分数fen
还有一张表是成绩等级表dengji 有等级编号no 有等级最低分as 有等级最高分kl
现在要查询出每个学生对应分数的等级
select
s.name , s.fen , d.no
from
salary s
join
dengji d
on
s.fen between d.as and d.kl;
自连接 特点:一张表看作两张表
就是有一张员工信息表biao 上面有员工编号Number 有姓名name 有员工上级领导编号 leadNumber
现在要找到员工以及它对应的领导的姓名
select
a.name as ‘员工’ , b.name as ‘领导’
from
biao a
join
biao b
on
a.leadNumber=b.Number;

外连接
外连接与内连接的区别之分
内连接:假设a和b两张表进行连接,ab两张表没有主副之分,两张表是平等的
外连接:使用外连接进行连接两张表的时候,其中有一张表是主表,一张是副表
主要是查询主表中的数据,捎带查询副标的数据,当副标的数据没有和主表匹配上,那么副表会自动模拟出null与之匹配
左外连接(左连接):表示左边的是主表
右外连接(右链接):表示右边的是主表

左连接有右链接的写法,右连接也会有对应的左链接的写法

还是这道题用外连接的方法
	就是有一张员工信息表biao   上面有员工编号Number 有姓名name 有员工上级领导编号 leadNumber
	现在要找到员工以及它对应的领导的姓名
	select
		a.name as '员工' , b.name as '领导'
	from
		biao a
	left outer join    //在这加一个left就代表a是主表,outer(外)可以省略
		biao b
	on
		a.leadNumber=b.Number;

多张表进行查询
两张表:
select

from
xxxx
join
xxxx
on
???=???
三张表: //只需在多加一个join on即可,就是把前两张表查询的结果再与带三张表对比查询
select

from
xxxx
join
xxxx
on
???=???
join
xxxx
on
???=???
N张表:
select

from
xxxx
join
xxxx
on
???=???
join
xxxx
on
???=???

分组函数(多行处理函数)//分组函数自动忽略null
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
所有的分组函数 都是对某一组数据进行操作的
select sum(字段名) from 表名;//对一个字段进行求和

select sum(age) from people;//把people表中的所有人age加起来
select max(age) from people;//年纪最大
select min(age) from people;//年纪最小
select avg(age) from people;//平均年纪
select count(*) from people;//计算该表有多少条数据,如果*号是具体的字段,那么,例如:
								 年龄age字段中如果有空的地方,那么这一条将不被计数,计算的是不为空的
分组函数,不能直接出现在where子句中

数据库中的规定,只要数学运算过程中有null那么结果就是null
单行处理函数:比如一个人的年龄加上工资,如果工资为空时,那么得到的结果也是null
那么可以加上这个东西: ifnull(可能是null的数据,被当作什么处理)
ifnull(salary,0)//这个就是如果工资为空,那么把工资当作0处理(salary这个单词是工资的字段)
group by和having
group by:按照某个字段或某些字段进行分组
having: 是对进行分组之后的数据再次进行过滤
如果我们想找到相同年纪,工资最多的那个,我们就先进行分组,再找最大值
select max(salary) from people group by age;//这个语句先执行group by以age进行分组,在找到个没饿过年龄中工资高的人
//分组函数叫分组函数的原因,就是和分组结合使用
select from where group by having order by limit
上面这些语句执行顺序是 from–> where–> group by–> having–>select–>order by–>limit

重要************
当一条sql语句中含有group by语句的话,那么select后面只能出现 参加分组的数据和分组函数
如果在分组的时候,想要把两个字段捆绑在一起分组,那么可以在group by写上字段,字段之间用逗号隔开
=-=-=-=-=-=-=-=-================================
在写sql语句的时候,不要想着一下子写出来全部,要拆开分段开(对于查询复杂的数据来说)

建议能使用where先过滤的,就不要使用having
group by 和 having是搭档,在没有使用group by的情况下,不要使用having

union//合并查询结果,第三种就是
第一种
select name from people where xin=‘li’ or xin=‘wang’;这个就是在people表中找出姓li和wang的人的姓名
第二种
select name from people where xin in(‘li’,‘wang’);这个就是在people表中找出姓li和wang的人的姓名
第三种
select name from people where xin=‘li’
union
select name from people where xin=‘wang’;
//就是把查询结果加在一起

drop table if 表名;//如果这个表存在,那么这个表要被删除

下面是我认为比较重要的一些知识要点
子查询
什么是子查询?
select语句当中嵌套select语句,被嵌套的select语句是子查询
子查询出现在哪里?
select
…(select).
from
…(select).
where
…(select).
//这个东西很重要,用法也比较多
limit(这个是mysql特有的)
语法格式
limit 起始位置,选取长度;//起始位置如果不写,就默认从0开始
就是能选择性选取查询结果的数据
例如:
select name from people order by name limit 0,5; //如果这个0不写,那么默认从0开始;
就是先对people表中的名字按升序排序,然后取出前五行名字显示
limit是mysql最后执行的语句
这个你可以联想到百度你随便搜个东西,都是有好多页,没有把所有的链接网页都全部放在一个页面内,要不然容易死机,用户体验感也不好
**********************去除重复记录-========================================================================================
select distinct 字段名 from 表名;//distinct只能出现在该代码的这个位置,他的前面不能再写字段名
//如果在distanct后面的字段名有多个,那么就是联合的去重
表的创建(此处就不写了)

向表中插入数据
insert into命令格式如下:
insert into 表名(字段1,字段2,字段3,…) values ( 值1,值2,值3…) ,( 值1,值2,值3…) …;
//如果values后面就一个(),就是直插入一行,写多个就是插入多行
在建表的时候,如果在一个字段数据类型后面加上一个default 数据1,那么就是说这个字段默认值是数据1

insert into 要插入数据的表名 select语句;//就是把查询结果数据插入表中

***表的复制***//表的复制,说到底也是向表中插入数据
	create table 新表的名字 as select 字段(你要复制旧表的字段,字段可以有多个,或者可以是*代表全部字段复制) from 旧表的名字;
	//上面那个只是简单的复制
	create table 新表的名字 as select语句;//此处的select语句,就是前面查询的结果都可以复制到新的表中,而不只是单单的显示出来 

修改数据
update 表名 set 要修改的列(字段) [where 修改指定位置所需要的条件](如果没有where,就是直接修改整个字段的数据)
例如
update people set age=19 where name=‘li’; //就是把姓li的年龄改为19
删除数据
delete from 表名 where 条件;
//没有条件,全部删除,用这个删除 还可以回滚恢复数据
删除大表(风险高)//永久丢失,删除速度快
truncate table 表名;

约束
非空约束
唯一约束
在字段数据类型后面写上 unique;表明该字段是唯一的
如果你在代码中加上 unique(字段1,字段2);这个表示字段1和字段2合起来,不能重复
例如:
create table ttt(
id int not null,
name varchar(100) ,
unique(id,name)
); //这个代码就表示id和name联合的字段,具有唯一性
主键约束
单一主键:在字段数据类型后面写上 primary key;就表示该字段是主键,这种是单一主键
也可以:
create table ttt(
id int not null,
name varchar(100) ,
unique(id)
);
复合主键
例如:
create table ttt(
id int not null,
name varchar(100) ,
primary key(id,name)
);//id和name共同为主键
*mysql提供主键值自增
例如:
create table ttt(
id int primary key auto_increment,//就是只需要加入auto_increment即可
name varchar(100)
);

外键约束  
	被引用的外键,在他的表中,他不一定是主键,但一定要有唯一性
	create table sss(
		nno int ,
		name varchar(100),
		primary key(nno)
		);
	create table ttt(
		id int primary key auto_increment,
		name varchar(100)
		foreign key(id) references sss(nno)     //这样就成功设置了外键约束
		);
检查约束

存储引擎(mysql才有的)(了解)
查看支持的存储引擎 show engines \G
常见的存储引擎
MyISAM
采用三个文件组织一张表:.frm(存储格式) .MYD(存储数据) .MYI(存储索引)
优点:可被压缩,节省空间,并且可以转换为只读表,提高检索效率
缺点:不支持事务
InnoDB
表的结构存储在.frm文件中 数据存储在tablespace这样的空间结构中(逻辑概念,无法被压缩)
在MySQL崩溃后,提供自动恢复机制。支持级联删除和级联更新
优点:支持事务,安全
MeMORY
缺点:不支持事务,数据容易丢失
优点:查询速度最快
事务
一个事务是一个完整的业务逻辑单元,不可再分
如果一个事情需要先执行insert在执行update 最后执行delete
不使用事务:就是三个语句一个一个执行,这个修改是直接对硬盘数据修改的
不使用事务机制:修改的时候,不能同步,例如转账,a账户减了100,但是在执行b账户加100,却出错了,但是a账户减了100,这个是无法挽回的
这样就不安全
使用事务:你输入的语句不会直接对硬盘数据进行修改,会保留这个历史操作,
等到你把所有语句执行完后,这时候事务机制会回滚事务,可以根据历史操作,撤销语句的执行效果
你在确定上面语句执行成功的时候,可以commit;提交你的操作,就不能再回滚了
rollback是回滚 commit提交 start transaction;关闭自动提交
事务机制:要么多条语句同时成功,要么失败;

事务的四大特性:ABID
A:原子性:事务是最小的工作单元,不可再分
B:一致性:事务必须保证多条DML语句同时成功或者同时失败
I:隔离性:事务A和事务B之间具有隔离性
D:持久性:持久性是最终数据必须持久化的到硬盘文件上,事务才算成功

事务的隔离级别,包括四个:
1.读未提交(read uncommitted) ;对方事务没有提交,我们当前事务可以读到对方未提交的数据
2.读已提交(read committed); 不可重复读(只能读到在最新的数据)
3.可重复读(repeatable read);解决了不可重复读,其实读到的数据是幻想,就是不是硬盘上真正的数据,是备份的数据
4.序列化读(seriallizable);解决了所有问题,效率低,需要排队
演示事务
mysql事务默认情况下是自动提交的
(就是只要执行任意一条DML语句,则提交一次) start transaction;关闭自动提交
rollback是回滚

设置事务的隔离级别:
set global transaction isolation level 隔离级别;
查看事务的全局隔离级别:
select @@global.tx isolation;

索引 //底层采用的是B+树
什么时候加索引?
·· 数据量很大
该字段很少进行DML操作
该字段经常出现where子句中
在语句前面加上explain来查看语句得到执行情况
创建索引:create index 索引名称 on 表名(字段名);//索引名称是自己定义的
删除索引:drop index 索引名称 on 表名;
索引分类:
单一索引
复合索引
主键索引
唯一索引

视图
什么是视图?
站在不同角度看数据
怎么创建视图?
create view 视图名字 as select 字段名1,字段名2 from 表名;//视图名字是自己定义的
怎么删除视图
drop view 视图名字;
***对视图进行增删改查,会影响原表数据;

面向视图操作
	select *from 视图名字;
试图作用
	为了安全

DBA命令
创建新的数据库用户
create user 用户名 identified by ‘密码’;//如果密码为空,则就是不需要密码
给用户授权
grant all privileges on dbname.tbname to ‘用户名’ @ ‘login ip’ identified by ‘密码’ with grant option;
dbname=代表所有数据库
tbname=表示所有表
login ip =表示所有ip
password 为空,表示不需要密码也可登录
with grant option; 表示该用户还可以给其他用户授权
将数据库当中的数据导出
在windows的dos命令窗口中执行:
mysqldump 数据库名字>导出的路径 -u用户名 -p密码 //导出指定库
mysqldump 数据库名字 表名>导出路径 -u用户名 -p密码 //导出指定表
导入数据
source 路径;
范式 //每一步,都是需要建立在前一步的基础之上
1NF:
2NF:不能含有部分依赖,要求实体的属性完全依赖于主关键字
3NF:不能含有传递依赖,非主属性不传递依赖于关键字。
BCNF:每一个依赖关系中,都要包含有码
4NF:
5NF:
后面这两个我也记不清楚了。。。。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值