sql基础知识

数据库分类:
关系型数据库和对象型数据库
Mysql(关系型),SqlServer,Oracle(关系+对象),Db2

主键(主关键字primary key):表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。
范式:目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。

候选关键字:如果一个超关键字去掉其中任何一个字段后不再能唯一地确定记录,则称它为“候选关键字,也就是说候选关键字是最简单的超关键字。
数据库语言:

DDL:数据库模式定义语言(crud数据库,表)
DML:数据库操作语言(crud基本数据类型)
DCL : 数据库控制语言 (事物指令)

数据库的创建与删除:
数据库的创建:
create database 数据库名;

数据库的删除:
drop database 数据库名;

表的创建与删除:
表的创建:
create table 表名(
列名1 类型 primary key auto_increment,
列名2 类型 (char(20)) not null ,

);
表的删除:
drop table 表名;

数据库的增减改查(dcl)
(dos环境下的数据库操作)
进入bin文件 : cd mySql安装的bin文件地址

输入密码: mysql -u 用户名 -p 密码

以下需要加分号作为结束:
显示数据库 名: show databases;

进入test数据库: use test;

显示表格属性结构: desc user;

查询表 show tables;

查询用户数据: select * from user; (查询数据库的全部)
select 列名1,列名2 from user; (查询数据库的指定列)
select 列名1,列名2 from user where 列名3=值1 and 列名>40; (查询数据库中列名为列名3值为值3的指定列)
select 列名1,列名2 from user where 列名3>=值1;(查询数据库中列名为列名3值大于等于值3的指定列)
select 列名1,列名2+1 from user where 列名3>=值1;(查询数据库中列名为列名3值大于等于值3的指定列1,列2加1)
select 列名1,列名2 from user where is null; (查询数据库中有空值定列)

插入数据(列): insert into user(id,name,age) values(1,'lisi',23);

自增长 : alter table user modify id integer auto_increment;
(改变用户表修改整形id为自增长)

删除 (行) : delete from user where name= 'lisi';

修改: update user set age=22 where id=2;

退出: exit;

删除user表 drop table if exists user

退出命令行输入 Ctrl+C

建表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(255) default NULL,
  `password` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;

查询数学运算:
select count(*) from 表名;
count(distinct 表名) 返回不同的个数
sum()其中可以写比较表达式,真则为1,假为0,可做计数器
max()
min()
avg()

分组:group by

select 列名1,sum(列名2) from 表明 group by   分组依据的列表名1;

select 列名1,列名1-列名2 as cz from 表名 where 列名1-列名2<200;(where从后向前运行)
select 列名1,列名1-列名2 as cz from 表名 having cz<200;(从前向后运行,having后需用as后的新名字)
having和group by组合时group by在having前(先分组在输出)
在无where和having时默认从前向后运行

排序:order by(升序(默认),降序,种类排序)
select 列名1,列名1-列名2 as cz from 表名 order by 列表名1,列表名2 desc;(从前向后运行,先按列名1排序,在按列名2排序)

select * from goods where 1 order by cat_id asc,goods_id desc;(asc升序)
select * from goods order by cat_id desc,shop_price desc;

limit 起始位置,偏移量(分页)
select 列名1,列名1-列名2 as cz from 表名 order by 列表名 desc limit 0,3;(limit 3默认为limit 0,3)
where 1与where 0
where 1为默认,全部输出、
where 0为全部不输出

***优先级:***where,group by,having,order by,limit(优先级低的有,优先级高的可以没有)

select name,sum((score<60)*score)/sum(score<60),sum(score<60) as avg from result group by name having avg>=2;

limit 只能限制显示器输出不能限制数据库查询,所以,sum,count,avg求的是整体
COUNT(*) 返回表的所有纪录数,而COUNT(expression)则返回符合表达式计算结果的非空纪录数。通常情况 下,COUNT(DISTINCT expression)将相同的纪录只计算为一个。可以看到,根据不同的COUNT()描述,可以得到不同的查询结 果。

模糊查询 like ‘%积分%’ not like ‘%积分%’
_: 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句
mysql> show variables like ‘%char%’; 下划线占位符
https://blog.csdn.net/livebecauseofyou/article/details/79267767

**in ()**表示一个范围 not in()

select goods_id,cat_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cat_id);

between int and int; 一个连续的范围

select goods_id,goods_name from goods where goods_id between 25 and 30;

子查询:(嵌套select作为返回值)
where子查询(重点)

select goods_id,goods_name from goods where goods_id=(select max(goods_id) from goods );

select * from goods group by cat_id;分组打印(随机打印第一个)

from子查询
from (select虚拟的结果表)

 select goods_id,goods_name from (select * from goods where 1 order by cat_id asc,goods_id desc) as tmp group by cat_id;

exists子查询(两张表综合查询,where后,显示一张表的内容)

select * from category where exists (select * from goods where goods.cat_id=category.cat_id);

连接:
内连接(from后,两张表的内容混合显示)
列表名1 inner join 列表名2 on 条件

select boy.hid,boy.bname,girl.hid,girl.gname from boy inner join girl on boy.hid=girl.hid;

inner join on(显示满足条件的)

左连接: left join on(以左边为主体)
右连接: right join on
(可以嵌套连接,但同样的引用相同的表需要重命名)

实例:
select //打印声明
hid,t1.tname as hname ,mres,gid,t2.tname as gname,matime //打印格式
from //表格声明
m left join t as t1 //t重命名为t1
on m.hid = t1.tid //连接条件
left join t as t2 //t重命名为t2
on m.gid = t2.tid //连接条件
where //条件声明
matime between ‘2006-06-01’ and ‘2006-07-01’; //调取条件

in,exists,内连接性能比较:
内连接>exists>in

null:
空值(Null)与空字符(’’)

null不是对象,’‘是对象
从’’,你就可以知道这是一个字符串类型的数据,是一个长度为零的字符串。
从NULL,你只能知道这里没有赋过值,是空的,他不属于任何数据类型。

空值不一定为空
  空值是一个比较特殊的字段。
空值不等于空字符
当比较表中的值是否为空时用is连接

null值也不等同于空值,空值是不占用存储空间的,null占用存储空间

拼接:
union:(查询体拼接)

select * from 表名1  union select * from 表名2;

union all:全部显示(有相同的也显示)

实例:

select
id,sum(r.num)
from
(select * from a union all select * from b) as r
group by id;

表的连接:
增加外键约束:
alter table 表名1 add constraint foreign key(中间表外键名)
references class(主键名)
on delete cascade;

select user_table.user_name, user_type_table.uer_type from user_table inner join user_type_table on user_table.user_type_id=user_type_table.user_type_id;

case when

case when sex=1 then '男'
case when sex=2 then '女'
else '其他'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值