这两天学习之前学习hive,发现hql主要是sql演化而来,所以索性就从w3school入手把所有的sql都建起了一遍,本博文比较长,具体的sql,可以私信我;

SQL笔记(Structured Query Language):

  • 基础知识
  1. SQL不区分大小写;
  2. DML(Data Manipulation Language)数据操纵语言;

select,update,delete,insert into

  1. DDL(Data Defination Language)数据定义语言;

create database,alter table,drop table,create index,drop index;

  1. 除了数据,其他需要加单引号,某些其他数据库,双引号也可以;不等于(<>或者

!=)

  1. order by 默认对结果进行升序排列;如果希望降序,使用desc;

select * from persons order by lastname desc;

  1. insert into语句,插入,可以多条插入,可以单条插入,可以插入指定列;

INSERT INTO orders(id,company,ordernum)VALUES(1,'中国知网',1234),(2,'W3School',2345),

(3,'W3School',6935),(4,'IBM',3532),(5,'Apple',1234);

 

INSERT INTO persons (lastname,firstname,address,city) VALUES('Bush','George','Fifth Avenue','New York');

 

INSERT INTO persons (lastname,firstname) VALUES('Bush','George');这种情况默认表可以不插入字段可以为空;

 

  1. update语句,更新表中的数据;

update persons set firstname='Gem' where lastname='lee';

  1. delete语句,删除表中的记录,可以删除表中一条记录,也可以删除表中的所有记录;

delete from persons where lastname=’lee’;

delete * from persons;/delete from persons;

  1. top子句,规定返回记录的条目。mysql数据库是这样 select * from persons limit 2;oracle数据库是这样 select * from persons where rownum <= 2;其他数据库规定是这样 select top 2 * from persons;select top 50 percent from persons;
  2. like 和not like;查询结果中是否包含某种字符串格式的结果;

like和not like都是查询是否符合某个格式的字符串;

以G开头;select * from persons where firstname like 'G%';

firstname中包含om:select * from persons where firstname like '%om%';

以g结尾:select * from persons where city not like '%g';

  1. 通配符,“%”表示替代一个或者多个;“_”表示匹配一个字符;“[charlist]”表示匹配字符串列表中任何一个就可以;”[!charlist]”或者“[^charlist]”,表示不再字符串中;
  2. between and 用法;查询结果在某某范围内的值,比如字母序列:select * from persons where lastname between 'Adams' and 'Carter';

也可以查询数值:select * from orders where ordernum between 1234 and 2345;在mysql中,between and是包含between 和and的值;加上了not就是不包含在between和and的值。

select * from orders where ordernum not between 1234 and 2345;

  1. in的用法,in运算是查询符合in的结果,

select * from persons where firstname in('John','William');

  1. 给表和列起别名(as)

select distinct op.userid as id,p.lastname as lastname,o.ordernum as taste from persons as p,orders as o,order_product as op where op.userid = p.id ;

 

  1. 几种连接方式;

 

内连接:SELECT op.userid,p.firstname,p.lastname from persons as p INNER JOIN order_product as op on op.userid = p.id;

 

SQL实例详解和复习

上面是几种join的图解,inner join的连接是两个表的交集(和自然连接一样的效果);

select persons.lastname,persons.firstname,orderno.orderNo from persons inner join orderno on persons.id=orderno.id_p;

 

按照两个表中的属性进行等值连接,这就是自然连接,这样可以去掉重复的值;

  select persons.lastname,persons.firstname,orderno.orderNo from persons,orderno where persons.id=orderno.id_p;   

 

left join,左外连接,以左边的表为基准,当左边的表里数据在进行等值运算,在右边表里没有出现时,会完全填补上右边的值为null。

select persons.lastname,persons.firstname,orderno.orderNo from persons left join orderno on persons.id=orderno.id_p;

right join,右外连接,以右边的表为基准,会含有右边的所有值,当右边的值和左边进行等值运算时,如果左边没有值,会自动添加null;

 

select persons.lastname,persons.firstname,orderno.orderNo from persons right join orderno on persons.id=orderno.id_p;

 

full join,全连接,这个是左右两边只要满足条件,都返回;

只不过,左边为空,会在昨天添加null,右边有值为空,会在右边添加null;

在mysql中,没有full join,但是可以left join union right join;

 select persons.lastname,persons.firstname,orderno.orderNo from persons left join orderno on persons.id=orderno.id_p

union

select persons.lastname,persons.firstname,orderno.orderNo from persons right join orderno on persons.id=orderno.id_p;

 

union,这个是连接两个子查询的运算关键字。使用这个关键字有要求,就是union连接的两个子查询必须要求结构一样,比如说上面的例子。还有union不允许重复,而union all允许重复;

 

xshell输入,backspace和delete变成^H,乱码,只需要ctrl+backspace和ctrl+delete即可;

 

  1. select into,这个是用作表的备份,把已经有的表备份出来,要求备份表不存在;

select * into persons_bak from persons;

但是上面在mysql里面,并不存在,因为mysql中没有select into,但是有以下两种形式:

create table persons_bak as select * from persons;可以使用子查询来建立表备份,这种建立的备份表也是一个新表。还可以使用insert into;

insert into select,这个还是在报错,不知道为什么;

 

  1. 建立表时有几种约束:

NOT NULL,UNIQUE,PRIMARY KEY,CHECK,DEFAULT;

unique 和primary key保证了不重复;

如果一开始建表没有主键时,添加已有字段作为主键,可以这么写:

alter table persons add primary key(id_p)

如果重命名primary key约束,以及为多个列定义primary key,使用下面SQL语法,

alter table persons add constraint p_personsid primary key(id,lastname);

撤销主键:

alter persons drop primary key;

 

  1. foreign key,外键,就是persons中的id和orderno的id_p,在‘id_p’已经存在,创建外键约束时,使用下面的句子:

alter table orderno add foreign key(id_p) reference s persons(id);

如果已经存在外键约束,需要重命名外键约束,使用下面的语法:

alter table orderno add constraint fk_id foreign key(id_p) references persons(id);

撤销外键约束,

alter table orderno drop foreign key fk_id;

check,规定字段的值,可以在建表时加入:check(id>0);可以新添加:

alter table orderno add check(id>0);删除时,alter+drop;

 

default,设置默认值,可以在建表时加入:orderdate date default getdate();

也可以新添加: alter table orederno alter city set default ‘BeiJing’;删除时,直接alter+drop;

  

  1. 创建索引:可以在表中创建索引,以便能加快查询速度;用户无法看见索引,只能用来加速查询;可以create index,也可以alter +add index;

create index order_index on persons(‘id_p’),还可以(id_p desc);

alter table persons add index (id desc);

还可以组合索引create index ppi onpersons(lastname,firstname);

mysql中删除索引

alter table persons drop index;

mysql 删除数据而不删除表:truncate table persons;

sql中视图

视图是sql中结果集可视化的表,(包含行和列),类似一个真实的表,可以创建,修改删除,增删改;

create view v_persons as select * from persons;

select firstname from v_persons;

update v_persons set xxxxxx;

但是注意不能再多张关联表组成的视图上进行修改;

  1.  sql的date函数,日期函数,mysql中有

  1. sql中的NULL和0不相等,null和is not null是用来判断是否为null的值,不能使用0;

mysql中规定了对于值为零做了何种处理,可以用IFNUll(listnum,0)这里把listnum值为null的设置为了0;SQL中有isnull()和NVL();mysql中同样可以设置coalesce()函数;

  1. SQL中数据类型,以mysql为例子;

 

DBMS - 数据库管理系统(Database Management System)

 

RDBMS - 关系数据库管理系统(Relational Database Management System)

 

sql中的内建函数;

sqlserver中的内聚函数,

 

  1. mysq中内聚函数

常用的有avg([distinct] expr),count({*|[distinct]} expr),max([distinct] expr),min([distinct] expr),sum([distinct] expr)

注意:

  1. 当使用组函数的select语句没有group by 子句时,中间结果的所有航自动形成一组,然后计算组函数
  2. 组函数不允许嵌套,例如count(max())
  3. 组函数的参数可以是列或是函数表达式;
  4. 一个select子句中可以出现多个聚合函数;

 

  1. avg函数使用,该函数计算给定列的评价值;

select firstname from persons where age>(select avg(age) from persons);

select avg(age) from persons;

  1. count()函数的使用,count函数返回指定列的数目(NULL不计入);

select count(*) as ‘求和’ avg(age) as ‘平均数’ from persons;

select count(distinct city) from persons; //去掉重复列;

  1. sql语言中还有first()和last()函数,但是mysql没有;
  2. max(),求得最大值;min()求得最小值;

select max(age) from persons where age>(select  avg(age) from persons);//求最大值;

select min(age) from persons where age>(select avg(age) from persons );//求最小值;

加上group by子句后,就会使得最大最小值失去作用

select max(age),lastname from persons where age>(select avg(age> from persons);这样会报错,因为有lastname,有其他的列时,必须要加分组函数group by lastname;所以应该这么写:

select max(age),lastname from persons where age>(select avg(age) from persons) group by lastname;

注意:默认值为null是不参与运算的,可以设置ifnull(column,0);

  1. sum(),对指定列的值求和;

select sum(age) from persons where age>(select avg(age) from persons);

  1. group by column_name,分组;通常跟聚合函数结合起来使用;

select customer,sum(orderprice) as '花费总额' from orderdetails group by customer,orderdate;//这样不能达到效果;

select customer,sum(orderprice) as '花费总额' from orderdetails group by customer;//这样group by 是有用的;

  1. having子句,where后面不能直接跟聚合函数;但是having后面可以直接跟聚合函数;

having必须跟在group by后面,没有group by,,无从谈使用having;

  1. ucase(column_name),转化为大写;lcase(column_name),转化为小写;
  2. mid()函数;取出指定长度属性值;

select ucase(firstname),mid(firstname,1,3) from persons;

注意这里1,和3,数据库中默认长度是从1开始的;

  1. length();求得字符串的长度;

select length(firstname)as f from persons;

  1. round(),把值四舍五入到指定的值中;保留几位小数;

select product_name,round(unitprice,0)as price from products;

  1. now()函数,表示的是当前时间;

select firstname,now() from persons;

  1. format()函数,对数据进行格式化;

select date_format(now(),'%Y-%m-%d'),firstname,lastname from persons;

直接使用format,格式不对;

 

分组

select [聚合函数] 字段名 from 表名

    [where 查询条件]

    [group by 字段名]

    [having 过滤条件]

后续在更改。参考自w3school

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 1970-01-01
  • 2021-06-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2023-03-06
猜你喜欢
  • 2022-12-23
  • 2022-02-02
  • 2022-12-23
  • 2022-02-08
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案