mysql 數據庫操作

目录

 

一、mysql的基本組成

二、基本sql语句

添加约束

分页

三、多表查詢

多表查詢分類

1、 多表查询 (where子句多表查询,join子句多表查询)

2、连接查询

3、子查询(ANY子查询、IN子查询、SOME子查询、ALL子查询)

Mysql的基本函数

max():求最大值

min():求最小值

avg():求平均数

sum():求和

写得好吗?如果觉得还不错点个赞吧 ^_^


一、mysql的基本組成

二、基本sql语句

在创建表的时候给列起别名(comment)
#创建数据库exam2
CREATE DATABASE exam2;
#删除数据库exam2
DROP DATABASE exam2;
CREATE DATABASE exam2;
#切换到数据库exam2
USE exam2;
#创建表stu id自增,主键,   表的编码格式是utf8
CREATE TABLE stu(
id INT(1) AUTO_INCREMENT,
PRIMARY KEY (id)     #主键是id
) CHARSET utf8;
DROP TABLE stu; 
CREATE TABLE USER(
        uid INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(32),
        PASSWORD VARCHAR(32),
        sex ENUM('男','女') DEFAULT '女',  #枚举类型  性别默认是女
        address VARCHAR(32),
        hobby VARCHAR(32)
    );
  #例    sex是1代表男生    2代表女生(1和2表示枚举里面的第一位还是第二位)
INSERT INTO USER  (username,PASSWORD,sex,address,hobby)  VALUES  ('whd','123',2,'河北','打篮球');
INSERT INTO USER  (username,PASSWORD,sex,address,hobby)  VALUES  ('wangwu','8908',1,'南京','打乒乓求');
# 查询地址不在“北京”的用户信息    不等于的两种方式
SELECT * FROM USER WHERE address != '北京'
SELECT * FROM `user` WHERE address <> '北京'

添加约束

#将user表的did设置成外键  让他与dept表的did对应起来,让两张表之间有关系
ALTER TABLE USER ADD FOREIGN KEY(did) REFERENCES dept(did);
#添加完约束之后存在的问题:
#        1. 如果添加约束 外键添加的值在关联表中不存在报错,有约束问题。
#        2. 如果删除dept表的记录那么emp表中外键是不是也要被删除,这个时候需要使用级联删除。

limit操作


    #每页显示5天记录

    select * from user limit 0,5;


    #下一页                 (页数-1)*每页个数,每页个数
    select * from user limit 5,5

    首页
    select * from user limit 0,5;


    尾页
        查询总记录数     再除以每页条数 
#查询所有数据库的服务状态
SHOW STATUS;
#查询数据库版本号
SELECT VERSION();
#查询所有数据库
SHOW DATABASES;
#表格内容清空(一) 第一次清空后,再添加id会累加;  
DELETE FROM person;
#DELETE 加上where就可以指定删除(指定删除名字叫徐磊的表格内容)
DELETE FROM person WHERE u_name= '徐磊';
#表格内容清空(二) 第一次清空后,再添加id不会累加;  不能指定删除
TRUNCATE TABLE person;
#表格内容清空
TRUNCATE person;
#添加指定内容
INSERT INTO person SET id=15;
#添加内容 一               
INSERT INTO person VALUE(32,'张三','123');
#添加内容 二                                                                  insert語句不加into也可以
INSERT person VALUE(32,'李四','123');
#一次性添加多條記錄                                                     一次性添加多條信息采用VALUES(加 S )
INSERT  `bwuser`(id,NAME) VALUES(8,'22'),(9,'ttttt');
#显示运行结果
SELECT * FROM USER;
#查询用户信息,根据用户名去重。
SELECT DISTINCT username FROM USER;
在sal後面加一列叫addess的   (還有一個first,就是在某一列之前加一列屬性)

三、多表查詢

#提高演示的sql语句
USE exam2;
#部门表
CREATE TABLE dept ( 
did INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(100)
)
CHARSET utf8;
#员工表
CREATE TABLE emp (
did INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(100),
did INT
)
CHARSET utf8;

多表查詢分類

1、 多表查询 (where子句多表查询,join子句多表查询)

2、连接查询

 2.1、 内连接:inner join、join  
           inner join是比较运算符,只返回符合条件的行
#内连接的两种方法
SELECT * FROM `emp`,`dept` WHERE emp.`did`=dept.`did`
SELECT * FROM `emp` INNER JOIN `dept` ON emp.`did`=dept.`did`

 2.2、 右连接:right join 或right outer join
       包括右表所有的行,如果左表中某行在右表中没有匹配的,则结果中对应的左表的部分全部为null
 2.3、 左连接:left join 或 left outer join 
       左连接和右连接一样,包括左表中的所有行,如果右表中某行在左表中没有匹配,则结果中对应的右表的部分全部为null
 2.4、 完全连接  full join 或 union
        如果右表中某行在左表中没有匹配,那么右表的部分为空;
        如果左表中某行在右表中没有匹配,那么左表的部分为空。 
#mysql 4.0 之前可以使用  full join   on的格式进行完全连接
SELECT * FROM emp FULL JOIN dept ON emp.`did`=dept.`did`
#mysql 4.0 之后再进行完全连接的时候就需要  union all 或者是 union
#union all  展示两张表的所有信息

 SELECT * FROM `emp` LEFT JOIN dept ON emp.`did`=dept.`did`
 UNION ALL
 SELECT * FROM `emp` RIGHT JOIN dept ON emp.`did`=dept.`did`;

#union 查询出两张表之间不同的信息(如果有重复的信息,就只会显示一次)

 SELECT * FROM `emp` LEFT JOIN dept ON emp.`did`=dept.`did`
 UNION
 SELECT * FROM `emp` RIGHT JOIN dept ON emp.`did`=dept.`did`;

union   只显示不同的地方

union  all     展示全部信息

3、子查询(ANY子查询、IN子查询、SOME子查询、ALL子查询)

定义:子查询允许把一个查询嵌套在另一个查询当中。

子查询又叫做内部查询,相当于内部查询,包含内部查询的就称为外部查询。子查询的结果被主查询所使用。

注意的问题:

      1. 括号

       2. 可以在主查询的where select having from 后面,都可以使用子查询

       3. 不可以再group by/order by 后面使用子查询 

       4. 主查询和子查询可以不是同一张表;只有子查询返回的值,主查询可以使用即可。

       :查询部门名称是人力的员工信息

第一种方式:利用子查询 select * from emp where deptno=(select deptno from dept where dname='人力');

第二种方式:利用关联查询 select * from emp e,dept d where e.deptno=d.deptno and d.dname='人力'; SQL优化:尽量使用多表查询 绝大部分的子查询在最终执行的时候它都是转换成一个多表查询来执行的。 通过SQL执行计划可以看出来。 通过SQL执行计划会发现这两种方式执行的是一样的。

       5. from后面的子查询  子查询需要设置别名,不然会报错

       例:查询员工号 姓名 月薪 select * from (select empno,ename,sal from emp) emp2;      

             查询员工号 姓名 月薪 年薪 select * from (select empno,ename,sal,sal*12 from emp) emp2;

      6. 一般不在子查询中排序;

      7. 一般先执行子查询,再执行主查询。

3.1、ANY关键字  (or)

假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么,

select ...from ... where a > any(...);

-->

select ...from ... where a > result1 or a > result2 or a > result3;

需求:

    查询工资比1号部门任意一个员工高的信息

    select * from emp where sal > any (select sal from emp where deptno=1);

    select * from emp where sal > (select min(sal) from emp where deptno=1);   和上一句的效果一样

3.2、ALL关键字  (and)

ALL关键字与any关键字类似,只不过上面的or改成and。即:

select ...from ... where a > all(...);

select ...from ... where a > result1 and a > result2 and a > result3;

需求:

    查询工资比1号部门所有员工高的员工信息

    select * from emp where sal > all (select sal from emp where deptno=1);

    select * from emp where sal > (select max(sal) from emp where deptno=1);   和上一句的效果一样

3.3、SOME关键字   和any关键字是一样的功能  (or)

some关键字和any关键字是一样的功能。所以:

select ...from ... where a > some(...);

select ...from ... where a > result1 or a > result2 or a > result3;

3.4、IN关键字

IN运算符用于WHERE表达式中,以列表项的形式支持多个选择,语法如下:

WHERE column IN (value1,value2,...)

WHERE column NOT IN (value1,value2,...)

当 IN 前面加上 NOT运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。

案例:

    查询部门名称是人力和开发的员工

    select * from emp where deptno in (select deptno from dept d where d.dname='人力' or d.dname='开发' );

    查询不是老板的员工

    select * from emp where mgr is not null

Mysql的基本函数

max():求最大值

查询emp中薪水最高的人? select max(sal) from emp

min():求最小值

查询emp中薪水是多少? select min(sal) from emp

avg():求平均数

查询每个部门的平均薪资 select AVG(sal) from emp group by deptno

sum():求和

查询emp中员工的总工资 select sum(sal) from emp; count():求总记录数 查询员工数量 select count(*) from emp;

写得好吗?如果觉得还不错点个赞吧 ^_^

发布了50 篇原创文章 · 获赞 30 · 访问量 7058

猜你喜欢

转载自blog.csdn.net/qq_44472134/article/details/104101881