这两天学习之前学习hive,发现hql主要是sql演化而来,所以索性就从w3school入手把所有的sql都建起了一遍,本博文比较长,具体的sql,可以私信我;
SQL笔记(Structured Query Language):
- 基础知识
- SQL不区分大小写;
- DML(Data Manipulation Language)数据操纵语言;
select,update,delete,insert into
- DDL(Data Defination Language)数据定义语言;
create database,alter table,drop table,create index,drop index;
- 除了数据,其他需要加单引号,某些其他数据库,双引号也可以;不等于(<>或者
!=)
- order by 默认对结果进行升序排列;如果希望降序,使用desc;
select * from persons order by lastname desc;
- 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');这种情况默认表可以不插入字段可以为空;
- update语句,更新表中的数据;
update persons set firstname='Gem' where lastname='lee';
- delete语句,删除表中的记录,可以删除表中一条记录,也可以删除表中的所有记录;
delete from persons where lastname=’lee’;
delete * from persons;/delete from persons;
- 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;
- 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';
- 通配符,“%”表示替代一个或者多个;“_”表示匹配一个字符;“[charlist]”表示匹配字符串列表中任何一个就可以;”[!charlist]”或者“[^charlist]”,表示不再字符串中;
- 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;
- in的用法,in运算是查询符合in的结果,
select * from persons where firstname in('John','William');
- 给表和列起别名(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 ;
- 几种连接方式;
内连接:SELECT op.userid,p.firstname,p.lastname from persons as p INNER JOIN order_product as op on op.userid = p.id;
上面是几种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即可;
- 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,这个还是在报错,不知道为什么;
- 建立表时有几种约束:
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;
- 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;
- 创建索引:可以在表中创建索引,以便能加快查询速度;用户无法看见索引,只能用来加速查询;可以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;
但是注意不能再多张关联表组成的视图上进行修改;
- sql的date函数,日期函数,mysql中有
- sql中的NULL和0不相等,null和is not null是用来判断是否为null的值,不能使用0;
mysql中规定了对于值为零做了何种处理,可以用IFNUll(listnum,0)这里把listnum值为null的设置为了0;SQL中有isnull()和NVL();mysql中同样可以设置coalesce()函数;
- SQL中数据类型,以mysql为例子;
DBMS - 数据库管理系统(Database Management System)
RDBMS - 关系数据库管理系统(Relational Database Management System)
sql中的内建函数;
sqlserver中的内聚函数,
- mysq中内聚函数
常用的有avg([distinct] expr),count({*|[distinct]} expr),max([distinct] expr),min([distinct] expr),sum([distinct] expr)
注意:
- 当使用组函数的select语句没有group by 子句时,中间结果的所有航自动形成一组,然后计算组函数
- 组函数不允许嵌套,例如count(max())
- 组函数的参数可以是列或是函数表达式;
- 一个select子句中可以出现多个聚合函数;
- avg函数使用,该函数计算给定列的评价值;
select firstname from persons where age>(select avg(age) from persons);
select avg(age) from persons;
- count()函数的使用,count函数返回指定列的数目(NULL不计入);
select count(*) as ‘求和’ avg(age) as ‘平均数’ from persons;
select count(distinct city) from persons; //去掉重复列;
- sql语言中还有first()和last()函数,但是mysql没有;
- 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);
- sum(),对指定列的值求和;
select sum(age) from persons where age>(select avg(age) from persons);
- 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 是有用的;
- having子句,where后面不能直接跟聚合函数;但是having后面可以直接跟聚合函数;
having必须跟在group by后面,没有group by,,无从谈使用having;
- ucase(column_name),转化为大写;lcase(column_name),转化为小写;
- mid()函数;取出指定长度属性值;
select ucase(firstname),mid(firstname,1,3) from persons;
注意这里1,和3,数据库中默认长度是从1开始的;
- length();求得字符串的长度;
select length(firstname)as f from persons;
- round(),把值四舍五入到指定的值中;保留几位小数;
select product_name,round(unitprice,0)as price from products;
- now()函数,表示的是当前时间;
select firstname,now() from persons;
- format()函数,对数据进行格式化;
select date_format(now(),'%Y-%m-%d'),firstname,lastname from persons;
直接使用format,格式不对;
分组
select [聚合函数] 字段名 from 表名
[where 查询条件]
[group by 字段名]
[having 过滤条件]
后续在更改。参考自w3school