数据库操作(二)

数据库操作(二)

1.MySQL行(记录)操作

插入(增加)数据

1.插入完整数据
语法1:
    insert into 表名(字段1,字段2..字段n) values(值1,值2..值n);
    #字段和值要一一对应
语法2:
    insert into 表名 values(值1,值2..值n);
    #表名后不定义列名,则按顺序给所有列添加值

2.指定字段插入数据
语法:
    insert into 表名(字段1,字段2..) values(值1,值2..)

3.插入多条记录
语法:
    insert into 表名 values
        (值1,值2,值3...值n),
        (值1,值2,值3...值n),
        (值1,值2,值3...值n);    #插入多条记录用逗号分隔

4.插入查询结果
语法:
    insert into 表名(字段1,字段2..字段n)
            select (字段1,字段2..字段n) from 表2
            where 条件;
#将从表2中查询的结果插入到表中,查询数据要和指定的字段对应好

5.增加字段
语法:
    alter table 表名
        add 字段名 数据类型 约束条件,
        add 字段名 数据类型 约束条件;    #增加记录

    alter table 表名
        add 字段名 数据类型 约束条件 first; #增加记录到第一个位置

    alter table 表名
        add 字段名1 数据类型 约束条件 after 字段名2;
          #将字段1添加到字段2后面

更新(修改)数据

语法:
    update 表名 set
        字段1 = 值1,
        字段2 = 值2,
        where 条件;
#如果不加任何条件,则会将表中所有记录全部修改

    alter table 表名
        modify 字段名 数据类型 约束条件;

    alter table 表名
        change 旧字段名 新字段名 新数据类型 新约束条件;
        #在更改时不更改数据类型和约束条件则继续写上原来的

删除数据

语法:
    delete from 表名 where 条件;
    #如果不加条件,则删除表中所有记录
    delete from 表名;
    #删除所有记录,有多少条记录就执行多少次删除操作 --不推荐
    truncate table 表名;
    #删除表后在创建一张相同的空表 --推荐

    alter table 表名 drop 字段名;
    #删除字段
针对外键关系补充

删除或修改被关联字段:
    1.查看外键关系名称:
        show create table 表1;
        # 可以查看到系统命名的外键名称
    2.删除外键关系
        alter table 表1 drop foreign key 外键名称;
    3.删除字段:
        alter table 表2 drop 字段名;
    4.添加字段:
        alter table 表2 add 字段名 数据类型 约束条件;
    5.创建表完成后添加外键关系:
        alter table 表1 add foreign key(表1字段) references 表2(表2被关联字段);

创建外键时指定外键名称:
    create table 表名(字段1 类型,
                     字段2 类型,
                     字段3 类型,
                    constraint 指定的外键名称 foreign key(表1字段) references 表2(表2被关联字段);

查询数据

-单表查询

单表查询语法

查询数据的本质:mysql到本地硬盘找到对应文件,然后打开文件,按照给出的查询条件查找需要的数据

语法:
    select * from 表名;  #查询表中所有记录

    select distinct 字段1,字段2...from 库名.表名
        where 条件    #从表中找符合条件的数据记录
        group by 字段 #分组
        having       #筛选,过滤执行select后的字段
        order by     #将结果按后面的字段进行排序
        limit        #限制查询出来的数据记录的条数

关键字的执行优先级

关键字的执行优先级
from
where
group by
having
select distinct
order by
limit

1.找到表:from
2.使用where指定的约束条件,到文件/表中取出一条条记录
3.将取出的记录进行分组group by,如果没有group by,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.去重
7.将结果按条件排序:order by
8.限制结果的显示条数

简单查询

通过创建一个员工表employee,来进行查询
company.employee
    员工id      id                  int
    姓名        emp_name            varchar
    性别        sex                 enum
    年龄        age                 int
    入职日期     hire_date           date
    岗位        post                varchar
    职位描述     post_comment        varchar
    薪水        salary              double
    办公室       office              int
    部门编号     depart_id           int

创建表

create table employee(
    id int not null unique auto_increment,
    name varchar(20) not null,
    sex enum('male','female') not null default 'male',
    age int(3) unsigned not null default 28,
    hire_date date not null,
    post varchar(50),
    post_comment varchar(100),
    salary double(15,2),
    office int, #一个部门一个房间
    depart_id int
);

插入记录

#三个部门:教学,销售,运营
insert into employee(name,sex,age,hire_date,post,salary,office,depart_id) values
('egon','male',18,'20170301','老男孩驻沙河办事处外交大使',7300.33,401,1),
('alex','male',78,'20150302','teacher',1000000.31,401,1),
('wupeiqi','male',81,'20130305','teacher',8300,401,1),
('yuanhao','male',73,'20140701','teacher',3500,401,1),
('liwenzhou','male',28,'20121101','teacher',2100,401,1),
('jingliyang','female',18,'20110211','teacher',9000,401,1),
('jinxin','male',18,'19000301','teacher',30000,401,1),
('成龙','male',48,'20101111','teacher',10000,401,1),

('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('丁丁','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2),

('张野','male',28,'20160311','operation',10000.13,403,3),
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);

查询操作

1.查询所有记录
select * from employee;

select id,name,sex,age,hire_date,post,post_comment,salary,office,depart_id from employee;

通过四则运算查询(+,-,*,/)
select salary*12 from employee;

自定义显示格式
#concat()函数用于连接字符串
#concat_ws()第一个参数作为分割符来进行字符串拼接
select concat('姓名:',name,'月薪:'salary) from employee;

select concat_ws(':',name,salary) from empolyee;
#用冒号将name和salary连接起来

2.where条件
① 比较运算符: >  <  >=  <=  !=等同于<>
select name from employee where post = 'sale';

② between..and.. #写的是一个闭区间
select * from employee where id between 10 and 15;

③ in(集合)
select * from employee where id in(1,3,6); #查找满足集合内条件的记录

④ like 关键字模糊查询
通配符 % #匹配所有任意字符
select * from employee where name like "wu%";

通配符 _ #匹配任意一个字符
select * from employee where name like 'al__';

⑤ and or not 逻辑运算符
select * from employee where id>10 and name like "al%";
select * from employee where not id>10;

⑥ is null
select name,post_comment from employee where post_comment is null;
#判断某个字段是否为null只能用is

3.分组查询(group by)
分组:将所有记录按照某个相同字段进行归类,比如按照性别进行分组等.分组发生在where之后,即分组时基于where之后得到的记录而进行的
group by一般会与聚合函数一起使用

select post,max(salary) from employee group by post;
#统计每个岗位的名称以及最高工资

分组时可以跟多个条件,那么多个条件同时重复才算是一组,多条件用逗号分隔

only_full_group_by模式
如果设置了这个模式,那么select后面只能写group by后面的分组字段和聚合函数统计结果

聚合函数:将一列数据作为一个整体,进行纵向的计算
    count:计算个数 (一般选择非空的列:主键)
    max:计算最大值
    min:计算最小值
    sum:求和
    avg:计算平均值
#使用设置了unique约束的字段分组,则分组无意义,多个记录之间的某个字段值相同,该字段通常作为分组的依据

4.having 分组后再过滤
select post,max(salary) from employee group by post having max(salary) > 20000;

#where和having的区别:
#1.where在分组之前进行限定,如果不满足条件,则不参与分组
#  having在分组之后进行限定,如果不满足条件,则不会被查询出来
#2.where后面不可以跟聚合函数,having可以进行聚合函数的判断

5.去除重复(distinct):
 select distinct post from employee;

#注意:select的字段必须卸载distinct的后面,如果写了多个字段,比如:
 select post,id from employee;
    #结果并没去重,post和id两个组合在一起同时重复的才算做重复数据

6.order by 排序
select * from employee order by age;
select * from employee order by age desc;
select * from employee order by age asc,salary desc;

排序方式:
    升序(默认):  asc
    降序:       desc
#如果有多个排序条件,则当前的条件值一样时,才会判断第二条件.

7.limit 限制
select * from employee order by salary desc limit 3;
select * from employee order by salary desc limit0,5;

limit 开始的索引:每页查询的条数

8.regexp 使用正则表达式查询
select * from employee where name regexp '^ale';
select * from employee where name regexp 'on$';

-多表查询

通过建立两张表:

#部门表
create table dep(
id int,
name varchar(20)
);

#员工表
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);

#给两个表插入一些数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

insert into emp(name,sex,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204);

多表连接查询

语法:
    select 字段列表 from 表1 inner|left|right join 表2
        on 表1.字段 = 表2.字段

1.交叉连接:不适用任何匹配条件.生成笛卡尔积
  笛卡尔积,通俗点说就是指包含两个集合中任意取出两个元素构成的组合的集合.
将两表所有的数据一一对应,生成一张大表.

select * from dep,emp;  #两个表拼在一起

2.内连接:只连接匹配的行

①隐式内连接:使用where条件消除无用数据
select * from dep,emp where dep.id = emp.dep_id; #找到两表之间对应的关系记录

select * from dep,emp where dep.id = emp.dep_id and dep.name = '技术';  # 筛选部门名称为技术的大表中的记录

select emp.name from dep,emp where dep.id = emp.dep_id and dep.name = '技术';  #哪到筛选后的记录的员工姓名字段数据

②显式内连接
语法: select 字段列表 from 表名1 inner join 表名2 on 条件;

第一步:连表
select * from dep inner join emp on dep.id=emp.dep_id;
第二步:过滤
select * from dep inner join emp on dep.id=emp.dep_id where dep.name = '技术';
第三步:找对应字段数据
select emp.name from dep inner join emp on dep.id=emp.dep_id where dep.name = '技术';

#注意条件:1从哪些表中查询数据 2.条件是什么 3.查询哪些字段

3.外连接查询

①左外连接(优先显示左表全部记录)
语法 select 字段列表 from 表1 left join 表2 on 条件;
#查询的是左表所有数据以及其交集部分.左边的表为主表,主表记录全部显示,辅表没办法一一对应上的就通过null补全.
select * from dep left join emp on dep.id = emp.dep_id;

②右外连接(优先显示右表全部记录)
语法 select 字段列表 from 表1 right join 表2 on 条件;

select * from dep right join emp on dep.id = emp.dep_id;

③全外连接(显示左右两个表全部记录)
#mysql不支持全外连接full join,可以通过以下方式间接实现全外连接

select * from dep left join emp on dep.id = emp.dep_id union
select * from dep right join emp on dep.id = emp.dep_id;

4.子查询(一个查询结果作为另外一个查询的条件)
概念:查询中嵌套查询,称嵌套查询或子查询
#内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#子查询中可以包含:in,not in,any,all,exists和not exists等关键字
#还可以包含比较运算符:= 、 !=、> 、<等

select name from emp where dep_id = (select id from dep where name = '技术');

①带in关键字的查询

select name from emp where dep_id in (select id from dep where name = '技术');
#查看技术部员工姓名
select name from dep where id not in(select distinct dep_id from emp)
#查看不足1人的部门名

②带比较运算符的子查询

select name,age from emp where age > (select avg(age) from emp);
#查询大于所有人平均年龄的员工名与年龄

③带exists关键字的子查询
    EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。True或False
    当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询。还可以写not exists,和exists的效果就是反的

select * from emp where exists(select id from dep where id = 200);

原文地址:https://www.cnblogs.com/tutougold/p/11455760.html

时间: 2024-10-27 08:38:42

数据库操作(二)的相关文章

ThinkPHP 数据库操作(二) : 增删改查

基本使用 可以直接使用数据库运行原生SQL操作了,支持 query (查询操作)和 execute (写入操作)方法,并且支持参数绑定. Db::query('select * from think_user where id=?',[8]); Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']); 也支持命名占位符绑定,例如: Db::query('select * from think_us

小白5分钟上手c#数据库操作(二) 基础的增删改查

上一小节,我们已经准备好了一个数据库文件,现在我们先不用微软包装好的各种Entity Framework, 自己用基础的方法对数据库进行增删改查. 前期准备: 新建一个console工程,把上一小节的数据库拷贝到工程目录下,copy local 设置成true, 目录结构大致长这样: 然后添加一个nuget包,方面后面使用各种c#提供的方法: 基本上常用的操作里,查数据是一类,增删改是一类 先看怎么查数据: // 查询数据 using (var connection = new SQLiteCo

Java Web的数据库操作(一)

一.JDBC技术 1.JDBC简介 JDBC是Java程序与数据库系统通信的标准API,它定义在JDK的API中,通过JDBC技术,Java程序可以非常方便地与各种数据库交互,JDBC在Java程序与数据库系统之间假期了一座桥梁. JDBC由一组用Java语言编写的类和接口组成,它对数据库的操作提供了基本方法,但由于数据库种类跟多且多有不同,所以对数据库的细节操作由数据库厂商进行实现,且厂商需要提供数据库的驱动程序,下图为Java程序与数据库相交互的示意图: 2.JDBC连接数据库的过程 l 

屌炸天实战 MySQL 系列教程(二) 史上最屌、你不知道的数据库操作

此篇写MySQL中最基础,也是最重要的操作! 第一篇:屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:屌炸天实战 MySQL 系列教程(二) 史上最屌.你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网远程连接法 查看\创建\使用\删除\清空\修改 数据库表(是否可空,默认值,主键,自增,外键) 表内容的增删改查 where条件.通配符_%.限制limit.排序desc\asc.连表join.组合union 查

MySQL 系列(二) 你不知道的数据库操作

本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网远程连接法 查看\创建\使用\删除\清空\修改 数据库表(是否可空,默认值,主键,自增,外键) 表内容的增删改查 where条件.通配符_%.限制limit.排序desc\asc.连表join.组合union 查看建表语句.查看表结构.查看是否走索引 数据类型 索引! 一.数据库操作 1.查看数据库 SHOW DATABASES; # 默认数据库: mysql - 用户权限相关数据 test - 用于用户测试数据 inform

DJango周总结二:模型层,单表,多表操作,连表操作,数据库操作,事务

django周复习二 1,模型层:  1单表操作:   13个必会操作总结    返回QuerySet对象的方法有    all()    filter()    exclude()    order_by()    reverse()    distinct()    特殊的QuerySet    values()       返回一个可迭代的字典序列    values_list() 返回一个可迭代的元祖序列    返回具体对象的    get()    first()    last() 

二、JAVA通过JDBC连接mysql数据库(操作)

昨天时间限制只是写了如何连接数据库,连接数据库的目的无非就是查询.修改数据,仅仅连接上还是毫无意义的. 对于数据哭的操作就要用到Statement接口(java.sql.Statement)主要方法 int executeUpdate(String sql)throws SQLException 更新数据库 ResultSet executeQuery(String sql)throws SQLException 查询返回ResultSet结果集 代码演示 1 import java.sql.C

nodejs mysql 操作数据库方法二

node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来介绍下如何通过NodeJS来操作 MySQL 数据库. Node.js是一套用来编写高性能网络服务器的JavaScript工具包 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来介绍下如何通过NodeJS来操作 M

(二)Redis 笔记——发布&amp;订阅、事务、数据库操作

1. Redis 发布订阅 1.1 概述 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 . client5 和 client1 之间的关系: 当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端: 1.2 步骤: 1.2.1.  创建了订阅频