SQL基本操作总结_aajlfg6706的博客-程序员ITS203

技术标签: 数据库  

1.SQL简介
结构化查询语言
(层次模型,网状模型,关系模型)

关系模型是目前的主流 (Oralce,mysql mssql )

SQL标准:ANSI (1992 1997 2002 ISO)

方言与Sql 标准
学习者:SQL标准
方言: 只支持自己当前的数据库

2.常用数据库
Oracle MySQL SQL Server SQLite

MySQL(重点)

安装
Client---->Server------>库------>表
3.建库
1.登录MySQL
mysql -u root -p

2.创建数据库
*** create database 数据库名;
create database day14;

--创建数据库时指定字符集
create database day14 character set gbk;

3.查看服务器上所有的数据库
**** show databases;
4.查看创建数据库的代码
show create database 数据库名;
show create database day13;

5.修改某个数据库的编码
alter database 数据库名 character set 字符编码 COLLATE 字符集的校验规则;
alter database day13 character set utf8 collate utf8_general_ci;

6.删除数据库
**** drop database 数据库名;
drop database day13;

7.使用某个数据库 (将来建表都放在这个库中)
**** use 数据库名;
use day13;
4.建表
1.建表
create table 表名(
字段名(列名) 数据类型,
字段名(列名) 数据类型,
字段名(列名) 数据类型
);

float(5,2):代表总长度是5,其中小数位数是2位,整数位数是3位

示例: create table employee(
id int,
name varchar(20),
gender char(4),
birthday datetime,
entry_date datetime,
job varchar(100),
salary float(7,2),
resume longtext
);

2.
显示当前数据下所有的数据表
show tables;

3.
查看创建表的代码
show create table 表名;
show create table employee;

4.查看表的明细,以列表的形式显示出结果
desc 表名;
desc employee;
describe employee;

 

use day14;

5.修改表的列
1.添加一列
alter table 表名 add 列名 类型;

2.修改某列的数据类型
alter table 表名 modify 列名 新的数据类型;

3.删除某列
alter table 表名 drop 列名;

4.修改表名
rename table 旧表名 to 新表名;

5.修改表的字符集
alter table 表名 character set 字符集编码

6.修改列名
alter table 表名 change column 旧列名 新列名 新的数据类型;

7.删除表结构
drop table 表名;


1.加一个列image
alter table employee add image longblob;
2.修改job列,使其长度为60
alter table employee modify job varchar(60);
3.删除image列
alter table employee drop image;
4.表名改为user
rename table employee to user;

5.修改表的字符集为gbk
alter table user character set gbk;

6.列名name修改为username
alter table user change column name username varchar(30);

 


ALTER CREATE DROP: DDL语言(数据定义语言)

INSERT UPDATE DELETE :DML语言(数据操作语言)

SELECT :DQL语言(数据查询语言)
select * from employee;

5.CRUD操作
1.插入:
insert into 表名[(列名1,列名2)] values(值1,值2);
字符和日期型数据应包含在单引号中。
insert into employee (id,name,gender,birthday,salary,entry_date,resume)
values(1,'cgx','男','1982-10-1',10000,'2000-10-1','服务业干得不错');

insert into employee
values(2,'aj','女','1982-10-1','2000-10-1','演员',100,'服务业干得不错');

2.处理添加及查询数据的乱码问题
show variables like 'character%';
set character_set_client=gbk;//处理客户端向服务器提交数据的编码
set character_set_results=gbk;//处理服务器响应在客户端中的结果的编码

2.
删除数据
delete from 表名 【where条件】
delete from employee where name='2阿娇';

delete from employee;//清除表中所有记录
truncate table employee;//清除表中所有记录

区别:
1.truncate table 删除数据效率更高(先摧毁整个表结构,再重建表)
2.delete 删除所有记录时,一条一条往后删除
3.truncate table只能删除所有
4.delete可以选择性的删除部分记录

3.更新
update 表名 set 列名=值,列名2=值2 where 条件;
update employee set name='2阿娇',gender='男' where name='aj';


4.查询
select 列名 [as] 改列名,列名 from 表名 【 where 条件 order by 排序字段 (ASC(默认值)升序 | DESC)】
用*代表所有列
distinct可以消除重复数据(查询时)
order by 如果指定了多个排序字段,优先按第一个字段排,如果第一个字段取值相同时,才考虑第二个字段排序

示例:
查询表中所有学生的信息。
select * from student;
查询表中所有学生的姓名和对应的英语成绩。
select name,english from student;
过滤表中重复数据(英语成绩(同一个成绩只显示一次))。
select distinct english from student;
在所有学生数学分数上加10分特长分。(显示)
select name,math+10 from student;
select name as 姓名,math+10 as 数学成绩 from student;
统计每个学生的总分。
select name,chinese+math+english from student;
使用别名表示学生分数。
select name 姓名,chinese+math+english 总分 from student;

排序:order by 排序字段 (asc (默认升序) desc降序)
使用别名表示学生分数,并按总分从高到低排
select name 姓名,chinese+math+english 总分 from student order by 总分 desc;

查询姓名为王五的学生成绩
select * from student where name='王五';
查询英语成绩大于90分的同学
select * from student where english>90;
查询总分大于200分的所有同学
select * from student where (chinese+math+english)>200 ;


运算符
(<> !=)
BETWEEN ...AND... 是一个闭区间(含头含尾)
in(set) 指的是在一个集合中取元素都可以
Like语句中,% 代表零个或多个任意字符,_ 代表一个字符,例first_name like ‘_a%’

IS NULL;代表某列取值是否为null select * from student where name is null;

and or not

示例:
查询英语分数在 80-90之间的同学。
select * from student where english between 80 and 90;
select * from student where english>=80 and english<=90;
查询数学分数为89,90,91的同学。
select * from student where math in (89,90,91);
select * from student where math=89 or math=90 or math=91;
查询所有姓李的学生成绩。
select * from student where name like '李%';
查询数学分>80,语文分>80的同学。
select * from student where math>80 and chinese>80;

 

排序:
示例:
对数学成绩排序后输出。
select * from student order by math;

select * from student order by math asc ,第二个排序字段 (asc|desc) ;
引入第二个排序字段 是当第一个字段取值相同时,才会启用第二个排序字段(字典顺)
select * from student order by math asc ,name desc ;
对总分排序后输出,然后再按从高到低的顺序输出
select name 姓名,chinese+math+english 总分 from student order by 总分 desc;
对姓李的学生成绩排序输出
select * from student where name like '李%' order by chinese+math+english


6.多表操作
实体完整性约束:
规定表的一行(即每一条记录)在表中是唯一的实体。实体完整性通过表的主键(primary key)来实现。
主键的特性:唯一性,非空性
主键的分类:物理主键,逻辑主键(业务主键)实际开发中主要用的是业务主键
create table student(
id int primary key ,
name varchar(20) unique not null,
chinese float,
english float,
math float
);

insert into student(id,chinese,english,math) values(1,89,78,90);
insert into student(id,chinese,english,math) values(4,67,98,56);
insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77);
insert into student(id,name,chinese,english,math) values(4,'李一',88,98,90);
insert into student(id,name,chinese,english,math) values(5,'李来财',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'张进宝',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黄蓉',75,65,30);


auto_increment:只针对这一列的类型是整数,代表自动增长(1,2,3,4,5依次增长)
:它应该与primary key 配套使用
create table score(
id int primary key auto_increment,
english float(5,2)
);

insert into score(english) values(67);
insert into score(english) values(89);
insert into score(english) values(98);

delete from score where id =3;
insert into score(english) values(100);# id从4开始 如果又要从1开始自动增长,就可以先删除表,再进行数据添加


数据冗余:数据重复

域完整性约束:保证某个字段符合要求
not null
unique:唯一 (对于null值无效)

create table orders(
id int primary key,
orderno varchar(100) not null,
price float(8,1)
);
insert into orders(id,orderno,price) values(1,null,1000);

drop table orders;
create table orders(
id int primary key,
orderno varchar(100) unique ,
price float(8,1)
);
insert into orders(id,orderno,price) values(1,'123',1000);
insert into orders(id,orderno,price) values(2,null,1000);
insert into orders(id,orderno,price) values(3,null,4000);#可以添加进去,对于null值无效
解决问题?可以对这一列同时添加unique及not null
drop table orders;
create table orders(
id int primary key,
orderno varchar(100) unique not null,
price float(8,1)
);
insert into orders(id,orderno,price) values(1,'123',1000);
insert into orders(id,orderno,price) values(2,'123',1000);

参照完整性约束
问题?成绩表中出现了一个成绩(它的学号是在学生表没有)
订单(订单的客户编号 应该在客户表中能找到这样的编号)
解决办法 :给表添加外键
建表时添加外键:constraint 外键名 foreign key(外键字段名) references 主键表(主键字段)
先建表再添加外键:
alter table 表名 add constarint FK_employee_dept_id foreign key(dept_id) references departement(id)

表与表之间的关系:
一对一 (一个人只能有一个身份证号码)
一对多(一个顾客可以下多个订单,一个订单只能一个顾客下) (开发中用的最多)
create table cust(
id int primary key,
name varchar(20) not null
);

insert into cust values(1,'cgx');
insert into cust values(2,'aj');
insert into cust values(3,'zxc');

drop table orders;
customerid不能随意编写,它应当来自于cust表中的id这一列的取值
customerid也称为外键列(外键字段)
create table orders(
id int primary key,
orderno varchar(100) ,
totalprice float(7,2),
customerid int ,
constraint FK_orders_customerid foreign key(customerid) references cust(id)
);
insert into orders values(1,'wqewq234324',1000,4);#出错
insert into orders values(1,'wqewq234324',1000,3);#成功

delete from cust where id=3;#删除失败,原因是它现在有关联的子项,当把父项删除后,关联子项就
找不到父项了,所以删除失败
解决:
一、先将子项清除,再删除自己
delete from orders where customerid=3;
delete from cust where id=3;

二、解除外键
alter table 表名 drop foreign key 外键名;
alter table orders drop foreign key FK_orders_customerid;

delete from cust where id=3;


多对多 (一个老师可以教多个学生,一个学生也可以被多个老师教)
用中间表来描述关系:
联合主键:primary key(字段1,字段2)

 

连接查询:
交叉连接(cross join):不带on子句,返回连接表中所有数据行的笛卡儿积。
select * from A cross join B;(显式交叉连接)
select * from A ,B; (隐式交叉连接)


内连接(inner join):返回连接表中符合连接条件及查询条件的数据行。
select * from A inner join B on (连接条件) where 条件
示例:
查询陈冠希的所有订单
select * from customer A inner join orders B on(A.id=B.customer_id) where A.name='陈冠希';
查询所有下过订单的人员及订单信息
select * from customer A inner join orders B on(A.id=B.customer_id)


外连接:分为左外连接(left out join)、右外连接(right outer join)。与内连接不同的是,外连接不仅返回连接表中符合连接条件及查询条件的数据行,也返回左表(左外连接时)或右表(右外连接时)中仅符合查询条件但不符合连接条件的数据行。
select * from A left join B on (连接条件) where条件
特点:左表中能连接上右表的记录显示出来,还会将左表中连接不上的其它所有记录也显示出来
示例:
select * from customer left join orders on(customer.id=orders.customer_id) ;

select * from A right join B on (连接条件) where 条件
特点:将右表中的记录都要保留下来
示例:
select * from customer right join orders on(customer.id=orders.customer_id) ;
select * from orders right join customer on(customer.id=orders.customer_id) ;

子查询
select * from 表名 where 字段名 in (select 字段名 from 表名 where条件); (放在外面的查询叫父查询,放在内部的查询叫子查询)
子查询可以出现在select ,from ,where部分。
示例:查询陈冠希的所有订单
select id from customer where name='陈冠希';
select id,order_number,price,customer_id from orders
where customer_id in (select id from customer where name='陈冠希');
联合查询
select * from A
union
select * from B
将A表中的记录与B表中的记录合并在一起,并消除重复记录

select * from orders where price>200
union
select * from orders where customer_id in (select id from customer where name='陈冠希');

报表查询
select * from 表名 where 条件 group by 分组字段 having(分组后的条件)

聚合函数:
count():统计个数
sum():求和
avg():求平均值
max()最大值
min()最小值

示例:
统计一个班级共有多少学生?
select count(*) from student;
统计数学成绩大于等于90的学生有多少个?
select count(*) from student where math>=90;
统计总分大于250的人数有多少?
select count(*) from student where (math+chinese+english)>250;
求一个班级数学平均分?
select avg(math) from student;

求一个班级总分平均分
select avg(math+chinese+english) from student;
select sum(math+chinese+english)/count(*) from student;

求班级最高分和最低分
select max(math+chinese+english) 最高分,min(math+chinese+english) 最低分 from student;


对订单表中商品归类后,显示每一类商品的总价
select product ,sum(price) from orderss group by product ;
查询购买了几类商品,并且每类总价大于100的商品
select product ,sum(price) from orderss group by product having (sum(price)>100);


7.数据备份与还原
1.数据库备份:
WINDOWS命令行:
mysqldump -h localhost -u root -p[也可以加密码] day14>d:/day14.sql

2.还原
1.WINDOWS命令
mysql -u root -psorry 数据库名(要事先存在)<test.sql(sql文件所在位置)


2.MYSQL命令
1.确保数据库存在
create database day14;
2.source sql文件所有位置
source d:/mysql.sql;

转载于:https://www.cnblogs.com/bwcx1375/p/7107294.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aajlfg6706/article/details/101550053

智能推荐

html脚注如何设置,word2010脚注文本怎么设置_麻一的博客-程序员ITS203

在word2010中脚注格式,如何把[1]替换成[注1]?在word2010中脚注格式,把[1]替换成[注1],可通过自定义脚注编号实现。 方法步骤如下:打开需要操作的WORD文档,选中相关脚注,然后点击引用选项卡中脚注右下角的展开按钮。在自定义符号后面输入“[注1]”,点击插入即可。word2010脚注怎么转换成尾注为正文中的部分内容插入尾注。组合键为Alt+Ctrl+D。点击【引用】下【脚注和...

论文阅读:ThinLTO: Scalable and Incremental LTO_电影旅行敲代码的博客-程序员ITS203

ThinLTO: Scalable and Incremental LTO 论文阅读笔记A little bit of history.SYZYGY – A Framework for Scalable Cross-Module IPOielf,persistent intermediate representation (IR),基于 ELF 格式,存储自定义格式的 IR(以及 summary)。论文中表示 ielf 文件大小平均是原始 elf 文件的五倍,极端情况下有700倍。在 SYZY.

简介Kotlin let,run,also,apply,with等几种常用的拓展函数_wazing.的博客-程序员ITS203

Kotlin的[Standard Library]提供了几种拓展函数(extension function),有的可以更优雅处理可空变量问题。相信在学习 Kotlin 时,一定都会注意到它有许多`let` `apply` `run` 等这些 extension function,它们看起来大同小异,用起来似乎也经常

Typescript 2-类_01xm的博客-程序员ITS203

TypeScript面向对象编程---类1. Typescript类1.1 类的定义1.2 创建实例化对象1.3 类的继承1.4 继承类的方法:重写1.5继承和重写的综合例子1.6 static关键字

Android 是否 root_weixin_34290352的博客-程序员ITS203

public static boolean isRooted(Context context) { if (TextUtils.equals("1", getSystemProperty("ro.secure", null))) { return true; } final String[] filePaths = new Strin...

flink通过ProcessFunction和定时器onTimer实现一个窗口累加的功能_AokCap的博客-程序员ITS203

import org.apache.flink.api.common.functions.MapFunction;import org.apache.flink.api.common.state.ValueState;import org.apache.flink.api.common.state.ValueStateDescriptor;import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.configura..

随便推点

es6 TypedArray视图_ixygj197875的博客-程序员ITS203_es6 typedarray

TypedArray视图ES6 ArrayBuffer对象作为内存区域,可以存放多种类型的数据。同一段内存,不同数据有不同的解读方式,这就叫做“视图”(view)。ArrayBuffer有两种视图,一种是 TypedArray视图,另一种是DataView视图。前者的数组成员都是同一个数据类型,后者的数组成员可以是不同的数据类型。目前,TypedArray视图一共包括 9 种类型,每一种视图都是一...

使用阿里云OSS上传本地资源(图片、文件、音频、视频)_万少博的博客-程序员ITS203_oss上传音频

最新更新时间:2020年08月08日23:44:17《猛戳-查看我的博客地图-总有你意想不到的惊喜》背景:在使用阿里云OSS的过程中,通过JavaScript客户端签名直传的方案进行本地资源上传时,在react架构的项目中引入官方提供的Plupload SDK的方案一直上传失败,究其原因是Plupload SDK的方案采用jQuery操作DOM进行上传,通过分析源码发现核心还是传统的formdata格式发送xhr对象上传。本文内容:记录前端开发过程中在不同场景下使用阿里云OSS上传本地资源的方案

详细的log4j配置使用流程_sunny_na的博客-程序员ITS203

一、入门实例1.新建一个JAva工程,导入包log4j-1.2.17.jar,整个工程最终目录如下2、src同级创建并设置log4j.properties ### 设置###log4j.rootLogger = debug,stdout,D,E### 输出信息到控制抬 ###log4j.appender.stdout = org.apache.log4j.Con

东南大学破格保研挂科_给挂科同学的建议_weixin_39928099的博客-程序员ITS203

该楼层疑似违规已被系统折叠隐藏此楼查看此楼不少吧友比如挂了一科,实际上不真正等于不能保研,以下条件满足同样可以保研。所以挂科的同学不要灰心。东南大本科毕业生中推荐免试硕士研究生标准如下,推荐条件(一)基本条件被推荐者应是政治思想表现良好,学习成绩优秀,综合能力强,学术研究兴趣浓厚,有较强的创新意识、创新能力和专业能力倾向的优秀应届本科生,并须符合以下基本条件:1.学习成绩优秀,前三年(五年制前四...

HEIF & HEVC 你知道多少?_普通网友的博客-程序员ITS203

点击上方“iOS开发”,选择“置顶公众号”关键时刻,第一时间送达!在升级 iOS 11 之后,iPhone 7 及更新的设备内的照片存储将不再用 JPEG 了,而采用了一种新的图片格式 HEIF(发音同 heef),在 iOS 中对应的文件后缀为 .heic ,其编码用的是 HEVC(这个发不了音,哈哈哈)格式,又称 H.265 (这个就很熟悉了 H.264 的

Linux IPC之Socket网络编程服务器的负载均衡_delphiwcdj的博客-程序员ITS203

导言:在设计高性能并发型服务器时,传统的为每一个客户端创建一个新的子进程(或线程)所带来的开销对服务器来说是个沉重的负担,因此本文考虑几种可选方案。在服务器上预先创建进程或线程(进程池或线程池)服务器在启动阶段(即,在任何客户端请求到来之前)就立刻预先创建好一定数量的子进程(或线程),而不是针对每个客户端来创建一个新的子进程(或线程)。这些子进程构成了一种服务池(server pool),即,进

推荐文章

热门文章

相关标签