阅读 287

数据库(MySQL)

DB、DBS、DBMS之间有什么关系?

  • DB、DBS、DBMS三者的关系是:DBS(数据库系统)包括DB(数据库)和DBMS(数据库管理系统)。数据库系统是一个通称,包括数据库、数据库管理系统、数据库管理人员等的统称,是最大的范畴。  
  • DBMS和DB的关系:DBMS数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库(DB)。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库(DB)中的数据。
  •  DBS和DB的关系:数据库系统DBS(Data Base System,简称DBS)是一个实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。它通常由软件、数据库(DB)和数据管理员(DBA)组成。


扩展资料 

数据库及数据库系统组成成分:  

  • 数据库,即存储在磁带、磁盘、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。  
  • 数据库管理系统(DBMS)。它是一组能完成描述、管理、维护数据库的程序系统。它按照一种公用的和可控制的方法完成插入新数据、修改和检索原有数据的操作。 
  • 数据库管理员(DBA),有重新组织数据的能力,能改变数据的存储结构或数据存储位置。 
  • 用户和应用程序,具有可修改性和可扩充性。

参考资料:

百度百科—DBMS

百度百科—DBS

百度百科—数据库

数据库的基本概念

  • 数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。存储、维护和管理数据的集合。
  • 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
  •  注意:通常情况下,经常会用数据库来表示他们使用的数据库软件,这经常会引起混淆,确切的说,数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。

常见数据库管理系统

  • Oracle:目前比较成功的关系型数据库管理系统。运行稳定、功能齐全、性能超群、技术领先。主要应用在大型的企业数据库领域。
  •  MySQL:免费的数据库系统。被广泛用于中小型应用系统。体积小、速度快、总体拥有成本低,开放源代码。2008年被SUN收购,2009年SUN被Oracle收购。
  •  SQL Server:Microsoft的产品。软件界面友好、易学易用,在操作性和交互性方面独树一帜。 
  • PostgreSQL:加州大学伯克利分校以教学目的开发的数据库系统,支持关系和面向对象的数据库,属于自由数据库管理系统。
  •  DB2:IBM的产品。

数据库服务器、数据库和表的关系 

  • 所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。 
  • 为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。 
  • 数据库服务器、数据库和表的关系如图所示: 


如何操作数据库 

  • 数据库管理系统可以通过SQL(结构化查询语言)来定义和操作数据,维护数据的完整性和安全性,以及进行各种数据库的管理等。 

什么是SQL 

  • SQL:Structure Query Language。 
  • SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。 
  • SQL优点: 
  1. 不是某个特定数据库供应商专有的语言。几乎所有重要的数据库管理系统都支持SQL。
  2.  简单易学,该语言的语句都是由描述性很强的英语单词组成,且这些单词的数目不多。 
  3. 高度非过程化,即用SQL操作数据库,只需指出“做什么”,无须指明“怎么做”,存取路径的选择和操作的执行由DBMS自动完成。 

SQL的分类 

  • 它所支持的SQL提供以下功能: 
  1. DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
  2. DML(Data Manipulation Language):数据操作语言,用来操作数据库表中的记录(数据);  
  3. DQL(Data Query Language):数据查询语言,用来查询记录(数据)。 
  4. DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;

操作数据表

  • 语法:

create table 表名(
				字段1 字段类型,
				字段2 字段类型,
				...
				字段n 字段类型
			);
复制代码

  • 常用数据类型:

    • int:整型 
    •  double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数即最大值为999.99; 
    •  char:固定长度字符串类型; char(10) 'abc ' varchar:可变长度字符串类型;varchar(10) 'abc' 
    •  text:字符串类型; 
    •  blob:字节类型;
    • date:日期类型,格式为:yyyy-MM-dd; 
    •  time:时间类型,格式为:hh:mm:ss 
    •  timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值 
    •  datetime:日期时间类型 yyyy-MM-dd hh:mm:ss
      • 当前数据库中的所有表 SHOW TABLES;
      •  查看表的字段信息 DESC employee;
      • 在上面员工表的基本上增加一个image列。 ALTER TABLE employee ADD image blob;
      • 修改job列,使其长度为60。 ALTER TABLE employee MODIFY job varchar(60);
      • 删除image列,一次只能删一列。 ALTER TABLE employee DROP image;
      • 表名改为user。 RENAME TABLE employee TO user; 
      • 查看表格的创建细节。 SHOW CREATE TABLE user;
      • 修改表的字符集为gbk ALTER TABLE user CHARACTER SET gbk;
      • 列名name修改为username ALTER TABLE user CHANGE name username varchar(100);
      • 删除表 DROP TABLE user ;

DDL数据定义语言 

  • DDL:Data Definition Language 
  • 作用:用于描述数据库中要存储的现实世界实体的语言。即创建数据库和表的结构。 
  • 常用关键字: CREATE  ALTER  DROP  
创建数据库

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification [, create_specification] ...]
 
create_specification:
    [DEFAULT] CHARACTER SET charset_name //指定字符集
  | [DEFAULT] COLLATE collation_name  //指定数据库字符集的比较方式复制代码

查看、删除数据库 

查看当前数据库服务器中的所有数据库:
SHOW DATABASES

显示数据库创建语句:
SHOW CREATE DATABASE db_name

数据库删除语句:
DROP DATABASE  [IF EXISTS]  db_name 

查看当前使用的数据库
select database();

切换数据库
use mydb2;
复制代码

修改、备份、恢复数据库

ALTER  DATABASE  [IF NOT EXISTS] db_name    
	[alter_specification [, alter_specification] ...] 

alter_specification:    

    [DEFAULT] CHARACTER SET charset_name  
|   [DEFAULT] COLLATE collation_name

查看服务器中的数据库,并把mydb2的字符集修改为utf8;
 alter database mydb2 character set utf8;复制代码

创建表(基本语句) 

CREATE TABLE table_name
(
	field1  datatype,
	field2  datatype,
	field3  datatype
)character set 字符集 collate 校对规则
field:指定列名 datatype:指定列类型
复制代码

注意:创建表前,要先使用use db语句使用库。

MySQL常用数据类型 

分类数据类型说明

数值类型BIT(M)
TINYINT [UNSIGNED] [ZEROFILL] 
BOOL,BOOLEAN 
SMALLINT [UNSIGNED] [ZEROFILL] 
INT [UNSIGNED] [ZEROFILL] 
BIGINT [UNSIGNED] [ZEROFILL] 
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 位类型。M指定位数,默认值1,范围1-64
带符号的范围是-128到127。无符号0到255。
使用0或1表示真或假
2的16次方
2的32次方
2的64次方
M指定显示长度,d指定小数位数
表示比float精度更大的小数

文本、二进制类型CHAR(size) char(20)
VARCHAR(size)  varchar(20)
BLOB   LONGBLOB
TEXT(clob)          LONGTEXT(longclob)固定长度字符串
可变长度字符串
二进制数据
大文本时间日期DATE/DATETIME/TimeStamp日期类型(YYYY-MM-DD)  (YYYY-MM-DD HH:MM:SS),TimeStamp表示时间戳,它可用于自动记录insert、update操作的时间复制代码

修改表 

使用 ALTER TABLE 语句追加, 修改, 或删除列的语法。

ALTER TABLE table_name
ADD		   (column datatype [DEFAULT expr]
		   [, column datatype]...);
复制代码

ALTER TABLE table_name
MODIFY	   column datatype [DEFAULT expr]
		   [, column datatype]...;
复制代码

ALTER TABLE table_name
DROP	      (column);
复制代码

  • 修改表的名称:Rename table 表名 to 新表名 
  • 修改表的字符集:alter table student character set utf8;

DML数据操纵语言  

  • DML:Data Manipulation Language 
  • 作用:用于向数据库表中插入、删除、修改数据。 不要与DDL混淆了。

  • 常用关键字: INSERT UPDATE  DELETE
  • 在mysql中,字符串类型和日期类型都要用单引号括起来。'tom' '2015-09-04' 空值:null 

Insert语句 

  • 使用 INSERT 语句向表中插入数据。

INSERT INTO	table [(column [, column...])]
VALUES		(value [, value...]);
复制代码

  • 插入的数据应与字段的数据类型相同。
  • 数据的大小应在列的规定范围内,值不要超出列定义的长度。例如:不能将一个长度为80的字符串加入到长度为40的列中。 
  • 列名与列值的类型、个数、顺序要一一对应。 
  • 插入的字符和日期型数据应包含在单引号中。 
  • 插入空值,请使用(null)不指定或insert into table value(null) 

mysql中文乱码 

  mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。 

  • client是客户端使用的字符集。  
  • connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。 
  •  database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。 
  •  results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。 
  •  server是服务器安装时指定的默认字符集设定。 
  •  system是数据库系统使用的字符集设定。 

Update语句 

  • 使用 update语句修改表中数据。 

    UPDATE 	tbl_name    
    	SET col_name1=expr1 [, col_name2=expr2 ...]    
    	[WHERE where_definition]    
    复制代码

  • UPDATE语法可以用新值更新原有表行中的各列。 
  • SET子句指示要修改哪些列和要给予哪些值。 
  • WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。 

Delete语句 

  • 使用 delete语句删除表中数据。 

delete from _name       
	[WHERE where_definition]    
复制代码

  • 如果不使用where子句,将删除表中所有数据。 
  • Delete语句不能删除某一列的值(可使用update) 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。 
  • Delete删除表中的数据,表结构还在;删除后的数据可以找回 TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。 删除的数据不能找回。执行速度比DELETE快。
  • 同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。 
  • 删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档。 
  1. truncate table 不仅是删除表里面的数据,而且还会清空表里面主键的标识。也就是说使用过truncate table 的表在重新写入数据的时候,标识符会从0或1重新开始(看你设置的种子号)。
    delete * from就是仅仅能删除数据,不能清空标识。不过delete * from可以后面加Where truncate table却不能加Where。。
  2. TRUNCATE TABLE 和不带 WHERE 的 DELETE 功能是一样的,都是删除表中的所有数据,不过 TRUNCATE TABLE 速度更快,占用的日志更少,这是因为 TRUNCATE TABLE 直接释放数据页并且在事务日志中也只记录数据页的释放,而 DELETE 是一行一行地删除,在事务日志中要记录每一条记录的删除。
那么可不可以用 TRUNCATE TABLE 代替不带 WHERE 的 DELETE 呢?在以下情况是不行的:
  • 要保留标识的情况下不能用 TRUNCATE TABLE,因为 TRUNCATE TABLE 会重置标识
  • 需要使用触发器的情况下不能使用 TRUNCATE TABLE ,它不会激发触发器。
  • 对于由 FOREIGN KEY 约束引用的表(即主键所在的表,不是外键所在的表)不能使用 TRUNCATE TABLE。
  • 对于参与了索引视图的表不能使用 TRUNCATE TABLE ,注意指索引视图,并非普通视图。

Truncate是SQL中的一个删除数据表内容的语句,用法是:   

TRUNCATE TABLE [Table Name]复制代码

  • 具有聚集索引的视图成为索引视图;必须先为视图创建聚集索引,然后才能为该视图定义其他索引,因为在创建其他索引的时候,SQL SERVER, 会重建表是的非聚集索引。

DQL数据查询语言(简单的)

  • DQL:Data Query Language 
  • 作用:查询数据,返回结果集。 
  • 常用关键字: SELECT
  • 数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。 
  • 查询返回的结果集是一张虚拟表。

Select语句(1)

  • 基本select语句 

SELECT [DISTINCT] *|{column1, column2, column3..}FROM	table;
复制代码

  • Select 指定查询哪些列的数据。 
  • column指定列名。 
  • *号代表查询所有列。 
  • From指定查询哪张表。 
  • DISTINCT可选,指显示结果时,是否剔除重复数据 

Select语句(2)

  • 在select语句中可使用表达式对查询的列进行运算 

SELECT *|{column1|expression, column2|expression,..}FROM	table;
复制代码

  • 在select语句中可使用as语句 

SELECT column as 别名 from 表名;
复制代码

Select语句(3)

  • 在where子句中经常使用的运算符 

比较运算符>   <   <=   >=   =    <>大于、小于、大于(小于)等于、不等于BETWEEN  ...AND...显示在某一区间的值(含头含尾)IN(set)显示在in列表中的值,例:in(100,200)LIKE ‘张pattern’模糊查询IS NULL判断是否为空
逻辑运算符and多个条件同时成立or多个条件任一成立not不成立,例:where not(salary>100);复制代码

  • Like语句中,% 代表零个或多个任意字符,_ 代表一个字符,例first_name like ‘_a%’; 

Select语句(4) 

  • 使用order by 子句排序查询结果。 

SELECT column1, column2. column3..
		FROM	table;
		order by column asc|desc
复制代码

  • Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。
  •  Asc 升序、Desc 降序 
  • ORDER BY 子句应位于SELECT语句的结尾。
Select语句(5) 
  • 使用group by 子句对列进行分组

SELECT column1, column2. column3.. FROM	table;
		group by column
复制代码

  • 使用having 子句过滤 

SELECT column1, column2. column3..
		FROM	table;
		group by column having ...
复制代码

  • Having和where均可实现过滤,但在having可以使用合计函数,having通常跟在group by后,它作用于组。


DQL数据查询语言(多表查询)

  • 合并结果集;UNION 、 UNION ALL
  • 连接查询: 
    • 交叉连接(cross join):不带on子句,返回连接表中所有数据行的笛卡儿积。 
    • 内连接(inner join):返回连接表中符合连接条件及查询条件的数据行。 
    • 外连接:分为左外连接(left out join)、右外连接(right outer join)。与内连接不同的是,外连接不仅返回连接表中符合连接条件及查询条件的数据行,也返回左表(左外连接时)或右表(右外连接时)中仅符合查询条件但不符合连接条件的数据行。 
      • 左外连接 LEFT [OUTER] JOIN 
      • 右外连接 RIGHT [OUTER] JOIN 
      • 全外连接(MySQL不支持)FULL JOIN
  • 子查询 
  • 联合查询 
  • 报表查询
合并结果集
  • 作用:合并结果集就是把两个select语句的查询结果合并到一起!
  • 合并结果集有两种方式:

UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;
复制代码

UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。
复制代码

      • 要求:被合并的两个结果:列数、列类型必须相同。

连接查询

  • 连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2。
  • 连接查询的from子句的连接语法格式为:

from TABLE1 join_type TABLE2  [on (join_condition)] [where (query_condition)]    
复制代码

      • 其中,TABLE1和TABLE2表示参与连接操作的表,TABLE1为左表,TABLE2为右表。on子句设定连接条件,where子句设定查询条件,join_type表示连接类型。
交叉连接查询 
  • 交叉连接查询CUSTOMER表和ORDERS表 

SELECT * FROM customer CROSS JOIN orders;
SELECT * FROM customer,orders;
复制代码

内连接查询 

内连接的特点:查询结果必须满足条件。

  • 显式内连接:使用inner join关键字,在on子句中设定连接条件

SELECT * FROM customer c INNER JOIN orders o ON c.id=o.customer_id; 
复制代码

  • 隐式内连接:不包含inner join关键字和on关键字,在where子句中设定连接条件

SELECT * FROM customer c,orders o WHERE c.id=o.customer_id; 
复制代码

右外连接查询 

  右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。

  例如在dept表中的40部门并不存在员工,但在右连接中,如果dept表为右表,那么还是会查出40部门,但相应的员工信息为NULL。

SELECT * FROM emp e 
RIGHT OUTER JOIN dept d 
ON e.deptno=d.deptno;
复制代码

  • 使用right outer join关键字,在on子句中设定连接条件

    SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.id=o.customer_id; 
    复制代码

    • 不仅包含符合c.id=o.customer_id连接条件的数据行,还包含orders右表中的其他数据行,带查询条件的右外连接查询,在where子句中设定查询条件

      SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.id=o.customer_id WHERE o.price>250;
      复制代码

子查询 (非常重要)

  • 子查询也叫嵌套查询,是指在select子句或者where子句中又嵌入select查询语句,子查询的语句放在小括号之内。
  • 子查询出现的位置: 
    • where后,作为被查询的一条件的一部分; 
    • from后,作表;
  • 当子查询出现在where后作为条件时,还可以使用如下关键字:
    • any
    • all
  • 子查询结果集的形式: 
    • 单行单列(用于条件) 
    • 单行多列(用于条件) 
    • 多行单列(用于条件) 
    • 多行多列(用于表)
  • 查询“赵安康”的所有订单信息

SELECT * FROM orders WHERE customer_id=(SELECT id FROM customer WHERE name LIKE '%赵安康%');
复制代码

  • 工资高于zak的员工。

SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='zak')
复制代码

  • 查询工作和工资与zak完全相同的员工信息

SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename='MARTIN')
复制代码

  • 工资高于30号部门所有人的员工信息

SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)
复制代码

  • 查询员工编号为886的员工名称、员工工资、部门名称、部门地址

SELECT e.ename, e.sal, d.dname, d.loc 
FROM emp e, (SELECT dname,loc,deptno FROM dept) d 
WHERE e.deptno=d.deptno AND e.empno=886
复制代码

自连接:
  • 自己连接自己,起别名
  • 求2408员工编号、姓名、经理编号和经理姓名

SELECT e1.empno , e1.ename,e2.mgr,e2.ename 
FROM emp e1, emp e2 
WHERE e1.mgr = e2.empno AND e1.empno = 2408;复制代码

左外连接查询 

  左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。

  这么说你可能不太明白,例:其中emp表中“张三”这条记录中,部门编号为50,而dept表中不存在部门编号为50的记录,所以“张三”这条记录,不能满足e.deptno=d.deptno这条件。但在左连接中,因为emp表是左表,所以左表中的记录都会查询出来,即“张三”这条记录也会查出,但相应的右表部分显示NULL。

  • 使用left outer join关键字,在on子句中设定连接条件 

   SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.id=o.customer_id; 
复制代码

    • 不仅包含符合c.id=o.customer_id连接条件的数据行,还包含customer左表中的其他数据行 
  • 带查询条件的左外连接查询,在where子句中设定查询条件

    SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.id=o.customer_id WHERE o.price>250;   复制代码

联合查询 

  • 联合查询能够合并两条查询语句的查询结果,去掉其中的重复数据行,然后返回没有重复数据行的查询结果。联合查询使用union关键字

    SELECT * FROM orders WHERE price>200 UNION SELECT * FROM orders WHERE customer_id=1;
    复制代码

报表查询 

  • 报表查询对数据行进行分组统计,其语法格式为:

    [select …] from … [where…] [ group by … [having… ]] [ order by … ] 
复制代码

  • 其中group by 子句指定按照哪些字段分组,having子句设定分组查询条件。在报表查询中可以使用SQL函数。

聚合函数 sum avg max min count

合计函数-Count 

  • Count(列名)统计指定列不为NULL的记录行数;
  • 查询emp表中记录数: SELECT COUNT(*) AS cnt FROM emp;

Select count(*)|count(列名) from tablename
		[WHERE where_definition]  复制代码

例:
SELECT COUNT(*) FROM emp
WHERE sal > 2500;
复制代码

合计函数-SUM 

  • Sum函数返回满足where条件的行的和 

Select sum(列名){,sum(列名)…} from tablename
		[WHERE where_definition]       
复制代码

  • 注意:sum仅对数值起作用,否则会报错
  • 注意:对多列求和,“,”号不能少。
    • 查询所有雇员月薪和,以及所有雇员佣金和
    • SELECT SUM(sal), SUM(comm) FROM emp;复制代码

合计函数-AVG 

  • AVG函数返回满足where条件的一列的平均值 

Select sum(列名){,sum(列名)…} from tablename
		[WHERE where_definition]   
复制代码

例 
SELECT AVG(sal) FROM emp;
复制代码

合计函数-MAX/MIN 

  • Max/min函数返回满足where条件的一列的最大/最小值 

Select max(列名) from tablename
		[WHERE where_definition]   复制代码

SELECT MAX(sal), MIN(sal) FROM emp;
复制代码

分组查询

  当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部门来分组。

注:凡和聚合函数同时出现的列名,一定要写在group by 之后

  •  查询每个部门的部门编号和每个部门的工资和: 

SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
复制代码

  • 查询每个部门的部门编号以及每个部门的人数: 

SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
复制代码

  • 查询每个部门的部门编号以及每个部门工资大于1500的人数: 

SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;复制代码

HAVING子句

  • 查询工资总和大于9000的部门编号以及工资和:

SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;
复制代码

  • 注:having与where的区别: 
    • 1.having是在分组后对数据进行过滤. where是在分组前对数据进行过滤。
    • 2.having后面可以使用分组函数(统计函数) where后面不可以使用分组函数。
    • WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。

LIMIT

  • LIMIT用来限定查询结果的起始行,以及总行数
    •  查询5行记录,起始行从0开始

SELECT * FROM emp LIMIT 0, 5;
复制代码

    • 注意,起始行从0开始,即第一行开始!
  • 查询10行记录,起始行从3开始 

SELECT * FROM emp LIMIT 3, 10;
复制代码

分页查询
  • 查询语句书写顺序:select – from- where- group by- having- order by-limit 
  • 查询语句执行顺序:from - where -group by - having - select - order by-limit

模糊查询:

查询姓名由5个字母构成的学生记录 :

SELECT * FROM stu WHERE sname LIKE '_____'; 
复制代码

  • 模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。

查询姓名由5个字母构成,并且第5个字母为“i”的学生记录 :

SELECT * FROM stu WHERE sname LIKE '____i';
复制代码

查询姓名中第2个字母为“i”的学生记录 :

SELECT * FROM stu WHERE sname LIKE '_i%';
复制代码

查询姓名中包含“a”字母的学生记录 :

SELECT * FROM stu WHERE sname LIKE '%a%';
复制代码

去除重复记录 :

  去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如emp表中zak字段就存在相同的记录。当只查询emp表的zak字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINCT:

 SELECT DISTINCT zak FROM emp;
复制代码

求和 :

  因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。

 SELECT *,sal+comm FROM emp;
复制代码

  comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL:

 SELECT *,sal+IFNULL(comm,0) FROM emp;
复制代码

给列名添加别名 :

   在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total: 

SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
复制代码

   给列起别名时,是可以省略AS关键字的: 

SELECT *,sal+IFNULL(comm,0) total FROM emp;
复制代码

排序 order by 列名 asc(默认) desc :

  查询所有学生记录,按年龄升序排序 

SELECT * FROM stu ORDER BY sage ASC;
复制代码

 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序

SELECT * FROM emp ORDER BY sal DESC,empno ASC;
复制代码

数据完整性

  • 作用:数据完整性是为了保证用户插入的数据是正确的,它防止了用户可能的输入错误。
  • 确保数据的完整性 = 在创建表时给表中添加约束。
    • 数据完整性主要分为以下三类:
  1. 实体完整性: 即表中的一行(即每一条记录)在表中是唯一的实体。实体完整性通过表的主键来实现。
    1. 实体完整性的作用:标识每一行数据不重复。
    2. 约束类型: 主键约束(primary key) 唯一约束(unique) 自动增长列(auto_increment)
  2. 域完整性: 指数据库表的列(即字段)必须符合某种特定的数据类型或约束。比如NOT NULL。
  3. 参照完整性: 保证一个表的外键和另一个表的主键对应。

实体完整性:

主键约束(primary key):

  注:每个表中要有一个主键。 特点:数据唯一,且不能为null

第一种添加方式: 

CREATE TABLE student( id int primary key, name varchar(50) );
复制代码

第二种添加方式:此种方式优势在于,可以创建联合主键 

CREATE TABLE student( id int, name varchar(50), primary key(id) ); 
复制代码

CREATE TABLE student( classid int, stuid int, name varchar(50), primary key(classid,stuid) );
复制代码

第三种添加方式: 

CREATE TABLE student( id int, name varchar(50) );
ALTER TABLE student  ADD  PRIMARY  KEY (id);复制代码

唯一约束(unique):

  特点:数据不能重复。

CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);
复制代码

自动增长列(auto_increment)  

  给主键添加自动增长的数值,列只能是整数类型。

CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);

INSERT INTO student(name) values(‘tom’);
复制代码

域完整性:

  • 域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较 域代表当前单元格。
  • 域完整性约束:数据类型  非空约束(not null) 默认值约束(default) check约束(mysql不支持)check(sex='男' or sex='女')
    • 数据类型:(数值类型、日期类型、字符串类型)
    • 非空约束:not null

CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10)
);

INSERT INTO student values(1,’tom’,null);
复制代码

  • 默认值约束 default

CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10) default ‘男’
);

insert into student1 values(1,'tom','女');
insert into student1 values(2,'jerry',default);复制代码

参照完整性(引用完整性):

  • 外键约束:FOREIGN KEY 

CREATE TABLE student(
sid int pirmary key,
name varchar(50) not null,
sex varchar(10) default ‘男’
);

create table score(
	id int,
	score int,
	sid int , -- 外键列的数据类型一定要与主键的类型一致
	CONSTRAINT fk_score_sid foreign key (sid) references student(id)
);
复制代码

  • 第二种添加外键方式。

ALTER TABLE score1 ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);复制代码

定义表的约束

  • 定义主键约束
    • primary key:不允许为空,不允许重复
      • 删除主键:alter table tablename drop primary key ;
  • 定义主键自动增长 auto_increment
  • 定义唯一约束 unique
  • 定义非空约束 not null
  • 定义外键约束 constraint ordersid_FK foreign key(ordersid) references orders(id),

数据的备份与恢复 

  • 生成SQL脚本 导出数据
    • 在控制台使用mysqldump命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。
    • mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径注意,mysqldump命令是在Windows控制台下执行,无需登录mysql!!!
  • 执行SQL脚本 恢复数据
    • 前提:必须先创建数据库名
    • 执行SQL脚本需要登录mysql,然后进入指定数据库,才可以执行SQL脚本!!! 执行SQL脚本不只是用来恢复数据库,也可以在平时编写SQL脚本,然后使用执行SQL 脚本来操作数据库!大家都知道,在黑屏下编写SQL语句时,就算发现了错误,可能也不能修改了。所以我建议大家使用脚本文件来编写SQL代码,然后执行之!

        SOURCE C:\mydb1.sq复制代码
    • 注意,在执行脚本时需要先行核查当前数据库中的表是否与脚本文件中的语句有冲突!例如在脚本文件中存在create table a的语句,而当前数据库中已经存在了a表,那么就会出错!
  • 还可以通过下面的方式来执行脚本文件:
    • mysql –u用户名 –p密码 数据库<要执行脚本文件路径

        mysql -uroot -p123 mydb1<c:\mydb1.sql
复制代码

  • 这种方式无需登录mysql! 注意:在CMD下 命令不能加;




PS:如对您有所帮助,请给个大拇指~ 3q。

  总结的知识点因为时间有限,某些地方可能不严谨,敬请谅解。

  记录这些只是为了查漏补缺,加深记忆,提高自己的技术。

  




关注下面的标签,发现更多相似文章
评论