数据库就是存储数据的仓库,  --默认属于

作者: www.9159.com  发布:2019-11-22

建库

1,数据库的生命周期:
需求分析(需求说明书) -- 逻辑设计(E-R) -- 物理设计(表结构) -- 数据库实现(范式化) -- 数据修改(索引/约束) -- 数据库监控(维护)
详细可参考:

  数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。

CREATE DATABASE 数据库名

2,E-R图学习:列出一些基本信息,我也是这里学习的

  

ON[PRIMARY]  --默认属于PRIMARY主文件组,可省略

3,主键:唯一标识列
特点:字段非空
字段具有唯一性
该值不允许修改(建议|【ps:改还是有办法改的】)
每个实体只能有一个主键(建议|【ps:也可以有联合主键】)
外键:连接不同实体
作用:保持数据完整性

  mysql的dos窗口启动关闭命令:net start mysql和net stop mysql

(

4,数据库的三大范式(控制数据的冗余)
第一范式(1NF):确保每列保持原子性
第二范式(2NF): 确保表中的每列都和主键相关
第三范式(3NF): 确保每列都和主键列直接相关,而不是间接相关
详细可参阅:
【PS:博主有话说>>通过故意提供冗余数据,降低连接的复杂度,获取更快的查询时间。
此时,取消规范化也是必须的。
总的来说,性能 > 规范】

  登录命令:(1)mysql -u用户名 -p密码      (2)mysql --host=ip地址 --user=用户名 --password=密码

NAME='',  --主数据文件的逻辑名 名称

5,增删改查格式:
增:INSERT INTO 表名(列名) VALUES (值)
删:DELETE FROM 表名 WHERE 条件 【PS:条件要是没加,则删除整张表数据。谨慎操作】
改:UPDATE 表名 SET 字段 = '值' WHERE 条件 【PS:条件要是没加,则修改整张表数据。谨慎操作】

  

FILEAME='',  --主数据文件的物理名 路径 .mdf 次数据库为.ndf

查:SELECT * FROM 表名 WHERE 条件

【PS * : 表示检索指定表中的所有列】

6, GROUP BY 子句1:用于分组输出行
ORDER BY 子句2:排序【DESC | ASC】
语句1:
--解释:根据name来分组,并且根据name来排序

DOS操作数据乱码解决:

我们在dos命令行操作中文时,会报错ERROR 1366 (HY000): Incorrect string value: 'xD5xC5xC8xFD' for column 'username' at row 1

原因:因为mysql的客户端编码的问题我们的是utf8,而系统的cmd窗口编码是gbk

  解决方案(临时解决方案):修改mysql客户端编码。

  show variables like 'character%'; 查看所有mysql的编码

(1) 将客户端编码修改为gbk.

set character_set_results=gbk; / set names gbk;

以上操作,只针对当前窗口有效果,如果关闭了服务器便失效。如果想要永久修改,通过以下方式:

(2)在mysql安装目录下有my.ini文件

default-character-set=gbk 客户端编码设置                     

character-set-server=utf8 服务器端编码设置

注意:修改完成配置文件,重启服务

 

===============================================================================================================

  sql语句:

创建和修改表语句:

  CREATE    DATABASE madata;
USER madata;
/*
      创建数据表的格式
      
      create table 表名(
          列名1 数据类型 约束,
          列名2 数据类型 约束,
          列名3 数据类型 约束
      );
      创建用户表,用户编号,姓名,用户的地址
      将编号列,设置为主键约束,保证列的数据唯一性,非空性
      primary key AUTO_INCREMENT
      让主键列数据,实现自动增长
*/
CREATE TABLE users(
    uid INT PRIMARY KEY AUTO_INCREMENT,
    uname VARCHAR(20),
    usex VARCHAR(20),
    uadress VARCHAR(200)
);

 /*
    添加列,添加字段
    alter table 表名 add 列名 数据类型 约束
 */
 ALTER TABLE users ADD tel INT;
 
  /*
    修改列的约束, 在原有的列上修改
    修改列名,数据类型约束  
    alter table 表名 modify 列名 数据类型 约束
  */
ALTER TABLE users MODIFY tel VARCHAR(20);

  /*
     修改列名
     alter table 表名 change 旧列名 新列名 数据类型 约束
  */
ALTER TABLE users CHANGE tel newtell DOUBLE;

  /*
    删除列
    alter table 表名 drop 列名  
  */
DESC users;
ALTER TABLE users DROP newtell;
 
  /*
     修改表名
     rename table 表名 to 新名
  */
RENAME TABLE users TO newusers;
SHOW TABLES;

/*show tables  显示所有数据表
desc  users    查看表中结构
drop table users 删除数据表
*/
SHOW TABLES;
DESC users;
DROP TABLE users;

 

 

===============================================================================================================

增删改语句:

CREATE TABLE product(
    id INT PRIMARY KEY AUTO_INCREMENT,
    sname VARCHAR(20) NOT NULL,
    sprice DOUBLE
);

/*
   向数据表中添加数据 insert
   格式:
     insert into 表名(列名1,列名2,列名3) values (值1,值2,值3)
     注意:
        列名,表名问题
        对应问题,
         个数,数据类型
         主键id  是自动增长  不用赋值
         {添加数据格式,不考虑主键
    格式:
     insert into 表名 (列名) values (值)
     [当指定添加到20位置的时候 没有给id赋值的时候
      主键还是会自动增长(不是在2之后增长,而是在你指定id之后增长)
      效果如下:
      ]
*/
INSERT INTO product (id,sname,sprice) VALUES (1,'笔记本',5888.99);
INSERT INTO product (sname,sprice) VALUES ('电视机',1888.88);
INSERT INTO product (sname,sprice) VALUES ('apple',1888.88);
INSERT INTO product (id,sname,sprice) VALUES (20,'洗衣机',888.22)
INSERT INTO product (sname,sprice) VALUES ('手机',888);
INSERT INTO product (sname,sprice) VALUES ('',777);
/*
   添加数据格式,所有值全给出
   格式:
     insert into 表名 values (全列值)
*/
INSERT INTO product VALUES (5,'微波炉',788);

/*
   添加数据格式,批量写入
   格式:
     insert into 表名 (列名1,列名2,列名3) values (值1,值2,值3),(值1,值2,值3)
*/
INSERT INTO product (id,sname,sprice) VALUES (6,'小米',4888),
(7,'大黄蜂',7899),
(8,'红米',7854);

/*
    !!!当手动删除了所选项 添加的数据id(主键)会继续自动增长,
    缺的id(主键)可以继续指定添加数据即可
*/

/*
     update 表名 set 列1=值1,列2=值2 where 条件
     where 条件: 数据中的唯一性
*/

-- 修改电视机,价格上调到5999
UPDATE product SET sprice=5999 WHERE id=2;
UPDATE product SET sprice=5888 WHERE sname='电视机';
 
-- 修改电视机,名字改为黑白电视机,价格,100
UPDATE product SET sname='黑白电视机',sprice=100 WHERE id=2;
UPDATE product SET sname='彩色电视机',sprice=200 WHERE sname='黑白电视机';

/*
    修改条件的写法
    id=6
    id<>6  不等于
    id<=6  
    与 或 非  (&& || !)
    && and
    || or
    ! not
    
    id in (1,3,4,5,6) 包含   [表示id在13456的所有数据]
*/
-- 将笔记本的价格,和微波炉的价格,全部修改为2000
UPDATE product SET sprice=2000 WHERE id=1 OR id=5;
UPDATE product SET sprice=50000 WHERE sname='笔记本' OR sname='微波炉';

/*
  删除表中的数据
  格式:
    delete from 表名 where 条件
    
    drop table 表名 删除整个数据表
*/
-- 删除小米  删除大黄蜂
DELETE FROM product WHERE id=6;
DELETE FROM product WHERE sname='大黄蜂';

 

===============================================================================================================

查询语句:

CREATE    TABLE zhangwu(
    sid INT PRIMARY KEY AUTO_INCREMENT,
    sname VARCHAR(200) NOT NULL,
    smoney DOUBLE
);

INSERT INTO zhangwu (sid,sname,smoney) VALUES (1,'吃饭支出',350.22);
INSERT INTO zhangwu (sid,sname,smoney) VALUES (2,'服装支出',8555);
INSERT INTO zhangwu (sid,sname,smoney) VALUES (3,'普通收入',5777);
INSERT INTO zhangwu (sid,sname,smoney) VALUES (4,'饮料支出',5453);
INSERT INTO zhangwu (sid,sname,smoney) VALUES (5,'卖衣服收入',46456);
INSERT INTO zhangwu (sid,sname,smoney) VALUES (6,'吃饭支出',4654);

/*
   查询指定列的数据
   格式:
     select 列名1,列名2 from 表名
*/
SELECT zname,zmoney FROM zhangwu;

/*
  查询所有列的数据
  格式:
    select * from 表名
*/
SELECT *FROM zhangwu;

/*
   查询去掉重复记录
 SELECT DISTINCT  要查询的名字(关键字) from  表名
*/
SELECT DISTINCT sname FROM zhangwu;
SELECT DISTINCT smoney FROM zhangwu;
SHOW TABLES;
DESC zhangwu;
SELECT *FROM zhangwu;
/*
  查询重新命名列
  as 关键字
  [SELECT 要查询的名字  AS '临时更改的名字'(''可加可不加!!!) FROM  表名]
*/
SELECT sname AS '名字' FROM zhangwu;
SELECT * FROM zhangwu AS zw;
/*
  查询数据中,直接进行数学计算
  列对数字进行计算
*/
SELECT sname,smoney+1000 AS 'sum' FROM zhangwu;

-- 查询所有的吃饭支出
SELECT * FROM zhangwu WHERE sname ='吃饭支出';

-- 查询金额大于1000
SELECT * FROM zhangwu WHERE smoney >1000;

-- 查询金额在4000到7000之间
SELECT * FROM zhangwu WHERE smoney <7000 AND smoney >4000;

-- 改造成between and 方式
SELECT * FROM zhangwu WHERE smoney BETWEEN 4000 AND 7000;

-- 查询金额是 5777,8555,5453 其中一个
SELECT * FROM zhangwu WHERE smoney = 5777 OR smoney =8555 OR smoney =5453;

-- 改造成in方式
SELECT * FROM zhangwu WHERE smoney IN(5777,8555,5453);

-- like 模糊查询 配合通配符
-- 查询所有的支出
SELECT * FROM zhangwu WHERE sname LIKE '%支出%';

-- 查询账务名字,五个字符的
SELECT * FROM zhangwu WHERE sname LIKE '_____';

-- 查询账务名,不为空的
SELECT * FROM zhangwu WHERE sname IS NOT NULL;
SELECT * FROM zhangwu WHERE NOT (sname IS NULL);

/*
查询排序
*/

/*
  查询,对结果集进行排序
  升序,降序,对指定列排序
  order by 列名 [desc][asc]
  desc 降序
  asc  升序排列,可以不写
*/
-- 查询账务表,价格进行升序
SELECT * FROM zhangwu ORDER BY smoney ASC;

-- 查询账务表,价格进行降序
SELECT * FROM zhangwu ORDER BY smoney DESC;

-- 查询账务表,查询所有的支出,对金额降序排列
-- 先过滤条件 where 查询的结果再排序
SELECT * FROM zhangwu WHERE sname LIKE '%支出' ORDER BY smoney DESC;
 
 
 /*
 聚合函数查询
 */
 /*
   使用聚合函数查询计算
*/

-- count 求和,对表中的数据的个数求和  count(列名)
-- 查询统计账务表中,一共有多少条数据
SELECT COUNT(*) FROM zhangwu;
SELECT COUNT(sid) AS'个数' FROM zhangwu;

-- sum求和,对一列中数据进行求和计算 sum(列名)
-- 对账务表查询,对所有的金额求和计算
SELECT SUM(smoney) FROM zhangwu;
SELECT SUM(smoney) AS '总金额' FROM zhangwu;

-- 求和,统计所有支出的总金额
SELECT SUM(smoney) FROM zhangwu WHERE sname LIKE '%支出';
SELECT SUM(smoney) AS '支出金额' FROM zhangwu WHERE sname LIKE '%支出';

-- max min函数,对某列数据,获取最大值 最小值
SELECT MAX(smoney) FROM zhangwu;
SELECT MIN(smoney) FROM zhangwu;

-- avg 函数,计算一个列所有数据的平均数
/*如果有空值那么 就不计算进去个数  不参与计算*/
SELECT AVG(smoney) FROM zhangwu;
SELECT AVG(smoney) FROM zhangwu WHERE sname LIKE '%支出';
 
 
 
/*
分组查询
*/

/*
    查询所有的数据
    吃饭支出 共计多少
    工资收入 共计多少
    服装支出 共计多少
    股票收入 共计多少
    打麻将支出 共计多少钱
    
    分组查询:  group by 被分组的列名
    必须跟随聚合函数
    select 查询的时候,被分组的列,要出现在select 选择列的后面
*/
  SELECT SUM(zmoney),zname FROM zhangwu GROUP BY zname
 
-- 对zname内容进行分组查询求和,但是只要支出
SELECT SUM(zmoney)AS 'getsum',zname FROM zhangwu WHERE zname LIKE'%支出%'
GROUP BY zname
ORDER BY getsum DESC

-- 对zname内容进行分组查询求和,但是只要支出, 显示金额大于5000
-- 结果集是分组查询后,再次进行筛选,不能使用where, 分组后再次过滤,关键字 having
SELECT SUM(zmoney)AS 'getsum',zname FROM zhangwu WHERE zname LIKE'%支出%'
GROUP BY zname HAVING getsum>5000
/*如果没有对得到钱的名字进行临时修改  就必须把名字写全SUM(smoney)才能再次筛选 过滤
*/
SELECT SUM(smoney),sname FROM zhangwu WHERE sname LIKE '%支出' GROUP BY sname HAVING SUM(smoney)>6000;

 

===============================================================================================================
多表查询:

  • 多表的查询的方式:

* 交叉连接:

    * select * from A,B;   --- 获得的是两个表的笛卡尔积.

* 内连接: inner join -- inner 可以省略

    * 显式内连接:select * from A inner join B on 条件;

        * SELECT * FROM customer c INNER JOIN orders o ON c.cid = o.cid;

    * 隐式内连接:select * from A,B where 条件;

        * SELECT * FROM customer c ,orders o WHERE c.cid = o.cid;

* 外连接:outer join -- outer 可以省略

    * 左外连接:left outer join  -- select * from A left outer join B on 条件;

        * SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.cid = o.cid;

    * 右外连接:right outer join -- select * from A right outer join B on 条件;

        * SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.cid = o.cid;

 

多表查询的子查询:

  • 一个SQL语句查询的过程中需要依赖另一个查询语句.

SELECT * FROM customer c,orders o WHERE c.cid = o.cid AND  c.cid IN (SELECT cid FROM orders WHERE addr LIKE '贵州%');

 

SIZE=5mb,  --主数据文件初始大小

--【PS:使用group by 时,查询的非聚合函数都要在group by中】

SELECT NAME FROM USERS GROUP BY NAME ORDER BY NAME DESC

7,PIVOT: 将行旋转成列

MASSIZE=100mb,  --主数据文件增长最大值

语句2:

SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]
--这里是PIVOT第三步(选择行转列后的结果集的列)这里可以用“*”表示选择所有列,也可以只选择某些列(也就是某些天)
FROM WEEK_INCOME
--这里是PIVOT第二步骤(准备原始的查询结果,因为PIVOT是对一个原始的查询结果集进行转换操作,
--所以先查询一个结果集出来)这里可以是一个select子查询,但为子查询时候要指定别名,否则语法错误
PIVOT
(
SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])
--这里是PIVOT第一步骤,也是核心的地方,进行行转列操作。
--聚合函数SUM表示你需要怎样处理转换后的列的值,是总和(sum),
--还是平均(avg)还是min,max等等。例如如果week_income表中有两条数据并且其week都是“星期一”,
--其中一条的income是1000,另一条income是500,那么在这里使用sum,行转列后“星期一”这个列的值当然是1500了。
--后面的for [week] in([星期一],[星期二])中 for [week]就是说将week列的值分别转换成一个个列,
--也就是“以值变列”。但是需要转换成列的值有可能有很多,我们只想取其中几个值转换成列,那么怎样取呢?
--就是在in里面了,比如我此刻只想看工作日的收入,在in里面就只写“星期一”至“星期五”
--(注意,in里面是原来week列的值,"以值变列")。
--总的来说,SUM(INCOME) for [week] in([星期一],[星期二],[星期三]www.9159.com,,[星期四],[星期五],[星期六],[星期日])
--这句的意思如果直译出来,
--就是说:将列[week]值为"星期一","星期二","星期三","星期四","星期五","星期六","星期日"分别转换成列,
--这些列的值取income的总和。

FILEGROETH=15%  --主数据文件增长率

)TBL--别名一定要写

)

【PS:以下语句as的意思是给列起别名的意思】

语句3:
select [1] as 'v1',[2],[3],[4],[5],[6],[7],[8]
from (
select PublisherId
from books
) as tb_source
pivot(
count(PublisherId) for PublisherId in ([1],[2],[3],[4],[5],[6],[7],[8])
) as tb_pivot

8,ROW_NUMBER(): 返回一个唯一的序列号
【ps:要配合over(order by 列名);】

LOG ON

语句4:

SELECT ROW_NUMBER() OVER(ORDER BY ID),* FROM Books

9,PARTITION BY 子句3:用于将结果集划分为应用了ROW_NUMBER()函数的分区
每个分区的第一行都是从1开始的

(

语句5:

SELECT ROW_NUMBER() OVER(PARTITION BY PublisherId ORDER BY PublisherId) as rownumber,*
FROM Books WHERE PublisherId in (1,2,3)

10,通配符:% _ [] [^]

NAME='',  --日志文件的逻辑名

语句6:查找用户名以L开头的用户信息

SELECT * FROM USERS WHERE USERNAME LIKE 'L%'

11,聚合函数:SUM() --求和
COUNT() --求数量
MIN() -- 最小值
MAX() -- 最大值
AVG() -- 平均数
ROW_NUMBER() -- 获取序列号

12,日期函数:
CURRENT_TIMESTAMP --2017-11-23 19:11:03.320
GETDATE() --2017-11-23 19:11:03.320
DATEPART(YEAR, GETDATE()) --2017
YEAR(GETDATE()) --2017

13,表连接:
13.1 内连接: 语法1:SELECT * FROM A INNER JOIN B ON A.ID = B.AID;

FILEAME='',  --日志文件的物理名 .ldf

语法2:SELECT * FROM A, B WHERE A.ID = B.ID

【PS:以下语句是为表起别名,并且查询指定表的指定字段信息】

SIZE=5mb,  --日志文件初始大小

SELECT a.c1, b.c1 FROM A a INNER JOIN B b ON A.ID = B.AID;

13.2 外连接:
13.2.1 左连接:SELECT * FROM A LFET JOIN B ON A.ID = B.AID;
13.2.2 右连接:SELECT * FROM A RIGHT JOIN B ON A.ID = B.AID;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【PS:左连接 与 右连接 是有区别的,】详情可查看:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13.3 全连接 :SELECT * FROM 表1 FULL JOIN 表2 ON 表1.ID = 表2.表1_ID;

14,UNION JOIN :创建一个包含两个表中所有行的表
SELECT * FROM A union JOIN B ON A.ID = B.AID;
等价于:
SELECT * FROM A UNION ALL SELECT * FROM B
【PS:两表必须有相同数量的列,对应的数据类型要兼容】

15,关于空行:

MASSIZE=100mb,  --日志文件增长最大值

语句7:(查询用户名不为空的数据行)【IS NULL : 与 IS NOT NULL 相反】

SELECT * FROM USERS WHERE NAME IS NOT NULL
【PS: NAME = NULL 与 NAME IS NULL 是不一样的】

FILEGROETH=15%  --日志文件增长率

语句8:查询用户表中的用户名,若为空,则用‘未知’替代

SELECT ISNULL(Name, '未知') FROM USERS

16,BETWEEN...AND... / IN() / NOT IN() --范围性条件

17,条件逻辑运算符:AND / OR / NOT

18,创建新表1
语句9:创建一个临时表【#temp: 表名加#,表明创建临时表,否则为永久表|

)

临时表的周期:查询窗口关闭即销毁】

SELECT ID, USERNAME, LOGINID, EMAIL INTO #TEMP FROM USERS

语句10:用途:可以复制一个表结构:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * INTO USERS_L FROM USERS --复制表结构,同时复制表数据,但是无约束,无主键
SELECT * INTO USERS_L FROM USERS WHERE 1=0 --复制表结构,但是不复制表数据,无约束
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

19,操作数据:
创建表后,插入数据:使用第5点INSERT INTO;
【PS:插入的数据中,有外键列存在的话,则插入的数据在外键表中必须存在,否则插入失败。--[保证数据完整性]】

更新数据:
更新一条数据中的多个字段:

 

语句11:

UPDATE A SET NAME='JAKE',LOGINID='10001' WHERE ID = 1

删除数据:

删库  跑路

语句12:

DELETE FROM USERS WHERE ID = 1;
数据量大时,可用:TRUNCATE TABLE
【PS:TRUNCATE不执行日志操作,不支持回复删除的数据】
【网上说使用delete误删除的: 可以使用mdfview程序回复,下载地址:
【我没试过...】

DROP  DATABASE 数据库名

删表

DROP TABLE 表名

 

一个表只能有一个主键,主键约束确保了表中的行是唯一的。

表中可以没有主键。

如果两列或多列组合起来唯一的标识每一行,则该主键又称组合键。

外键是对应主键而言的,是子表中对应于主键的列,他的值要求与主表的主键或者唯一键对应。

 

常用数据类型:

二进制数据:image是C#中的byte[]类型,数量随意。binary数据量限定。

字符串类型:

char//ncher//varcher//nvarcher

text//ntext

varcher(MAX)//nvercher(MAX)

不带n的数据类型,存储英文数字是一个字节,汉子两个字节。带n的则全部两个字节。char(2个字节) nchar(2个字符(4个字节))。

不带n的长度最长8000。带n的最长可以4000。(varcher(MAX)//nvercher(MAX)最大可以四个G,在05版本之前使用text,ntext。)

不带var的表示固定长度(永远占固定的字节,自动补全字节数,浪费空间)。带var的表示可变长度。

时间数据:datetime

 

插入语句(增)

 

INSERT INTO 表名 (列名,列名) VALUES ('xx','xx')

 

删除语句(删)

 

DELETE FROM 表名

WHERE 条件

 

删除全部记录:DELETE FROM 表名  --表结构,列,索引等还将存在,自增值依然从大值递增。

删除全部数据:TRUNCATE TABLE 表名    --不能用于有外键的表,表结构,列,索引等还将存在,速度比DELETE语句快。自增值重置。不触发触发器。

 

修改语句(改)

 

UPDATE 表名

SET 列名=值,列名=值

WHERE 条件

 

搜索语句(查)

 

搜索语句的处理顺序:

FORM 表名

ON

INNER JOIN ...

WHERE 条件

GROUP BY ...

WITH CUBE或WITH ROLLUP

HAVING ...

SELSCT 列名

DISTINCT

ORDER BY ASC/DESC

TOP

 

排序查询 ORDER BY ASC/DESC

该语句必须,一定放在语句的最后。

 

分组查询 GROUP BY 列名

当使用了分组语句或聚合函数时,在select列表中不能再包含其他的列名,除非该列名在分组语句中或聚合函数中。

 

分组后判断条件 HAVING

对分组后的条件筛选必须使用HAVING子句,在GROUP BY句之前可用WHERE。

having可以使用聚合函数,但while不可。

 

联合结果集 UNION

联合要求多个结果集列的数目相同,列的数据类型兼容。

UNION会去处重复,重新排序。UNION ALL不会,节省性能。

 

SELECT 表名.列,表名.列 FORM 表名 INNER JOIN 表名 ON 条件    --内连接查询语句,INNER JOIN可简写成JOIN

 

SELECT 表名.列,表名.列 FORM 表名 LEFT/RIOGHT/FULL OUTER JOIN 表名 ON 条件

--左外链接语句,OUTER可省略,结果集会包括LEFT JOIN所指定的左表的所有行,如果左表行在右表中无匹配,将会填充为空,右连接同理。

--FULL表示完全外链接,结果集会包含左右表的所有行,当某行在另一表中没有匹配行则会包含空值。

 

查询所有列,去重复数据:SELSCT DISTINCT* FORM 表名

DISTINCT  --针对查询出的结果集去除重复

 

限制行数查询:SELSCT TOP 5 * FORM 表名 ORDER BY 列名 ASC/DESC

TOP  --常与 ORDER BY 连用,

 

关于空值查询 NULL

NULL值无法用=和<>来判断,使用IS NULL或者IS NOT NULL。

任何值与 NULL 计算,结果都是NULL。

 

模糊查询

模糊查询:SELECT 列名 LIKE '%'

_  表示任意单个字符。

%  表示任意多个字符。

【0-9】【a-z】【_】表示筛选范围,^表示排除范围。

[]  转义  ESCAPE '/' 后跟此句代表自定义转义符。

 

按百分比限制查询:SELSCT TOP 50 PERCENT * FORM 表名

 

在某个范围查询:SELECT 列名 BETWEEN '' AND ''

 

在某些值内查询:SELECT 列名 FORM 表名 IN ('','')

 

聚合函数

 

聚合函数不统计空值

查询表达式中数值的和:SELECT SUM(列名) FORM 表名 WHERE 条件

查询平均值:SELECT AVG(列名) FORM 表名 WHERE 条件

查询最小值:SELECT MIN(列名) FORM 表名 WHERE 条件

查询最大值:SELECT MAX(列名) FORM 表名 WHERE 条件

查询非空列:SELECT COUNT(列名) FORM 表名 WHERE 条件

 

类型转换函数

CAST(值 as 数据类型)

CONVERT(数据类型,值)

 

黑马公开课:

转载请联系

本文由9159.com发布于www.9159.com,转载请注明出处:  数据库就是存储数据的仓库,  --默认属于

关键词: