# MySQL数据库
数据库
- 就是一个文件系统,访问数据的时候需要通过标准的SQL语言来完成。
- 关系型的数据库
- 保存的是实体(用户)与实体(商品,订单等)的关系。
ER模型图
常见的数据库
- Oracle 公司Oracle(甲骨文)数据产品,收费的大型数据库
- MySQL 开源,被Oracle收购,小型的数据库,5.x版本免费,6.x收费
- SQLServer 微软开发的,收费的中型数据库
- DB2 IBM公司的收费的大型的数据库
- SyBaSE(不用) PowerDigener软件(牛逼)
MySQL的卸载和安装
卸载
- 先到MySQL的安装路径,找到my.ini的配置文件,找到两个路径,basedir和datadir
- basedir=”D:/software/MySQL/MySQL Server 5.5/” 安装的路径
- datadir=”C:/ProgramData/MySQL/MySQL Server 5.5/Data/” MySQL存储数据的路径
- 然后卸载数据库,再找到上两个路径删除文件夹
MySQL服务器与数据和表的关系
- 所谓安装数据库服务器,只是在机器上安装一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员hi针对每一个应用创建一个数据库。
- 为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据
- 数据库服务器,数据库和表的关系如上图所示
Mysql无法启动的问题
- d:\software\xampp MySQL的安装路径
- 在xampp 中,mysql 无法启动的问题
- 解决方法:
- 在xampp 的安装文件中 找到 MySQL —> data —>ibdata1
- ibdata1就是用来存储文件的数据,在这里将其删掉
- 然后重启 xampp-control.exe
SQL 语句
SQL的简介
- Structured Query Language 结构化查询语言
- 非过程性语言
- 过程性语言:下一条语句,需要依赖上一条或者上几条语句
- 非过程性的语言:写一条语句,就会执行一个结果
- Oracle 开发PL/SQL ,只能在Oracle使用
- SQL,Server,Sybase 的T-SQL
SQL的分类
- DDL (数据定义语言)
- Data Definition Language
- 创建数据库,创建表
- DML (数据库操纵语言)
- Data Manipulation Language
- 插入数据(inset) ,修改数据(update),删除数据(delete)
- DCL(数据控制语言)
- Data Control Language
- 允许在数据库中完成编程,比如 存储结构,触发器等
- if …else while 等
- DQL(数据查询语言)
- Data Query Language
- 查询数据 select
数据库(CURD-增删改查)
创建数据库(database)
- 语法:
- create databese 数据名称;
- create database 数据库名称 character set 编码 collate 校对规则;
- 校对规则:和编码是成对出现的。
- 在Mysql参考手册第十章
- 作用:假如一个数据库有一万条数据,若需要对用户名进行排序,排序规则(笔画,拼音首字母等)是由校验规则决定的。如UTF-8的校验规则,底层有默认的一定的算法,排序就是根据算法执行的。
- 查看数据库 show databases;
--创建一个名称为mydb1的数据库
mysql> create Database mydb1;
Query OK, 1 row affected (0.03 sec)
--查看数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb1 |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.01 sec)
--创建一个名称为mydb2 编码方式为UTF-8 校验规则为默认的数据库
mysql> create database mydb2 character set 'utf8' ;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb1 |
| mydb2 |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
--创建一个名称为mydb3 编码方式为UTF-8 校验规则为utf8_bin的数据库
mysql> create database mydb3 character set 'utd8' collate 'utf8_bin';
查看,删除数据库
数据库的信息存储在本地的磁盘上,在目录data下有数据库的相关信息。
- 显示数据库语句
- show databases;
- 显示数据库定义信息
- show create database 数据库名称;
- 数据库删除语句
- drop database 数据库名称;
--查看mydb2的定义信息
mysql> show create database mydb2;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| mydb2 | CREATE DATABASE `mydb2` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
--删除数据库mydb1
mysql> drop database mydb1;
Query OK, 0 rows affected (0.06 sec)
修改数据库(编码集,校验规则)
- 语法:
- alter database 数据库名称 character set 编码 collate 校对规则;
- 切换数据库
- use 数据库名称;
- 查看当前使用的数据库
- select database();
--使用数据库mydb2
mysql> use mydb2;
Database changed
--显示当前正在使用的数据库信息
mysql> select database();
+------------+
| database() |
+------------+
| mydb2 |
+------------+
1 row in set (0.00 sec)
--将mydb2的编码方式改成GBK
mysql>alter database mydb2 character set 'gbk';
mysql> show create database mydb2;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| mydb2 | CREATE DATABASE `mydb2` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)
创建表(table)
注意:创建表前,要先使用 use 数据库名; 语句使用数据库。
- 语法:
create table 表名(
字段1 类型(长度) 约束,
字段2 类型(长度) 约束,
字段3 类型(长度) 约束,
字段4 类型(长度)约束
);- 注意:
- 表名小括号,后面要有分号
- 每一行字段后面要有逗号,但是最后一行后面没有逗号
- 数据的类型后面有长度,如果是字符串类型,长度必须加。如果其他类型长度可不加,默认长度。int 默认长度是11.
public class User{
int id;
String name;
String pass;
String email;
}- 查看表 show tables;
- 查看表结构:desc 表名;
数据库中的数据类型
- 字符串型
- varchar (经常使用)长度是可变的
- name varchar(8);如果存入hello,长度自动变成5.但是,存入helloworld会报错
- char (不经常使用)长度不可变,效率高
- name char(8);存入hello,剩下3个长度,会用空格补全,长度超了(helloworld)会报错。
- 大数据类型(一般不用)
- blob 存二进制的文件
- text 字符
- 文件上传不是把文件保存在数据库中,文件内容保存在本地磁盘,文件的地址,名称等字符串保存在数据库中。
- 数值型
- tinyint(byte)
- smallint(short)
- int
- bigint(long)
- float
- double
- 逻辑型,对应Boolean
- bit(0或者1)
- 日期型
- date(只包含日期,没有时分秒)
- time(只包含时分秒)
- datetime(需要手动的录入时间)都包含时分秒日期
- timestamp (不传入数据,默认选择当前系统的时间)都包含时分秒日期
-- 创建表
mysql> create table employee(
id int,
name varchar(20),
gender varchar(10),
birthday date,
entry_date date,
job varchar(100),
salary double,
resume text
);
mysql> show tables;
+-----------------+
| Tables_in_mydb2 |
+-----------------+
| employee |
+-----------------+
1 row in set (0.00 sec)
约束
- 主键约束
- 标识标记该条记录 。通过pramary key 声明主键。(默认唯一,非空)
- 主键自动增长:auto_increment
- 数据库维护主键,自动增长。
- 删除主键:alter table tablename drop primary key;
- 唯一主键
- 值是唯一的。使用unique声明。
- 非空约束
- 值不能为空 not null
create table employee2(
id int primary key auto_increment,
name varchar(20) unique not null,
gender varchar(10) not null,
birthday date not null,
entry_date date not null,
job varchar(100),
salary double not null,
resume text not null
);
mysql> desc employee2;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | UNI | NULL | |
| gender | varchar(10) | NO | | NULL | |
| birthday | date | NO | | NULL | |
| entry_date | date | NO | | NULL | |
| job | varchar(100) | YES | | NULL | |
| salary | double | NO | | NULL | |
| resume | text | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
8 rows in set (0.01 sec)
其他表操作
- 数据表删除
- 语法:drop table 表名;
- 查看数据表结构
- desc 表名;查看表结构
- show tables;查看当前库内所有表名
- show create table 表名;查看建表语句和字符集
修改表
常用alter table 语句追加,修改,或者删除列的语法。
- 添加字段
- alter table 表名 add 字段 类型(长度)约束
- 删除字段
- alter table 表名 drop 字段
- 修改字段的类型或者约束
- alter table 表名 modify 字段 类型(长度) 约束
- 修改字段的名称
- alter table 表名 change 旧字段 新字段 (长度)约束
- 注意:此处 只改变字段名称,长度和约束和原来的一致,否则长度和约束也会发生改变。
- 修改表名
- rename table 表名 to 新表名
- 修改字符集
- alter table 表名 character set utf8;
--在员工列表中添加一个image列
alter table employee2 add image varchar(10);
-- 修改name列,使其长度为60
alter table employee2 modify name varchar(60) ;
-- 删除
alter table employee2 drop age;
-- 表名修改为 employee
rename table employee2 to employee;
-- 修改表的字符集为utf-8
alter table employee character set utf8;
-- 列名name修改为username
alter table employee change name username varchar(11);
数据(CUSD-增删改查)
Insert语句(增加数据)
使用insert语句向表中插入数据
- insert into 表名 (字段1,字段2,字段3…) values(值1,值2,值3…);
有几列就插入多少的值- insert into 表名 values (值1,值2,值3…);
插入所有列- 注意:
- 数据与字段的数据类型相同
- 数据的大小应在列的规定范围内,字符长度需要控制(在前台或者后台编写程序时进行控制)。例如;不能将一个长度为80的字符串加入到长度为40的列中。
- 在values中列出的数据位置必须与被加入的列的排列位置相对应
- 字符串或者日期类型应包含在单引号中
- 插入j空值:不指定或insert into table values(null)
- 查看插入数据后的表
- select * from 表名;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username3 | varchar(8) | YES | UNI | NULL | |
| gender | varchar(10) | NO | | NULL | |
| birthday | date | NO | | NULL | |
| entry_date | date | NO | | NULL | |
| job | varchar(60) | YES | | NULL | |
| salary | double | NO | | NULL | |
| resume | text | NO | | NULL | |
| image | varchar(10) | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
--插入数据
mysql> insert into employee2 values (1,'xiag','nv','1992-09-05','2019-01-23','java',17890.0,'aaa','xiao');
--查看插入数据后的表
mysql> select * from employee2;
+----+-----------+--------+------------+------------+------+--------+--------+--
-----+
| id | username3 | gender | birthday | entry_date | job | salary | resume | i
mage |
+----+-----------+--------+------------+------------+------+--------+--------+--
-----+
| 1 | xiag | nv | 1992-09-05 | 2019-01-23 | java | 17890 | aaa | x
iao |
+----+-----------+--------+------------+------------+------+--------+--------+--
-----+
1 row in set (0.00 sec)
中文乱码 (设置GBK)
解决方法
- 在MySQL 安装路径 找到 my.ini client 编码设置成GBK
[client]
port =3306;
[mysql]
default-character-set-gbk- 注意 : 只修改客户端的编码 不修改服务器端的
然后 重新启动服务 命令行 services.msc 重启MySQL 的服务
MySQL有六处使用了字符集,分别是:cilent,connection,databaes,results,server,system.
- client 是客户端使用的字符集
- connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。
- database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装说指定的字符集设置。
- results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
- server是服务器安装时指定的默认字符集设定。
- System是数据库系统使用的字符集设定(UTF-8不可修改)
Update语句(更新数据)
- 语法:
- update 表名 set 字段=值,字段=值…[where]
- 如果没有where条件,默认更新所有的记录。
- 有where提交,选择修改某一行记录。
--将xiasoming 的年纪改为34 工作改为 C++
update employee set age=34,job='c++' where username='xiasoming';
--将 xig 的年纪 改为 25
update employee set age=25 where username='xig';
--将所有人的年纪改为 30
update employee set age=30;
--将所有人的年纪在原来的基础上 增加 5 岁
update employee set age =age +5 ;
--将 xig 的年纪在原来的基础上减掉8岁
update employee set age =age -8 where username='xig';
Delete语句(删除数据)
- 删除的是数据 不是 表
- 语法:
- delete from 表名 [where];
- 注意 事项
- 如果不使用 where 将删除表中所有的数据
- delete 语句不能删除某一列的值(update)
- 使用delete 语句仅删除记录 ,不删除表本身。如果要删除表,使用drop table 语句
- 同insert和update一样,从一个表中删除记录将引起其他表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。外键约束
- 删除表中数据也可使用turncate table 语句,它和delete有所不同。
- truncate 表名 :删除所有数据
- truncate 与delete的区别:
- truncate 删除数据,先删除整个表,再创建一个新的空的表(效率高)
- delete 一条一条的删除(常用)
事物,通过一个事物,在事物的里面可以对其数据进行回滚,例如删除一行记录,如果事物没有提交的话,可以通过某种方式将数据再找回来,而事物只支持(insert update delete )三种语句
mysql> delete from employee2 where name='nihao';
Query OK, 1 row affected (0.03 sec)
mysql> select * from employee2;
+----+----------+-----+------------+
| id | name | age | birthday |
+----+----------+-----+------------+
| 2 | xiaomei | 13 | 1889-01-13 |
| 3 | xiaogang | 14 | 1987-02-23 |
+----+----------+-----+------------+
2 rows in set (0.00 sec)
delete from 表名 ;
删除表中所有数据:
truncate 表名 ;
Select语句(查找数据 DQL)
- 语法:
- select * from 表名 ; 查询所有(字段)(列)
- select 字段1,字段2,字段3 from 表名 ;(列)
- select DISTONCT 字段名 from 表名 ; 去除重复的数据
distinct 是关键字
--查询表中的id name字段信息
mysql> select id,name from employee2;
+----+----------+
| id | name |
+----+----------+
| 2 | xiaomei |
| 3 | xiaogang |
+----+----------+
--查询表中所有的信息
mysql> select * from employee2;
+----+----------+-----+------------+
| id | name | age | birthday |
+----+----------+-----+------------+
| 2 | xiaomei | 13 | 1889-01-13 |
| 3 | xiaogang | 13 | 1987-02-23 |
+----+----------+-----+------------+
2 rows in set (0.00 sec)
--去除年龄中重复的数据
mysql> select distinct age from employee2;
+-----+
| age |
+-----+
| 13 |
+-----+
查询的列可以运算
可以使用别名 : 使用 as 别名 并且 as 可以省略
--查询name,math+Chinaese+english的列的数据
mysql> select name,math+chinaese+english from stu;
+-----------+-----------------------+
| name | math+chainese+english |
+-----------+-----------------------+
| xiaoming | 154 |
| xiaohong | 204 |
| xiaomei | 134 |
| xiaohuang | 244 |
+-----------+-----------------------+
4 rows in set (0.00 sec)
--对总分起别名为sum
mysql> select name,(math+chainese+english) as sum from stu;
+-----------+-----+
| name | sum |
+-----------+-----+
| xiaoming | 154 |
| xiaohong | 204 |
| xiaomei | 134 |
| xiaohuang | 244 |
+-----------+-----+
4 rows in set (0.01 sec)
使用 where 条件 过滤
mysql> select * from where name='xiaoming';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manu
corresponds to your MySQL server version for the right syntax to use nea
name='xiaoming'' at line 1
mysql> select * from stu where name='xiaoming';
+----+----------+------+----------+---------+
| id | name | math | chainese | english |
+----+----------+------+----------+---------+
| 1 | xiaoming | 39 | 37 | 78 |
+----+----------+------+----------+---------+
1 row in set (0.00 sec)
mysql> select name,english from stu where english >60;
+-----------+---------+
| name | english |
+-----------+---------+
| xiaoming | 78 |
| xiaohong | 78 |
| xiaohuang | 88 |
+-----------+---------+
3 rows in set (0.00 sec)
mysql> select name,(math+english+chainese) as sum from stu where sum >15
ERROR 1054 (42S22): Unknown column 'sum' in 'where clause'
-- 别名使用报错,资料待查
mysql> select name,(math+english+chainese) as sum from stu where (math+e
hainese) >150;
+-----------+-----+
| name | sum |
+-----------+-----+
| xiaoming | 154 |
| xiaohong | 204 |
| xiaohuang | 244 |
+-----------+-----+
3 rows in set (0.00 sec)
常用的符号
- < > <= >= = <>(不等于)
格式 | 解释 |
---|---|
is null | 判断是否为空 |
and | 并且 |
or | 或者 |
not | 非 |
in | 范围内取内容 |
- 模糊查询 :like
- 写法 : like ‘张_或者%’
- _ 和 % 的区别 :
- 占位符 _ 只占一个
- % 可以有多个
举例
--查询英语成绩在80 和90 之间的
select * from stu where english>80 and english <90;
select name,english from stu where english>80 and english <90;
select name,english from stu where english between 80 and 90;
-- 查询英语成语是78 28 88 的
-- 查询姓‘xiao’的
select * from stu where name like 'xiao%';
--查询数学高于70 并且语文高于60 的
select * from stu where math>70 and chainese >60;
使用 order by 字段 排序
- 语法:
- order by 字段 升序(asc)/降序(desc)
- 其中,升序是默认的
- 特别注意 : 出现在select 语句的最末尾
- 一条语句只能出现一次order by
-- 对数学的成绩排序(将序)后输出
select math from stu order by math asc;
select * from stu order by math desc;
select name,math from stu order by math desc;
-- 对英语进行降序排列 英语形同的 对数学进行 将序
select * from stu order by english desc , math desc ;
-- 对姓‘xiao ’的同学 ,成绩降序排列;
select * from stu where name like 'xiao%' order by math desc ;
聚集函数
名称 | 作用 |
---|---|
count | 获取(记录)数量 |
sum | 求和 |
avg | 平均值 |
max | 最大值 |
min | 最小值 |
-- 统计一个班级有多少学生
select count(*)from stu ;
-- 统计英语成绩高于 70 的人数
select count (* ) from stu where english >70;
-- 统计总分大于170的人数
select count (*) from stu where (math + english + chainese)>190;
-- 统计数学的总成绩
select sum(math) from stu ;
-- 语文数学英语各科的总成绩
select sum(math),sum(english),sum(chainese) from stu;
-- 统计数学语文英语成绩的总和
select sum(math+english+chainese) from stu ;
select sum(math)+sum(english)+sum(chainese) from stu;
注意 :
- sum 求和 (忽略null值) 可以同ifnull(XXX,0),如果XXX为空,则XXX被赋值为0
- 如果 有一个值 math =null, 将 math 赋值成 0;
- select sum(ifnull(math,0)+English +chainese)from stu ;
-- 数学成绩的平均分
select sum(math)/count(*) from stu;p
select avg(math) from stu;
-- 班级总分的平均分
select avg(ifnull(math,0)+ifnull(english,0)+ifnull(chainese,0)) from stu;
-- 数学的最高分
select max(math) from stu;
-- 数学的最低分
select min(math) from stu;
分组
- 语法:
- group by 分组(一起使用)
- 条件过滤需要时having ,不能是where
create table orders(
id int,
product varchar(20),
price float
);
insert into orders(id,product,price) values(1,'电视',900);
insert into orders(id,product,price) values(2,'洗衣机',100);
insert into orders(id,product,price) values(3,'洗衣粉',90);
insert into orders(id,product,price) values(4,'桔子',9);
insert into orders(id,product,price) values(5,'洗衣粉',90);
insert into orders(id,product,price) values(6,'电视',900);
-- 按照商品种类分组,显示每一类商品的总价和数量
select product,count(*),sum(price) from orders group by product;
-- 按照商品种类分组,条件是每个商品总价大于100
select product,sum(price) from orders group by product having sum(price)>100;
小结
- select语句
- s-f-g-h-o组合
- select …from… where…group by…having … order by
多表操作
有一个部门的表,还有一个员工表
create database work;
use work;
create table dep(
did int primary key auto_increment,
dname varvhar(20) not null
);
create table emp(
eid int primary key auto_increment,
ename varchar(20) not null,
edo int not null,
dno int
);
insert into dep values(null,'研发部');
insert into dep values(null,'销售部');
insert into dep values(null,'人事部');
insert into emp values(null,'小王',2900,2);
insert into emp values(null,'小美',3900,1);
insert into emp values(null,'小刚',4900,1);
insert into emp values(null,'小明',1900,3);
把 研发 部门 删除
- 研发部门下有人员,该操作不合理
- 引入外键约束
- 作用:保证 数据的完整性
定义外键约束
- 可以直接在create语句中定义外键
- foreign key 当前表名(字段名)references 目标表名(目标表的主键)
- 创建完语句后,可以直接使用修改语句定义
- alter table 表名 add foreign key 当前表名(字段名) references 目标表名(目标表的主键字段);
- 例句:alter table emp add foreign key emp(dno) references dept(did);
-- 外键添加成功,不能直接删除部门
mysql> delete from dep did =1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'did
1' at line 1
数据库的设计
多表设计中三种实体关系
1:N的联系可不引人关系表
- 例如:一个班级可以有多个学生,但是一个学生只能属于一个班级。或者部门与员工之间的关系。这些都是属于一对多的例子,
- 建表原则(都是在多方表中维护):
- 在多方表中添加一个字段,该字段的类型必须和主键的类型相同,把该字段作为外键,指向一方表的主键。
- 将关系的属性及非多方的主标识加入到多方表
- 多方表的外键是非多方实体的主标识
M: N 多对多的关系
- 学生可以选择多门课程,一门课程又可以被多名学生选择
- 建表原则:
拆开两个一对多的关系,中间创建一个中间表,至少有两个字段。作为外键指向两个多对多关系表的主键。
其中,学生课程表 的 sid 对应学生表的 sid 是 一对多的关系
学生课程表 的 cid 对应学生表的 cid 是 一对多的关系
一对一的联系不引入关系表(了解)
- 在生活中,一对一的应用比较少,因为完全可以作为一张表出现。但是有可能公司的业务原因,而需要设计一对一的表结构。
- 例如:公司 ,地址,一个公司对应的是一个地址 ,一张表中包含 公司名称,公司地址
- 根据公司的业务需求,会把公司这张表拆开,形成一对一
- 建表原则:
- 1第一种是主键对应
- 将两个表的主键进行关联
- 第二种是唯一外键对应
- 在任何一方加入一个外键,但是需要设置成唯一(unique),指向另一方的主键
简单的购物网站设计
- 假设模拟一个购物网站的表结构设计
- 购物的网站一般包含一些基本实体:例如用户、订单、商品、分类等
- 设计表结构首先需要分清楚各个实体之间的关系
- 用户可以产生多个订单
- 一个分类下可以有多个商品
- 一个订单可以有多个商品、一种商品可以在多个订单中
各实体的关系表示
多表的查询
笛卡尔积的概念:(了解)
aid | aname |
---|---|
a1 | aa1 |
a2 | aa2 |
bid | bname |
---|---|
b1 | bb1 |
b2 | bb2 |
b3 | bb3 |
-- 查询的语法
select * from 表A,表B;
-- 其返回结果就是笛卡尔积,其结果为:
a1 aa1 b1 bb1
a1 aa1 b2 bb2
a1 aa1 b3 bb3
a2 aa2 b1 bb1
a2 aa2 b2 bb2
a2 aa2 b3 bb3
多表查询分为内连接和外连接
内连接
- 内连接(用的比较多)
- 普通内连接
- 前提条件:需要有外键
- 提供关键字 inner join … on
- select * from 表1 inner join 表2 on 条件
- select * from dep inner join emp on dep.did=emp.don;
- 隐式内连接(用的最多)
- 可以不使用 inner join …on 关键字
- select * from 表1,表2 where 条件
- select * from dep,emp where dep.did=emp.don;
- 注意:
- 外键和内键的值不能同时为null,否则该记录的数据无法查询
外连接
- 左外连接(看左表,把左表所有的数据全部查询出来)
- 前提条件:需要有外键
- 语法: 使用关键字 left [outer] join…on
- select * from dep left outer join emp on dep.did=emp.don ;
- select * from dep left join emp on dep.did=emp.don;
- 右外连接(看右表,把右表所有的数据全部查询出来)
- 前提条件:需要有外键
- 提供关键字:right [outer] join …on
- select * from dep right outer join emp on dep.did=emp.don;
- select * from dep right join emp on dep.did=emp.don;
- select * from 左表 join 右表 on 左表.主键=右表.外键;
内连接查询出两个表的交集
左连接查询出左表的所有数据
右连接查询出右表的所有数据
子查询
- 查询的内容需要另一个查询的结果
- select * from emp where ename > (select * from emp where 条件);
- 子查询的运算符
< 小于 > 大于
<= 小于等于 >= 大于等于
=等于 <> 或 != 不等于 in(范围)- any (任意) 或者 all(全部)
- >any;大于子查询中的最小值
- >all;大于子查询中的最大值
- 语法:
- select * from table where 条件 > any (select * from table where 条件);
练习
-- 查看所有人所属的部门名称和员工名称
select * from dep,emp where dep.did=emp.don;
select dep.dname,emp.ename from dep,emp where dep.did=emp.don;
select * from dep,emp where dep.did=emp.don;
select d,e from dep d,emp e where d.did=e.don;
-- 统计每个的人数(按照部门名称统计,分组group by count)
select count(*) from dep,emp where dep.did=emp.don group by dep.dname;
select dep.dname,count(*) from dep,emp where dep.did=emp.don group by dep.dname;
-- 统计部门的平均工资(按部门名称统计,分组 group by avg)
select dep.dname,avg(salary) from dep,emp where dep.did=emp.don group by dep.dname;
-- 统计部门的平均工资大于公司平均工资的部门(子查询)
公司的平均工资
部门的平均工资
select dep.dname,avg(emp.salary) as sa from dep,emp where dep.did=emp.don group by dep.dname having sa> (select avg(salary) from emp);
-- 注意:在where条件中不支持使用别名,但是having条件中支持使用别名
删除已经编辑的数据库
在 MySQL 中 输入命令行 select @@datadir;
会输出 MySQL 的数据存储路径 如下
C:\ProgramData\Mysql Server 5.5 \Data\
然后在CMD窗口中,切换到以上目录
如下:
C:\Users\zst>D:
D:>cd D:\software\xampp\mysql\data\
D:\software\xampp\mysql\data>rd /s nihao
nihao, 是否确认(Y/N)?
输入命令 rd /s 数据库名 即可