show databases; --显示所有数据库;
use 数据库的名字 --使用某个数据库;
show tables; --显示指定数据库下的所有的表;
select * from 表名; --查看表中所有数据;
在mysql安装目录下cmd
mysql -u用户名 -p密码; --登陆数据库
mysql -uyf -p123456 --yf用户名 123456密码 与-u-p不用有空格
Navicat无法链接
错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL serve
错误1130:主机192.168.1.3”不允许连接到thismysql服务
原因:被连接的数据不允许使用 192.168.1.3访问,只允许是用 localhost;
解决办法:
可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改"mysql" 数据库里的 "user" 表里的 "host"项,从"localhost"改称"%"
1、启用 cmd
输入 : mysql -u -root -p
若是提示 ‘mysql’不是内部或外部命令,也不是可运行的程序.那需要配置环境变量 在配置 path 变量添加 “……mysq/MYSQL Server5.7in”
总体运行语句:
mysql -u root -p
mysql>use mysql;
mysql>select 'host' from user where user='root';
mysql>update user set host = '%' where user ='root';
mysql>flush privileges; --同步内存与磁盘中的用户权限
mysql>select 'host' from user where user='root';
运行完毕后再次连接测试,若还不行重启mysql服务,或是直接重启电脑
数据库介绍
二、sql语言
特点:
对大小写不敏感,每句结尾要使用分号。
分类 :
DDL:数据定义语言(数据库对象的操作(结构))(Data Definition Language 数据定义语言)
数据库对象:数据库、表、视图、索引等
create 创建/ alter修改 / drop销毁 对于database只能create或drop
1.Alter是数据定义语言(Data difinition Language),在修改表的结构时,不需要Commit和Rollback。
2.Update是数据数据操作语言(Data manipulation Language),在修改数据值时,需要Commit和Rollback,否则提交的结构无效
DML:数据操纵语言(对数据库对象中的数据的操作 增删改查)
insert增加 /delete删除 / update修改 / select查找
DCL:数据控制语言(授权 取消授权)(Data Control Language 数据控制语句)
grant / revoke
TCL:事务控制语言(对事务的控制)transaction
commit / rollback(回滚)
三、DDL数据定义语言(Data Manipulation Language 数据操控语言)
1、数据库 database
创建数据库:create database 数据库名;
销毁数据库:drop database 数据库名;
create database huace1;
drop database huace1;
2、表 table
1)创建表
语法:
create table 表名(
字段1 类型 [约束],
字段2 类型 [约束],
........
);
#表
create table userinfo(
username varchar(20), #字段 数据类型
pwd varchar(50),
tel varchar(15),
email varchar(20)
);
2)删除表
语法:drop table 表名;
drop table student;
3)修改表
表中字段进行添加 add、删除 drop、修改change/modify的操作
语法:alter table 表名 add | change/modify | drop 字段名 类型 约束;
alter table userinfo add `status` int; --1左边的反引号
alter table userinfo drop email;
alter table userinfo change username login_name varchar(20);
alter table userinfo modify pwd varchar(16); #modify不可以用来修改字段名
alter table userinfo change pwd pwd int; --change改数据类型需要两个列名,第二个名字是新名字且必须有
alter table userinfo change pwd my_pwd varchar(16); #同时修改字段名和数据类型
alter table userinfo modify `status` int first; --修改列的位置,放到第一位
alter table userinfo modify `status` int after login_name; --修改列的位置,放到login_name的后面
3、数据类型
主要是用来限制输入的内容
数值类型、字符串类型、日期类型、其他类型
1)数值类型:int 整数 float 浮点数 double 浮点数 decimal 浮点数
float(10,2) double(16,4) decimal(自定义整数位,自定义小数位) 一定要声明长度和精度
2)字符串类型:char(n) 定长长度 varchar(n) 不定长长度
name char(10) name varchar(10)
张三 张三
3)日期类型:date(年月日)、time(时分秒)、datetime(年月日)、timestamp(年月日)、year(年)等
学生表(id int,name varchar(10),money float,in_date date)
create table student(
id int,
name varchar(10),
money float,
in_date date
)
练习题:
1) 创建用户表(user)
字段 类型 长度
uid int
uname varchar 20
password varchar 20
birthday date
2) 向用户表中追加字段email,varchar类型,长度20
3) 向用户表最前面添加字段status,int类型
4) 向用户表password字段后面添加sage,int类型
5) 修改sage的名称为age
6) 修改password字段的长度为50
7) 修改status到email之后的位置
8) 删除字段status
9) 修改表的名称为userinfo
10) 清空数据库表
11) 销毁数据库表user
四、数据完整性约束
实体完整性、域完整性、引用完整性、自定义完整性
1、实体完整性
主键约束、唯一约束、主键自增
1)主键约束
特点:唯一的,不能为空
关键字:primary key
添加约束语法:alter table 表名 add constraint 约束名 primary key(字段名);
约束名:PK_字段
删除约束语法:alter table 表名 drop primary key;
规定:在每一个表中有且只有一个主键约束
create table student(
id int primary key,
name varchar(20),
age int
)
alter table userinfo add uid int;
#表已经创建好了,如何添加主键约束
#alter table 表名 add constraint 约束名 primary key(字段名);
#约束名:PK_字段
alter table userinfo add constraint PK_uid primary key(uid);
#删除约束
#alter table 表名 drop primary key;
alter table userinfo drop primary key;
2)唯一约束
特点:不能重复,可以为空,可以添加多个
关键字:unique
添加约束语法:alter table 表名 add constraint 约束名 unique(字段名);
约束名:UQ_字段
删除约束语法:alter table 表名 drop key 约束名;
create table student(
id int primary key,
name varchar(20),
age int,
id_card varchar(20) unique
)
alter table userinfo add constraint UQ_login_name unique(login_name);
alter table userinfo drop key UQ_login_name;
3)主键自增
特点:从1开始,每次自身加1(在oracle中不能使用)
关键字: auto_increment
只能在创建表的时候添加主键自增的约束,而且必须是主键才可以添加
create table student(
id int primary key auto_increment,
name varchar(20),
age int,
id_card varchar(20) unique
)
-- 删除主键自增约束
-- 1:去除自增性
alter table student modify id int;
-- 2:删除主键约束
alter table student drop primary key;
2、域完整性
域完整性约束保证字段的数据准确的
域完整性包括类型约束、非空约束、默认值
域完整性只能在创建表的时候添加
1)非空约束
特点:字段不允许为空
关键字: not null
2)默认值
特点:设置默认的值
关键字: default
create table student(
id int primary key auto_increment,
name varchar(20) not null,
age int not null,
sex char(2) default '男',
id_card varchar(20) unique
)
3、引用完整性
一张表中通用列的取值必须参考另外一张表的主键
引用完整性有外键约束
1)外键约束
特点:设置外键的字段的取值只能参考另一张表中同一个字段的值
关键字: foreign key
添加外键约束的语法:alter table 表名1 add constraint 约束名 foreign key(字段名) references 表名2(字段名)
删除外键的语法:alter table 表名 drop foreign key 约束名;
注意:
1、主外键关联
2、外键关联字段名称可以不一样,但是类型必须一致
--外键约束
create table student(
id int primary key auto_increment,
name varchar(20) not null,
age int not null,
sex char(2) default '男',
id_card varchar(20) unique,
class_id int #添加外键约束
)
create table classroom(
class_id int PRIMARY key,
class_name varchar(20)
)
-- 添加外键约束的语法:alter table 表名1 add constraint 约束名 foreign key(字段名) references 表名2(字段名)
-- 约束名 FK_字段名
alter table student add constraint FK_class_id foreign key(class_id) references classroom(class_id);
-- 删除外键的语法:alter table 表名 drop foreign key 约束名;
alter table student drop foreign key FK_class_id;
HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
DML:数据操纵语言 表中的数据进行操作的语言
增加数据 insert
删除数据 delete
修改数据 update
查找数据 select 最高的使用频率
一、DML数据操纵语言
数据操纵语言是对数据库对象中数据的操作,比如对数据进行增加、删除、修改和查询等操作
关键字:insert / delete / update / select
1:插入数据
语法:insert into 表名[(字段名….)] values(值….)
varchar类型的必须要有单引号
添加一整行
INSERT INTO classroom VALUES(8,'php');
只添加一行的某一个数据
INSERT INTO classroom (class_id) VALUES (9);
批量插入(注意用逗号隔开)
INSERT INTO classroom VALUES(10,'go'),(11,'linux');
复制整表数据,两表解构必须相同
INSERT INTO classroom1 SELECT * FROM classroom;
#添加数据到classroom
#给所有字段添加值,和表中字段顺序一致
#给cname字段添加值,和指定字段的顺序必须一致
#添加3条记录(批量插入)
#将classroom的值整体复制到classroom1
#查看表的所有记录
2:删除数据
语法:delete from 表名 [where 条件]
#删除classroom中的一条数据
DELETE FROM classroom WHERE class_id='11';
#删除classroom中的所有数据
#truncate清空表的数据
语法:truncate table 表名;
注意:delete与truncate的区别是什么
1:delete是逐行删除,truncate是文件级别的清空
2:delete删除后,自增性会继续执行,不会重置
truncate删除后,自增性重置
3:更改数据
语法:update 表名 set 字段=新值… [where 条件]
#修改classroom中的一条数据
#修改classroom中的所有数据
4:查询数据
查询的完整语法:
select 字段|表达式 from 表名|视图|结果集
[where 条件]
[group by 分组]
[having 分组之后进行检索]
[order by 排序]
[limit 限制结果]
distance 去除重复
like 模糊查询
查询所有信息
查看部分信息
#查看所有员工的姓名和工资
#员工工资提升5%之后的员工姓名和工资 --算术运算
范围查询
#查询工资大于2000的员工信息 --比较运算
#查询工资在1000-2000之间的员工信息(范围查询) --比较+逻辑运算
集合查询
#查询员工编号为7521,7369,7788的员工信息(集合查询)
取别名
#字段,表达式,结果集,表都可以起别名
去重查询
SELECT DISTINCT job from emp;
#查询所有的职位信息 去重
模糊查询
#查询名字以s开头的员工信息
select * from emp
#查询名字中包含s的员工信息
SELECT * FROM emp WHERE ename like '%s%';
#查询第二字符为L的所有员工信息
SELECT * FROM emp WHERE ename like '_L%';
排序
#对所有员工的工资进行排序 升序和降序
SELECT * FROM emp ORDER BY sal asc;
SELECT * FROM emp ORDER BY sal desc;
#根据员工的工资降序排,如果工资一致,则按照员工编号降序排列
SELECT * FROM emp ORDER BY sal desc , empno desc;
限制结果集显示
#查询在10号部门工资最高的员工信息
SELECT * FROM emp WHERE deptno=10 ORDER BY sal desc LIMIT 0,1;
注:最后的0表示从第0位开始取数,取1个值。
为空/非空数据查询与操作
#查询所有有奖金的员工信息
SELECT * FROM emp where comm IS NOT NULL;
#将奖金小于500的员工奖金加100元
方法1:
UPDATE emp SET comm=0 WHERE comm IS NULL; --先将控制变为0
UPDATE emp SET comm=comm-100 where comm<500 or comm IS NULL;
方法2:
UPDATE emp set comm=ifnull(comm,0)+100 WHERE comm<500 or comm IS NULL;
练习;
1. 查询工资提升100元后超过2000的所有员工信息
2. 查询工资在1000-2000之间的10号部门的最高工资的员工信息
3. 将所有工资低于2000的员工工资提升5%
4. 查询名字包含s的并且在20号部门的员工信息
5. 查询工资大于1000的10号部门的前5条记录
6. 将奖金小于500的员工奖金加100元
二、SQL运算符
算数运算符、比较运算符、逻辑运算符
1:算数运算符
+、-、*、/、div、%、 mod
select 10/3; #3.3333 / 会保留小数
select 10 div 3; #3 div 整除(只会取整个结果的整数部分)
select 10 % 3; #1 % 取模 取余(取结果的余数)
select 10 mod 3; #1 mod 取模 取余
2:比较运算符
>、<、>=、<=、=、!=、is null / is not null / between..and / in / not in
返回结果永远都是布尔类型的值(true/false)
3:逻辑运算符
and 、or、!
select 1<0 and 2>1; #0 0==>False
select 1<0 or 2>1; #1 1==>True
select !(1<0);#1 1==>True
三、SQL关联查询
05 Mysql之高级查询
一、函数&分组查询
1、函数
Mysql已经定义好的,可以实现一定功能的代码块
日期函数、数字函数、字符函数、聚合函数
聚合函数:聚合函数对整体进行运算,通常返回的结果只有一个
min() max() avg() count() sum()
SELECT MIN(sal) FROM emp WHERE deptno=10;
SELECT MAX(sal) FROM emp WHERE deptno=20;
SELECT AVG(sal) FROM emp WHERE deptno=30;
SELECT COUNT(comm) from emp; --统计非空数量
SELECT empno,MONTH(hiredate) FROM emp; --取到所有的月份
SELECT * FROM emp WHERE MONTH(hiredate)=2; --取hiredate为2月的所有人。
SELECT sum(sal) FROM emp WHERE MONTH(hiredate)=2; --取2月并求和
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno; --按部门计算平均工资,GROUP BY后的列名一般直接写在SELECT后面;
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal)>2000; --计算平均工资大于2000的部门平均工资;
分组查询
--where 条件筛选 ,where后不可接聚合函数min() max() avg() count() sum()
--having 条件筛选,having只能跟在group by的后面, 且having后面可以接聚合函数
二、SQL关联查询
1、什么叫关联查询
关联查询又叫做连接查询,常见的连接查询可分为:内连接、外连接、自连接
1:内连接
关键字:inner join ... on
内连接没有主从表之分
作用:组合两个表中的记录,返回关键字短相符的记录,也就是返回两个表的交集部分。
#查询员工编号(empno)为7788的员工姓名(ename)和所在部门的名称(dname)
SELECT ename,dname FROM emp INNER JOIN dept on emp.deptno=dept.deptno and empno=7788;
SELECT ename,dname FROM emp INNER JOIN dept on emp第一个表的表明.deptno第一个表的关键列名=dept第二个表的表明.deptno第二个表的关键列名 and empno=7788;
2.外连接
左外链接
关键字:left [outer] join...on
作用:left join 是left outer join的简写,它的全称是左外链接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示复合搜索条件的记录。右表记录不足的地方均未NULL
SELECT * FROM dept LEFT JOIN emp ON dept.deptno=emp.deptno; --前边的dept为主表,后面的emp为从表
右外链接:前边的dept为主表,后面的emp为从表
SELECT * FROM emp RIGHT JOIN dept ON dept.deptno=emp.deptno;
3:自连接
SELECT e.ename,p.ename FROM emp e INNER JOIN emp p ON e.mgr=p.empno;
--把一张emp表当成两张表,emp e中e是第一张表的别名,emp p中p是第二张表的别名;
注意:如果本表中mgr列如果有null(老板没有上级)则不会显示,可尝试用左链接体现。
三、SQL子查询
嵌套查询,将一个查询结果当做另一个查询的条件或结果集。子查询最接近思考方式,最自然的查询。
分类:单行子查询,多行子查询
单行子查询:子查询的返回结果只有一条记录
SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE ename='SCOTT'); --查询与SCOTT在同一部门的所有记录
多行子查询:子查询的返回结果有多条记录
SELECT * FROM emp where sal IN (SELECT sal FROM emp WHERE deptno=20) AND deptno!=20;
--查询薪水和20号部门每个员工工资都相等且不在20号部门的员工信息
四:练习
1.大于20号部门的平均工资的20号部门的员工信息
2.查询大于所在部门平均工资的员工信息
3.查询工资大于20号部门员工工资的所有员工信息
4.薪水大于2000的员工所在部门的信息