MySQL数据库:SQL语言基础_第1页
MySQL数据库:SQL语言基础_第2页
MySQL数据库:SQL语言基础_第3页
MySQL数据库:SQL语言基础_第4页
MySQL数据库:SQL语言基础_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MySQL数据库:SQL语言基础数据库基础概念1.数据库与数据表数据库是用于存储和管理数据的系统,它允许用户以结构化的方式存储、检索和更新数据。在数据库中,数据通常被组织成一个或多个数据表。每个数据表都包含一系列的行和列,行代表数据记录,列则定义了数据的字段,即数据的类型和属性。1.1数据库与数据表的创建在MySQL中,创建数据库和数据表是通过SQL语句完成的。下面是一个创建数据库和数据表的例子:--创建数据库

CREATEDATABASEIFNOTEXISTSmy_database;

--使用数据库

USEmy_database;

--创建数据表

CREATETABLEIFNOTEXISTSusers(

idINTAUTO_INCREMENTPRIMARYKEY,

usernameVARCHAR(50)NOTNULL,

passwordVARCHAR(50)NOTNULL,

emailVARCHAR(100),

created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP

);在这个例子中,我们首先创建了一个名为my_database的数据库。然后,我们创建了一个名为users的数据表,其中包含id、username、password、email和created_at等字段。id字段被设置为自动递增的主键,username和password字段被设置为不可为空。1.2数据表的使用数据表一旦创建,就可以用来存储数据。插入数据、查询数据、更新数据和删除数据都是通过SQL语句完成的。插入数据INSERTINTOusers(username,password,email)

VALUES('john_doe','password123','john@');查询数据SELECT*FROMusersWHEREusername='john_doe';更新数据UPDATEusersSETpassword='new_password'WHEREusername='john_doe';删除数据DELETEFROMusersWHEREusername='john_doe';2.数据类型与字段属性在MySQL中,数据类型定义了字段可以存储的数据的种类,而字段属性则定义了数据的存储方式和约束条件。2.1常见的数据类型INT:用于存储整数。VARCHAR:用于存储可变长度的字符串。TIMESTAMP:用于存储日期和时间。FLOAT:用于存储浮点数。BOOLEAN:用于存储布尔值,即真或假。2.2字段属性NOTNULL:字段不能为NULL。AUTO_INCREMENT:字段自动递增。PRIMARYKEY:字段是主键,用于唯一标识表中的每一行。DEFAULT:字段的默认值。UNIQUE:字段的值必须是唯一的。2.3数据类型与字段属性的示例在创建数据表时,我们可以指定字段的数据类型和属性。下面是一个示例:CREATETABLEIFNOTEXISTSproducts(

product_idINTAUTO_INCREMENTPRIMARYKEY,

nameVARCHAR(100)NOTNULL,

priceFLOATDEFAULT0.0,

stockINTDEFAULT0,

created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP

);在这个例子中,product_id字段被设置为自动递增的主键,name字段被设置为不可为空,price和stock字段被设置为默认值为0,created_at字段被设置为默认值为当前时间戳。SQL语言入门3.数据查询基础3.11.SELECT语句原理:SELECT语句用于从数据库中选取数据。可以选取单个列或多个列。内容:使用SELECT语句时,需要指定从哪个表中选取数据,以及选取哪些列。--选取所有列

SELECT*FROM表名;

--选取特定列

SELECT列名1,列名2FROM表名;示例:假设我们有一个名为employees的表,其中包含id,name,department,salary等列。--查询所有员工的姓名和部门

SELECTname,departmentFROMemployees;3.22.WHERE子句原理:WHERE子句用于过滤结果,只返回满足指定条件的行。内容:WHERE子句可以使用各种比较运算符和逻辑运算符。--比较运算符

SELECT*FROM表名WHERE列名比较运算符值;

--逻辑运算符

SELECT*FROM表名WHERE条件1AND条件2;

SELECT*FROM表名WHERE条件1OR条件2;

SELECT*FROM表名WHERENOT条件;示例:从employees表中选取所有部门为“销售”且工资大于5000的员工。SELECT*FROMemployeesWHEREdepartment='销售'ANDsalary>5000;3.33.ORDERBY子句原理:ORDERBY子句用于对结果集进行排序。内容:可以按升序(ASC)或降序(DESC)排序。--升序排序

SELECT*FROM表名ORDERBY列名ASC;

--降序排序

SELECT*FROM表名ORDERBY列名DESC;示例:从employees表中选取所有员工,并按工资降序排序。SELECT*FROMemployeesORDERBYsalaryDESC;3.44.GROUPBY子句原理:GROUPBY子句用于将数据分组,通常与聚合函数一起使用。内容:可以使用COUNT,SUM,AVG,MAX,MIN等聚合函数。--使用GROUPBY和聚合函数

SELECT列名,COUNT(*)FROM表名GROUPBY列名;

SELECT列名,SUM(数值列)FROM表名GROUPBY列名;示例:计算每个部门的员工总数。SELECTdepartment,COUNT(*)FROMemployeesGROUPBYdepartment;4.数据插入与更新4.11.INSERT语句原理:INSERT语句用于向表中插入新行。内容:可以指定要插入的列,以及对应的值。--插入新行

INSERTINTO表名(列名1,列名2,...)VALUES(值1,值2,...);示例:向employees表中插入一名新员工。INSERTINTOemployees(id,name,department,salary)VALUES(1,'张三','销售',6000);4.22.UPDATE语句原理:UPDATE语句用于修改表中已存在的行。内容:需要指定要修改的列和新的值,以及WHERE子句来确定哪些行将被修改。--更新数据

UPDATE表名SET列名1=新值1,列名2=新值2,...WHERE条件;示例:将所有销售部门员工的工资增加10%。UPDATEemployeesSETsalary=salary*1.1WHEREdepartment='销售';4.33.DELETE语句原理:DELETE语句用于从表中删除行。内容:可以使用WHERE子句来指定要删除的行。--删除行

DELETEFROM表名WHERE条件;示例:从employees表中删除所有工资低于3000的员工。DELETEFROMemployeesWHEREsalary<3000;4.4结论通过上述示例,我们了解了SQL语言中数据查询、插入、更新和删除的基本操作。这些操作是管理数据库数据的核心,掌握它们对于任何数据库管理员或开发人员来说都是至关重要的。在实际应用中,这些语句可以组合使用,以实现更复杂的数据操作和查询需求。数据查询进阶5.条件筛选与排序在进行数据查询时,我们经常需要根据特定条件筛选数据,以及对查询结果进行排序,以满足不同的业务需求。MySQL提供了WHERE子句用于条件筛选,ORDERBY子句用于结果排序。5.1条件筛选使用WHERE子句WHERE子句允许我们在SELECT语句中指定一个条件,只有满足这个条件的记录才会被返回。条件可以是简单的比较,也可以是复杂的逻辑表达式。示例:假设我们有一个employees表,包含id,name,department,salary等字段。下面的查询将返回所有部门为“销售”且工资大于5000的员工信息。--查询销售部门且工资大于5000的员工

SELECTid,name,department,salary

FROMemployees

WHEREdepartment='销售'ANDsalary>5000;使用IN和BETWEEN子句IN子句用于匹配一个字段值是否在指定的列表中,BETWEEN子句用于匹配一个字段值是否在指定的两个值之间。示例:查询employees表中,部门在“销售”和“市场”中的员工信息。--使用IN子句

SELECTid,name,department,salary

FROMemployees

WHEREdepartmentIN('销售','市场');查询工资在4000到6000之间的员工信息。--使用BETWEEN子句

SELECTid,name,department,salary

FROMemployees

WHEREsalaryBETWEEN4000AND6000;使用LIKE子句LIKE子句用于在WHERE子句中搜索列中的指定模式。可以使用通配符%和_。示例:查询名字以“张”开头的员工信息。--使用LIKE子句

SELECTid,name,department,salary

FROMemployees

WHEREnameLIKE'张%';5.2结果排序使用ORDERBY子句ORDERBY子句用于对结果集进行排序。可以按升序(ASC)或降序(DESC)排序。示例:查询所有员工信息,并按工资降序排列。--使用ORDERBY子句

SELECTid,name,department,salary

FROMemployees

ORDERBYsalaryDESC;6.聚合函数与分组在处理大量数据时,我们经常需要对数据进行汇总分析,如计算平均值、最大值、最小值等。MySQL提供了聚合函数如SUM,AVG,MAX,MIN,COUNT等,以及GROUPBY子句用于分组数据。6.1聚合函数SUM函数SUM函数用于计算指定列的总和。示例:计算employees表中所有员工的工资总和。--使用SUM函数

SELECTSUM(salary)AStotal_salary

FROMemployees;AVG函数AVG函数用于计算指定列的平均值。示例:计算employees表中所有员工的平均工资。--使用AVG函数

SELECTAVG(salary)ASaverage_salary

FROMemployees;MAX和MIN函数MAX和MIN函数分别用于计算指定列的最大值和最小值。示例:找出employees表中工资最高的员工。--使用MAX函数

SELECTname,salary

FROMemployees

WHEREsalary=(SELECTMAX(salary)FROMemployees);找出employees表中工资最低的员工。--使用MIN函数

SELECTname,salary

FROMemployees

WHEREsalary=(SELECTMIN(salary)FROMemployees);COUNT函数COUNT函数用于计算表中的行数,可以是所有行,也可以是满足特定条件的行。示例:计算employees表中总共有多少员工。--使用COUNT函数

SELECTCOUNT(*)AStotal_employees

FROMemployees;计算employees表中部门为“销售”的员工数量。--使用COUNT函数和WHERE子句

SELECTCOUNT(*)ASsales_employees

FROMemployees

WHEREdepartment='销售';6.2分组数据使用GROUPBY子句GROUPBY子句用于将数据分组,通常与聚合函数一起使用,以对每个组进行汇总分析。示例:计算每个部门的平均工资。--使用GROUPBY子句

SELECTdepartment,AVG(salary)ASaverage_salary

FROMemployees

GROUPBYdepartment;使用HAVING子句HAVING子句用于过滤GROUPBY子句生成的组,只显示满足条件的组。示例:找出平均工资大于5000的部门。--使用HAVING子句

SELECTdepartment,AVG(salary)ASaverage_salary

FROMemployees

GROUPBYdepartment

HAVINGAVG(salary)>5000;通过上述示例,我们可以看到如何在MySQL中使用WHERE,ORDERBY,GROUPBY和HAVING子句,以及聚合函数SUM,AVG,MAX,MIN,COUNT来筛选、排序和汇总数据,以满足复杂的数据分析需求。数据表操作7.创建与修改数据表在MySQL数据库中,数据表是存储数据的基本结构。创建和修改数据表是数据库管理的重要组成部分,涉及到SQL语言的使用。7.1创建数据表创建数据表使用CREATETABLE语句。下面是一个创建数据表的例子,我们将创建一个名为employees的表,包含id、name、department和salary四个字段。--创建employees表

CREATETABLEemployees(

idINTAUTO_INCREMENTPRIMARYKEY,--自增的主键

nameVARCHAR(50)NOTNULL,--员工姓名,不可为空

departmentVARCHAR(50),--部门名称

salaryDECIMAL(10,2)--薪水,最多10位数,小数点后2位

);7.2修改数据表修改数据表使用ALTERTABLE语句。这可以用于添加、修改或删除字段,以及更改表的其他属性。添加字段--向employees表添加一个email字段

ALTERTABLEemployees

ADDCOLUMNemailVARCHAR(100);修改字段--修改employees表中的salary字段,增加NOTNULL约束

ALTERTABLEemployees

MODIFYCOLUMNsalaryDECIMAL(10,2)NOTNULL;删除字段--从employees表中删除department字段

ALTERTABLEemployees

DROPCOLUMNdepartment;8.删除数据表当数据表不再需要时,可以使用DROPTABLE语句来删除它。删除数据表将永久删除表中的所有数据和表结构,因此在执行此操作前应谨慎。--删除employees表

DROPTABLEemployees;删除数据表是一个不可逆的操作,如果需要保留数据,应该在删除前进行备份。以上内容详细介绍了如何在MySQL数据库中进行数据表的创建、修改和删除操作。通过CREATETABLE、ALTERTABLE和DROPTABLE语句,可以灵活地管理数据库结构,满足不同场景下的需求。数据完整性与约束9.主键与唯一约束9.1主键约束主键(PrimaryKey)是数据库表中用于唯一标识每条记录的字段或字段组合。在MySQL中,一个表只能有一个主键,但主键可以由一个或多个字段组成。主键字段不允许有重复值,并且不能为NULL。创建主键创建表时,可以使用PRIMARYKEY关键字来定义主键:CREATETABLEemployees(

idINTAUTO_INCREMENT,

nameVARCHAR(50),

departmentVARCHAR(50),

PRIMARYKEY(id)

);在上述例子中,id字段被定义为主键,它将自动递增,确保每条记录的id都是唯一的。修改主键如果需要在现有表中添加主键,可以使用ALTERTABLE语句:ALTERTABLEemployees

ADDPRIMARYKEY(id);9.2唯一约束唯一约束(UniqueConstraint)确保表中的某个字段或字段组合的值是唯一的,但与主键不同,它可以包含NULL值,并且一个表可以有多个唯一约束。创建唯一约束在创建表时,可以使用UNIQUE关键字来定义唯一约束:CREATETABLEproducts(

product_idINTAUTO_INCREMENT,

product_nameVARCHAR(50),

categoryVARCHAR(50),

UNIQUE(product_name)

);在上述例子中,product_name字段被定义为唯一约束,这意味着每个产品名称在表中只能出现一次。修改唯一约束如果需要在现有表中添加唯一约束,可以使用ALTERTABLE语句:ALTERTABLEproducts

ADDUNIQUE(product_name);10.外键与引用完整性10.1外键约束外键(ForeignKey)用于在两个表之间建立关系,它引用了另一个表的主键或唯一约束。外键约束确保了引用完整性的规则,即外键字段的值必须在被引用的表中存在,或者为NULL。创建外键在创建表时,可以使用FOREIGNKEY关键字来定义外键:CREATETABLEorders(

order_idINTAUTO_INCREMENT,

product_idINT,

customer_idINT,

PRIMARYKEY(order_id),

FOREIGNKEY(product_id)REFERENCESproducts(product_id),

FOREIGNKEY(customer_id)REFERENCEScustomers(customer_id)

);在上述例子中,orders表的product_id和customer_id字段分别引用了products表和customers表的主键。修改外键如果需要在现有表中添加外键,可以使用ALTERTABLE语句:ALTERTABLEorders

ADDFOREIGNKEY(product_id)REFERENCESproducts(product_id);10.2引用完整性引用完整性(ReferentialIntegrity)是数据库中的一种约束,它确保了外键引用的主键或唯一约束在被引用的表中存在。如果违反了引用完整性,如删除了被引用的记录,数据库将阻止操作,除非同时更新或删除所有引用该记录的外键。示例:删除产品时检查引用完整性假设我们有以下数据:INSERTINTOproducts(product_id,product_name)VALUES(1,'Laptop');

INSERTINTOorders(order_id,product_id,customer_id)VALUES(1,1,100);如果尝试删除产品ID为1的记录,但该产品在orders表中被引用,MySQL将阻止删除操作,除非我们首先更新或删除所有相关的订单记录。--尝试删除产品ID为1的记录

DELETEFROMproductsWHEREproduct_id=1;这将导致错误,因为product_id在orders表中被引用。为了解决这个问题,我们可以先删除或更新orders表中的相关记录:DELETEFROMordersWHEREproduct_id=1;然后,我们可以安全地删除products表中的产品记录:DELETEFROMproductsWHEREproduct_id=1;或者,我们可以在删除products表记录时使用ONDELETECASCADE选项,这将自动删除所有引用该记录的外键:ALTERTABLEorders

ADDFOREIGNKEY(product_id)REFERENCESproducts(product_id)ONDELETECASCADE;

--现在可以删除产品,所有相关订单将被自动删除

DELETEFROMproductsWHEREproduct_id=1;通过使用主键、唯一约束和外键,我们可以确保数据库中的数据完整性,避免数据冗余和不一致,从而提高数据的质量和可靠性。数据管理高级功能11.事务处理11.1事务的概念事务(Transaction)是数据库操作的基本单位,它确保一系列操作要么全部成功,要么全部失败,从而保持数据的一致性和完整性。在MySQL中,事务支持ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。11.2事务的使用在MySQL中,可以使用STARTTRANSACTION、COMMIT和ROLLBACK语句来管理事务。示例:使用事务进行转账操作假设我们有两个账户,account1和account2,我们想要从account1转账100元到account2。--开始事务

STARTTRANSACTION;

--更新account1的余额

UPDATEaccountsSETbalance=balance-100WHEREaccount_id=1;

--更新account2的余额

UPDATEaccountsSETbalance=balance+100WHEREaccount_id=2;

--提交事务

COMMIT;如果在更新account2的余额前,数据库遇到问题,我们可以使用ROLLBACK来撤销所有更改,确保数据的一致性。11.3事务的隔离级别MySQL支持四种事务隔离级别:READUNCOMMITTED、READCOMMITTED、REPEATABLEREAD和SERIALIZABLE。不同的隔离级别可以控制事务之间的并发性和数据的一致性。示例:设置事务隔离级别--设置事务隔离级别为REPEATABLEREAD

SETSESSIONTRANSACTIONISOLATIONLEVELREPEATABLEREAD;12.存储过程与函数12.1存储过程存储过程(StoredProcedure)是预编译的SQL语句集合,存储在数据库中,可以接受输入参数,返回输出参数,甚至可以包含复杂的逻辑控制结构。使用存储过程可以提高代码的重用性,减少网络流量,提高安全性。创建存储过程DELIMITER//

CREATEPROCEDURETransferMoney(INfrom_accountINT,INto_accountINT,INamountDECIMAL(10,2))

BEGIN

DECLAREv_from_balanceDECIMAL(10,2);

DECLAREv_to_balanceDECIMAL(10,2);

--开始事务

STARTTRANSACTION;

--获取from_account的余额

SELECTbalanceINTOv_from_balanceFROMaccountsWHEREaccount_id=from_account;

--检查余额是否足够

IFv_from_balance>=amountTHEN

--更新from_account的余额

UPDATEaccountsSETbalance=balance-amountWHEREaccount_id=from_account;

--获取to_account的余额

SELECTbalanceINTOv_to_balanceFROMaccountsWHEREaccount_id=to_account;

--更新to_account的余额

UPDATEaccountsSETbalance=balance+amountWHEREaccount_id=to_account;

--提交事务

COMMIT;

ELSE

--如果余额不足,回滚事务

ROLLBACK;

ENDIF;

END//

DELIMITER;调用存储过程--调用TransferMoney存储过程

CALLTransferMoney(1,2,100);12.2函数函数(Function)类似于存储过程,但主要用于返回一个值。在MySQL中,可以创建用户定义的函数来执行特定的计算或操作。创建函数DELIMITER//

CREATEFUNCTIONCalculateInterest(amountDECIMAL(10,2),rateDECIMAL(5,2))

RETURNSDECIMAL(10,2)

BEGIN

DECLAREinterestDECIMAL(10,2);

SETinterest=amount*rate;

RETURNinterest;

END//

DELIMITER;调用函数--调用CalculateInterest函数

SELECTCalculateInterest(1000,0.05)ASInterest;12.3小结事务处理和存储过程与函数是MySQL数据库中重要的高级功能,它们可以提高数据处理的效率和安全性,同时简化复杂的业务逻辑。通过合理使用这些功能,可以构建更加健壮和高效的应用系统。索引与优化13.索引类型与创建索引在数据库中扮演着关键角色,它们可以显著提高数据检索的速度。在MySQL中,有多种索引类型,每种都有其特定的用途和性能特点。13.1索引类型主键索引(PrimaryKeyIndex):每个表只能有一个主键。主键索引是唯一索引的一种,不允许有重复值。主键索引自动创建,无需手动定义。唯一索引(UniqueIndex):确保索引列中的值是唯一的。可以在多个列上创建。普通索引(Index):最基本的索引类型,用于加速查询。可以在任何列上创建。全文索引(Full-textIndex):用于全文搜索,适用于大量文本数据的搜索。仅适用于CHAR、VARCHAR和TEXT类型。空间索引(SpatialIndex):用于地理数据的搜索。适用于GEOMETRY、POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON和GEOMETRYCOLLECTION类型。13.2创建索引创建索引可以通过CREATEINDEX语句或在创建表时直接定义。下面是一个创建普通索引的例子:--创建名为idx_name的索引在表table_name的column_name列上

CREATEINDEXidx_nameONtable_name(column_name);创建唯一索引的例子:--创建名为uniq_idx_name的唯一索引在表table_name的column_name列上

CREATEUNIQUEINDEXuniq_idx_nameONtable_name(column_name);13.3示例假设我们有一个employees表,其中包含id、name和email列。我们想要创建一个索引以加速对email列的查询。--创建表

CREATETABLEemployees(

idINTAUTO_INCREMENTPRIMARYKEY,

nameVARCHAR(100),

emailVARCHAR(150)

);

--创建普通索引

CREATEINDEXidx_emailONemployees(email);14.查询优化技巧查询优化是提高数据库性能的关键。以下是一些基本的查询优化技巧:14.1使用索引确保在查询中使用的列上有索引。例如,如果经常根据email列查询employees表,确保email列有索引。14.2避免使用SELECT*尽量指定需要的列,而不是使用SELECT*。这可以减少数据传输量,提高查询速度。14.3使用EXPLAINEXPLAIN语句可以帮助理解查询的执行计划,从而找出性能瓶颈。--使用EXPLAIN查看查询计划

EXPLAINSELECT*FROMemployeesWHEREemail='example@';14.4优化JOIN操作确保JOIN操作中使用的列有索引。使用INNERJOIN而非OUTERJOIN,除非确实需要后者。14.5示例假设我们有两个表employees和departments,并且经常需要查询特定部门的员工信息。--创建departments表

CREATETABLEdepartments(

idINTAUTO_INCREMENTPRIMARYKEY,

nameVARCHAR(100)

);

--创建employees表,包含部门ID

CREATETABLEemployees(

idINTAUTO_INCREMENTPRIMARYKEY,

nameVARCHAR(100),

department_idINT,

FOREIGNKEY(department_id)REFERENCESdepartments(id)

);

--创建索引

CREATEINDEXidx_department_idONemployees(department_id);

--查询特定部门的员工

EXPLAINSELECT,ASdepartment_name

FROMemployeese

JOINdepartmentsdONe.department_id=d.id

WHERE='Sales';通过使用EXPLAIN,我们可以检查是否使用了索引,以及查询的执行计划是否高效。如果发现性能问题,可以考虑调整索引策略或查询结构。以上内容详细介绍了MySQL数据库中索引的类型与创建方法,以及如何通过优化查询来提高数据库性能。通过合理使用索引和遵循查询优化技巧,可以显著提升数据检索的速度和效率。数据库安全与权限15.用户管理与权限分配在MySQL数据库中,用户管理与权限分配是确保数据安全的关键步骤。通过创建用户账户并分配适当的权限,可以控制谁可以访问数据库,以及他们可以执行哪些操作。15.1创建用户账户--创建一个名为user1的用户,密码为password1

CREATEUSER'user1'@'localhost'IDENTIFIEDBY'password1';15.2授予权限权限可以

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论