zoukankan      html  css  js  c++  java
  • sql必知必会的简单总结

    看了sql必知必会,简单总结一下

    一基本概念

    • 数据库database:保存有组织数据的一组文件或一个文件
    • 数据库管理系统dbms:有mysql,sql server,access等
    • 表Table:同一类型数据的结构化清单
    • 模式:描述数据在表中如何存储,包含怎样的信息等内容
    • 列:表的一个字段,表由一个和多个字段组成。列都有自己的数据类型,定义了该列可以存储哪些数据种类。
    • 行:表中数据是按行存储的,每一行是一个记录
    • 主键:每一行都应该有一列可以唯一的标识自己。任意两行的主键值不相同,每一行至少有一个主键。主键的值不允许修改更新。
    • 注释语句:

    --:--之后的文本就是注释,可以嵌在语句内
    #:#之后的一行都是注释
    /注释/:多行注释

    二检索数据

    • 检索单个列:select 关键字 from 表名;
    • 检索多个列:select 关键字,关键字,关键字 from 表名;
    • 检索所有列:select * from 表名;
    • 检索不同的值:select distinct 关键字 from 表名;只返回有不同值的列
    • 限制结果:

    (1)sql server和access数据库:select top 数字 关键字 from 表名;返回前数字行数据
    (2)mysql和sqlite数据库:
    select 关键字 from 表名 limit 数字;返回不超过数字行数据
    select 关键字 from 表名 limit 数字1 offset 数字2;返回从数字2开始的后数字1行数据
    select 关键字 from 表名 limit 数字2,数字1;返回从数字2开始的后数字1行数据

    三排序检索数据

    • 按单个列排序:select 关键字 from 表名 order by 列名;
    • 按多个列排序:
      (1)select 关键字,关键字,关键字 from 表名 order by 列名1,列名2;即检索的数据先按列名1排序,拥有相同列名1的值的,再按列名2的值排序
      (2)select 关键字,关键字,关键字 from 表名 oeder by 2,3;这里即检索的数据先按第二个关键字的列排序,再按第三个关键字的列排序
    • 指定排序方式:默认以升序排列,使用desc指定该列降序排序,如想多个列都进行降序,每个列名后都应加上该关键字。

    四过滤数据

    1、简单过滤

    • 使用:例如:select name,price from product where price=2;即从prduct中选出price为2的数据
    • 注意:如果有order by,where应该放在其前面
    • 操作符:除了常用的<,>,!=等还用is null(为空值)between 数字 and 数字(在指定两个值之间)

    2、高级过滤

    (1)可以使and,or进行连接,但and的优先级更高,可以通过()对and,or进行优先分组,如:select name,price from product where price=2 and name<>'aa';即从prduct中选出price为2且name不为aa的数据
    (2)in:可以用来指定条件范围,如select name,price from product where name in ('aa','bb');即选出name为aa或bb的数据
    (3)not:否定后面的语句,如select name,price from product where not price=3;即选出price不等于3的数据

    3、通配符进行过滤

    通配符搜索只能用于文本字段,通配符是用来匹配值的一部分特殊字符,这种过滤需要使用like
    (1)%:任何字符出现任何次数(在access中使用*),如:select name,price from product where name like 'aa%';即检索product中name是以aa开头的任何字符串的数据。
    注意:%可以匹配0个字符,但不匹配Null。另外如abc空格是不能通过a%c匹配的,因为有空格,所以应用a%c%匹配
    (2)_(在access中使用?):与%相似,只匹配一个字符
    (3)[](只有access和sqlserver支持):指定字符集,指定匹配位置的匹配的一个字符。如:select name,price from product where name like '[as]dd';即选出name值是以a或s开头的以dd结尾的数据。另外可以用^进行否定(access用!),如:select name,price from product where name like '[^as]dd';即选出name值不是以a或s开头的,但是以dd结尾的数据

    五、计算字段

    用来对检索出的数据计算,转换,格式化,虽然客户端也可以处理,但数据库处理更快

    1、格式化

    (1)拼接字段||(oracle和sqlite等使用) 或+(sql server和access使用):如:select name+'('+price+')' from product;输出形如: apple (3.2)
    (2)mysql使用函数concat,如select concat(name,'(',price,')' )from product;
    (3)别名:as
    上述处理过的数据只是显示出来,不能用于客户端程序中,用as 关键字,处理的结果保存在以该关键字命名的列中,方便应用程序利用
    select name+'('+price+')' as name_price from product;

    2、算术计算:

    支持加减乘除,且可以用括号表示优先级
    如:select name,price,num,price*num as sum from product;返回形如,

    name price num sum
    apple 3.5 4 14

    六使用函数处理字段

    文本处理函数:

    不同的dbms的函数不尽相同

    • length()返回字符串长度
    • rtrim()去掉字符串右边空格
    • ltrim()去掉字符串左边空格
    • lower()字符串转换为小写,access为lcase()
    • upper()字符串转换为大写,access为ucase()
    • left()返回字符串左边的字符
    • right()返回字符串右边的字符

    日期和时间处理函数:

    各dbms不同

    数值处理函数:

    差不多一致

    七汇总数据

    • avg():返回某列的平均值
    • count():返回某列的行数
    • count(*)对表的行数进行技术,不管是否是NULL,count(列名)对特定列的行数进行统计,忽略NULL
    • max():返回列中最大值
    • min():返回列中最小值
    • sum():返回指定列值的和

    八分组数据

    • group by:例如select name,count(*) as number from product group by name;即先对数据按name分组,再计算改组有多少行。
    • 大多数sql实现不允许group by列带有长度可变得数据类型
    • 所有NULL被分成一组
    • group by出现在where之后,order by之前
    • having:与where相似,不过是对分组进行过滤

    九子查询

    1、利用子查询过滤

    例如,product表有生产人员id列,name列,price列,people表有生产人员id列,姓名people_name列。查找某产品(apple)的生产人员的姓名:select people_name from people where id in(select id from product where name='apple');

    2、作为计算字段使用子查询

    如:select name, (select count(*) from orders where orders.id=customer.id)as orders from customers;

    十联结表

    用一条语句来查询多个表的数据

    1、内联结,

    如:select vend_name,prod_name,prod_price from vendors,products where vendors.vend_id=products.vend_id;
    其中vend_name是vendors表的列,后两个是products的列,两个表通过vend_id联系
    相同的:select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id=products.vend_id;

    2、高级联结

    (1)使用别名:如:select vend_name,prod_name,prod_price from vendors as v,products as p where v.vend_id=p.vend_id;
    (2)自联结:如:select name,price from products as p1,products as p2 where p1.price=p2.price and p2.name='apple';即找出和apple价格相同的数据,查询使用了两个相同的表
    (3)外联结:联结将一个表的行与另一个表的行相关联,但有时需要包含没有关联行的那些行。左关联:left,右关联:right,全关联:full。如:elect vend_name,prod_name,prod_price from vendors left inner join products on vendors.vend_id=products.vend_id;

    十一组合查询

    union:在多条语句间使用union。union会自动剔除重复行,union连接的各语句必须是查询相同的列

    十二插入数据

    1、insert into values(各列值)。其中into可省,但是插入数据时最好给出列名。如向表product插入数据:insert into product(id,name,price) values('1','apple','3.5');
    2、插入检索出的数据:insert into product(id,name,price) select id,name,price from product2;即将从product2检索出的数据插入product中
    3、复制表:select * into product from product2;将product2的内容复制到product中,如果只想复制几列,给出列名即可。mysql等的语法稍有不同,create table product as select * from product2;

    十三

    • 更新数据:update product set price='4' where name='apple';即将apple的价格更新为4
    • 删除数据:delete from product where name='apple';即删除名字为apple的这一行

    十四创建和操纵表

    1、创建表:

    列名 数据类型 Notnull或默认的null default 值,
    )
    default 值(用来指定默认值,可选),不同dbms创建表不一样```
    2、删除表:drop table 表名
    3、更新表:alter
    
    ## 十五视图
    视图是虚拟的表,只包含动态检索数据的查询,access不支持视图
    1、使用视图简化复杂联结
    如;```create view 视图名 as select vend_name,prod_name,prod_price from vendors,products where vendors.vend_id=products.vend_id;```
    使用视图:``` select vend_name,prod_name from 视图名 where vend_id='aaa';```
    2、重新格式化检索出的数据
    如:```select name+'('+price+')' from product;```这样的数据可以保存到视图中
    ```create view 视图名 as select name+'('+price+')' from product;```只要输入select * from 视图名;即输出上句的效果
    3、与上同理可以使用视图过滤不想要的数据,使用视图与计算字段
    
    ## 十六存储过程
    存储过程好像一个函数,包含多条语句,有参数,返回值等。dbms不同创建存储过程不同。创建时一般都有create peocedure 名字,调用时一般使用到execute
    
    ## 十七控制事务处理
    事务处理能确保一组sql操作要么完全被执行,要么完全不被执行,确保数据库的完整性。事务处理关键在于将sql分解为块,并明确规定数据何时回退,何时不回退。
    (1)事务处理块的标识
    ```sql server:begin transaction ...commit transaction
    mysql:start transaction
    oracle:set transaction```
    (2)回退语句
    rollback
    (3)保留点
    保留点取能够唯一标识的名字,在回退时,dbms知道回退到何处。
    创建保留点: ```Mysql和oracle等 :savepoint 名字;sql server:save transaction 名字;```
    回退保留点:```mysql等:rollback to 名字;sql server: rollback transaction 名字;```
    
    ## 十八
    * 主键:可以在创建表时,使用primary key标识主键,也可以通过alter table 表名 add constraint primary key (列名)设置主键
    * 外键:为了保证引用完整性,外键是表中的一列,其值必须是另一表的主键值,可以在创建表时,使用references 另一表名(列名)标识,也可以通过```alter table 表名 add constraint foreign key (列名) references 另一表名(列名)```
    * 检查约束:用来保证某一列中的数据满足指定的条件
    如:```crreate table 表名(
    number integer not null check(number >4)
    )```即插入的Number值必须满足大于4
    
    ## 十九数据类型
    
    ### 1、串数据类型:
    * char :1~255个字符的定长字符串,长度必须在创建时规定
    * ncgar:char的特殊形式 ,支持多字节或unicode字节
    * nvarchar:text的特殊形式,支持多字节或unicode字节
    * text:变长文本
    
    ### 2、数值数据类型
    * bit:单个二进制,0或1
    * deciml:定点
    * float:浮点
    * int:四字节整数
    * smallint:二字节整数
    * tinyint:一字节整数
    
    ### 3、日期时间
    * date:日期值
    * time:时间值
  • 相关阅读:
    当再多大公司慢慢的放弃微软的技术时, 不知大家怎想?
    【叶子函数分享五十四】汉字转拼音函数 [转]
    java_easyui体系之DataGrid(4)[转]
    java_easyui体系之DataGrid(3)[转]
    java_easyui体系之DataGrid(2)[转]
    java_easyui体系之DataGrid(1)[转]
    java_easyui体系之目录 [转]
    Java 并发和多线程(三) 多线程的代价 [转]
    Java 并发和多线程(二) 多线程的优点 [转]
    Java 并发和多线程(一) Java并发性和多线程介绍[转]
  • 原文地址:https://www.cnblogs.com/Qi-Lin/p/11334021.html
Copyright © 2011-2022 走看看