mysql基本语法

修改数据库密码

use mysql
1 update user set password=password('123456') where User='root'; ( 5.7之前的支持,mysql 高版本不支持)
2update user set authentication_string=password('123456') where User='root' and Host='localhost';
flush privileges; 刷新mysql的系统权限相关表
3.mysqladmin -u root -p password 123456;

什么是SQL

SQL是Structured Query Language(结构化查询语言)的缩写
SQL是专门为数据库而建立的操作命令集,是一种功能齐全的数据库语言

是么是存储引擎

mysql中的数据用各种不同的技术存储在文件中(或者内存中)
每一种技术都是用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同的功能和能力
通过选择不同的技术,你能够获得额外的书读或者功能,从而改善你的应用的整体功能
不同的存储引擎性能是不一样的
包含:

  • MYISAM :不支持事物。也不支持外键,尤其访问速度快,对事物完整性没有要求或者以SELECT、INSERT为主的应用可以使用这个引擎来创建表
    每一个MYISAM在磁盘上存储成3个文件,其中文件名和表名都相同,但是扩展名分别为.frm(存储表定义)MYD(MYData,存储数据)````
  • INNODB:存储引擎提供了具有提交、回滚和奔溃恢复能力的事务安全单对比MYISAM的存储引擎,INNODB写的处理效率差一些并且会占用跟多的空间以保留数据和索引
  • MEMORY

sql功能分类

  • DDL:数据定义语言;用来定义数据库对象:创建库、表、列等
  • DML:数据操作语言;用来操作数据库表中的记录
  • DQL:数据查询语言;用来查询数据
  • DCL:数据控制语言;用来定义访问权限和安全级别

DDL(数据定义语言)常用数据库命令

创建数据库create database 数据库名 character set utf8;
删除数据库drop database 数据库名
查看数据库 show databases
使用数据库use 数据库名
查看数据库中的表 show tables
查看表结构desc 表名
创建表create table 表名(id int,name varchar(25),email varchar(255))
添加一列alter table 表名 add 字段名 数据类型
删除一列alter table 表名 drop 字段名
修改表名rename table 原始表名 to 新表名
查看表的创建细节show create table 表名
修改表的字符集为gbkalter table 表名 character set 字符集名称
修改表的列名alter table 表名 change 原始列名 新列名 数据类型
删除表drop table 表名

插入数据

  • 插入数据insert into 表名 (列名1,列名1) values (列值1,列值1);
  • 批量插入 insert into 表名 (列名1,列名1) values (列值1,列值1),(列值1,列值1);
  • 注意:顺序一一对应、值不要超出定义的长度

跟新操作

update 表名 set 列名1=列值1,列名2=列值2 ... where 列名=值;
在原来的基础上修改值update 表名 set age=age+1 where 列名=值;

删除操作

delete from 表名 [where 列名=值];
truncate table 表名;
delete与truncate的区别
delete删除表中的数据、表结构还在;删除后的数据还可以找回
truncate删除是把表直接drop掉,然后在创建一个同样的新表。 删除的数据不能找回,执行速度比delete块

查询数据

select * from [where 列名=值];
select 列名1,列名2 from [where 列名=值];

  • where 条件
    andorbetween andis nullis not nullin(set)
    = != <> < > <= > >=
//查询学号为101 102 103的记录
select * from student where id=101 or id=102 or id=103;
select * from student where id in(101,102,103);

//查询姓名为null的记录
select * from student where name is null;

//查询姓名不为null的记录
select * from student where name is not null;

//查询性别为非男的记录
select * from student where gender !='男';

//查询年龄在18到20的记录
select * from student age>=18 and age<=20;
select * from student between 18 and 20;

模糊查询

  • 使用like关键字后跟通配符
  • 通配符
    • _: 任意一个字符
    • % : 任意0-n个字符
// 查询姓名由五个字母构成的学生记录
select * from student where name like '_____'; // (五个 '_')

// 查询姓名由五个字母构成并且第五个字母为's'的学生记录
select * from student where name like '____s'; // (四个 '_')

//查询姓名以“m”开头的学生记录
select * from student where name like 'm%';

//查询姓名中第二个字母为“u”开头的学生记录
select * from student where name like '_u%';

//查询姓名中包含'李'的学生记录
select * from student where name like '%李%'; 

字段控制查询

  • 去除重复记录 select distinct name from student;
  • 把查询字段的结果进行运算,必须都要是数据型
select *,age+score from 表名
//列有很多值为null,因为任何东西与null相加还是null,所以运算结果可能会出现null,下面使用了把null转化为数值0的函数IFNULL
select *,age+IFNULL(score,0)  from 表名

排序

  • order by关键字
    • 升序 asc (从小到大) 默认
    • 降序 desc
//按薪资排序
 select * from student order by salary  desc; 

//按薪资和id排序
 select * from student order by salary desc , id desc;
 

聚合函数

  • count() 统计指定列部位null的记录行数
  • max();计算指定列的最大值,如果指定类型是字符串类型,那么使用字符串排序运算
  • min();计算指定列的最小值,如果指定类型是字符串类型,那么使用字符串排序运算
  • sum();计算指定列的数值和,如果指定类型不是数值类型,那么计算结果为0
  • avg(); 计算指定列的平均值,如果指定类型不是数值类型,那么计算结果为0
count实例
//查询表记录数
select count(*) as total from student;
//查询有绩效的人数
select count(salay) from student;
//查询绩效大于2500的人数
select count(*) from student where salary >2500;
//查询月薪和绩效之和大于5000的人数
select count(*) from student where salary + ifnull(yuexin,0) >5000;
//查询有绩效和有管理的人数
select count(*),count(manger) from student;
sum和svg,max,min实例
// 查看所有月薪和,以及绩效和
select sum(salary),count(performance) from student;
// 查看所有月薪+绩效和;
select sum(salary + ifnull(performance)) from student;
// 所有员工的平均值;
select avg(salary) from student;
// 查询最高工资和最低工资;
select max(salary),min(salary) from student;

分页插查询 limit 查询

  • select * from 表名 limit 0,5
  • select * from 表名 limit (currentPage-1)*pageSize,pageSize

分组查询

group by + group_concat ; 使用group_concat(字段) 来放置每一组的某字段的值的集合
group by + 聚合函数 ; 分组后对分组进行统计
group by + having ;

-havingwhere的区别

  • having是在分组后进行过滤
  • where 是在分组前对数据过滤
  • having后面可以使用分组函数(统计函数)
  • where后面不可以使用分组函数
  • where是对分组前的记录的条件,如果某行记录没有满足where字句的条件,那么这行记录不会参加分组,而having是对分组后数据的约束
//查询每个部门的部门名称和每个部门的工资和
select department,group_concat(name),sum(salary) from student group by department;

//查询每个部门的部门名称和每个部门的人数
select department,group_concat(name),count(*) from student group by department;

//查询每个部门的部门名称以及每个部门工资大于1500的人数
select department,group_concat(salary),count(*) from student where salary>1500 group by department;

//查询工资总和大于9000
select department,group_concat(salary),sum(salary) from student  
group by department having sum(salary)>9000;

//查询工资大于2000,工资总和大于9000的部门名称以及工资总和
select department,group_concat(salary),sum(salary) from student  where salary>2000 
group by department having sum(salary)>9000 order by sum(salary) desc;

sql书写顺序和执行顺序

  • 书写顺序 select from where group by having order by limit
  • 执行顺序 from where group by having select order by limit

数据的完整性

  • 什么是数据的完整性: 保证用户输入的数据保存到数据库中时正确的
  • 如何添加数据的完整性: 在创建表时添加约束
  • 完整性分类
    • 实体完整性
    • 域完整性
    • 引用完整性
实体完整性

什么是实体完整性:表中一行(一条记录)代表一个实体(entity)
实体完整性的作用:标识一行数据不重复,行级约束
约束类型
- 主键约束 primary key 每个表中要有一个主键,数据唯一且不为null
- 唯一约束 unique 指定列的数据不能重复,可以为空值
- 自动增长auto_increment 指定列的数据自动增长(即使删除数据,还是从删除数据的序号继续往下)

//创建表设置主键、自动增长、唯一约束
 create table user(
      id int PRIMARY KEY AUTO_INCREMENT,
      name varchar(50) UNIQUE
)
//如果表已经存在
alter table user add constraint primary key(id)

多表关联创建

  • 拆分表的好处,避免大量冗余数据的出现
    两张表外键关联
    CONSTRAINT sc_st_fk FOREING KEY(sid) REFERENCES stu(id)
create table stu(
   id int PROMARY KEY,
   name varchar(50),
   age int
)
create table score(
   id int PROMARY KEY,
   sid int,
   CONSTRAINT sc_st_fk FOREING KEY(sid) REFERENCES stu(id)
)
//------------------------------------------------------------------------------
//老师表
create TABLE teach(tid int PRIMARY KEY,name varchar(50));
//学生表
create TABLE stu(sid int PRIMARY KEY,name varchar(50));
//老师和学生的关系表
create TABLE tea_stu_rel(id int,tid int,sid int);
//关系表添加外键
ALTER TABLE tea_stu_rel ADD CONSTRAINT FOREIGN KEY(tid) REFERENCES teach(tid);
ALTER TABLE tea_stu_rel add CONSTRAINT FOREIGN KEY(sid) REFERENCES stu(sid);

多表查询

  • 合并结果集
    UNION 合并时去除重复记录
    UNION ALL 合并时不去除重复记录
    注意事项:被合并的两个结果:列数和列类型必须相同
select * from a union select * from b;
select * from a union all select * from b;
  • 链接查询
    可以跨表查询,需要关联多个表进行查询
    根据连接方式分为:
    内连接:等值连接、非等值连接、自连接
    • 外链接包含:
      • 左外连接(左链接):左边表里边的数据全部查出来、右边表只查出符合条件的数据
      • 右外连接(右连接):同左连接相反
      • 多表连接
    • 自然连接:两张表必须有一个相同字段,查询的时候不用写where条件
//st 为stu表的别名 sc为score的别名
select * from stu st,score sc where st.id = sc.sid;//99 查询
//--------------内链接---------------------------------------
//内链接查询 (INNER 可以省略不写)
select * from stu st [INNER] JOIN score sc ON st.id = sc.sid;
select * from stu st [INNER] JOIN score sc ON st.id = sc.sid where sc.score >60;

//--------------外链接---------------------------------------

//左外链接  (左边表的数据全部查出来,右边值查询满足条件的) 如要查询所有学生的成绩表 可能有的学生缺考
select * from stu st LEFT [OUTER] JOIN score sc ON st.id = sc.sid;
//右外链接  与左链接相反
select * from stu st RIGHT JOIN score sc ON st.id = sc.sid;

//---------------------------多表查询------------------------
///三表查
select st.name,sc.score,c.name from stu st,score sc course c
where st.id = sc.sid  and sc.cid=c.cid;  //99查询

//连接查询
select st.name,sc.score,c.name from stu 
join score sc ON st.id = sc.sid
join course c ON sc.cid=c.cid;

//---------------------------练习------------------------
//查询所有员工的姓名,工资,所在部门的名称以及工资的等级
 // 99查询发
select e.name,e.salary,d.dname,g.grade FROM emp e,dept d,salgrade g
where e.deptno=d.depton
AND e.salary>=g.lowSalary and e.salary<=g.heighSalary;

select e.name,e.salary,d.dname,g.grade FROM emp e,dept d,salgrade g
where e.deptno=d.depton
AND e.salary BETWEEN g.lowSalary and g.heighSalary;

//非等值查询
select e.name,e.salary,d.dname,g.grade FROM emp e
JOIN dept d ON e.deptno=d.depton
JOIN salgrade g ON e.salary BETWEEN g.lowSalary and g.heighSalary;

筛选返回指定字段 表名.字段名 逗号隔开

select st.name,st.age,sc.score,sc.courseName  from stu st [INNER] JOIN score sc ON st.id = sc.sid;
  • 子查询
    • 什么是子查询
      一个 select语句中包含另一个完整的select语句。或两个以上select,
    • 子查询出现的位置
      where后,把select查询出来的结果当做另一个select的条件值
      from后,把查询出的结果集当做一个新表

子查询


//from后,把查询出的结果集当做一个新表
select ename FROM
(select ename,salary,deptno FROM emp WHERE deptno=30) s
WHERE s.salary>2000;

//查询工资高于程咬金的员工
select ename,salary from  emp 
WHERE salary >(select salary from erp WHERE ename='程咬金');

//工资高于30号部门所有人的员工信息
select ename,salary from  emp 
WHERE salary> (select MAX(salary) from erp WHERE deptno=30);

//查询工作和工资与程咬金完全相同的员工信息
select * from emp
WHERE (job,salary)
in (SELECT job,select FROM emp WHERE emp WHERE ename='程咬金');

//有两个以上直接下属的员工信息
selectt * from emp where 
empno in (select mgr from emp GROUP BY mgr HAVING COUNT(mgr)>=2)

结果集

通过 查询语句查询出来的额数据以表的形式展示我们称这个表为虚拟的结果集。存放在内存中
查询返回的结果集就是一张虚拟表

事务

什么是事务

不可分割的操作,假设改操作有ABCD四个步骤组成
每条sql语句都是一个事务
事务只对MDL语句有效,对DQL无效

事务的ACID

原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
一致性
隔离性
持久性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,801评论 5 116
  • Mysql 基础 SQL分类: DDL—数据定义语言(create,alter,drop)DML—数据操纵语言(s...
    零一间阅读 5,211评论 0 10
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,292评论 0 9
  • 一:查看/数据库、表结构等 1:show databases查看所有数据库 2:use [name]切换使用某个数...
    Mr丶陈阅读 403评论 0 1
  • 高铭玉阅读 233评论 0 1