一、SQL概述sql是结构化查询语言(Structured Query Language,SQL)是专门用来与数 据库通信的语言,它可以帮助用户操作关系数据库。 SQL的特点: SQL不是某个特定数据库供应商专有的语言; SQL简单易学 ;SQL强大、灵活,可以进行非常复杂和高级的数据库操作 SQL的组成:
*******************数据定义语言********************** CREATE 创建数据库或数据库对象 ALTER 对数据库或数据库对象进行修改 DROP 删除数据库或数据库对象 ************数据操纵语言(Data Manipulation Language,DML)*********** SELECT 从表或视图中检索数据 INSERT 将数据插入到表或视图中 UPDATE 修改表或视图中的数据 DELETE 从表或视图中删除数据 ***************数据控制语言(Data Control Language,DCL)**************** GRANT 用于授予权限 REVOKE 用于收回权限
二、MySQL预备知识嵌入式和动态SQL规则:规定了SQL语句在高级语言程序设计中 使用的规范方法,以便适应较为复杂的应用 SQL 调 用(以便提高SQL的灵活性、有效性、共享性以及使SQL具有更多的高级语言的特征):SQL 例 程、调 用 规 则 MySQL使用基础:LAMP模式 、WAMP模式 L(Linux) A(Apache)M(MySQL) P(PHP、Perl、Python)
关系数据库管理系统(RDBMS):优点:体积小、速度快、开放源代码、遵循GPL MySQL扩展语言要素 常量:也称字面值或标量值
变量:
表达式 表达式是常量、变量、列名、复杂计算、运算符和函数的组合。
三、数据定义(DDL)创建数据库(CREATE):使用CREATE DATABASE 或 CREATE SCHEMA语句 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT]CHARACTER SET[=]charset_name |[DEFAULT]COLLATE[=]collation_name 例句:create DATABASE test_sy CHARACTER SET ="UTF8" COLLATION ="utf8_general_ci"; CREATE DATABASE mysql_test;
查看数据库(SHOW):查看数据库的所有表 SHOW {DATABASES | SCHEMAS} [LIKE’pattern’ | WHERE expr] Like关键字用于匹配指定的数据库名称; Where从句用于指定数据库名称查询范围的条件 例句:SHOW DATABASES; SHOW DATABASES LIKE "%test%"; SHOW TABLES:查看数据库非系统表
选择数据库(USE):USE db_name; 从一个数据库“跳转”到另一个数据库。 修改数据库:alert mysql>ALTER DATABASE mysql_test -> DEFAULT CHARACTER SET gb2312 -> DEFAULT COLLATE gb2312_chinese_ci; 删除数据库: DROP{DATABASE|SCHEMA}[IF EXISTS]db_name 例句:DROP DATABASE hahaha; DROP DATABASE IF EXISTS hahaha; *****************************表定义********************************** 创建表:数据表是关系数据库中最重要、最基本的数据对象, 也是数据存储的基本单位。 数据表, 被定义为字段的集合 按(行 )和(列 )的格式来存储的, 每一( 行)代表一条记录, 每一(列 )代表记录中一个字段的取值。 CREATE[TEMPORARY]TABLE tbl_name ( 字段名1 数据类型 [列级完整性约束条件][默认值] [,字段名2 数据类型 [列级完整性约束条件][默认值]] [,……] [,表级完整性约束条件] )[ENGINT=引擎类型]; 若添加“TEMPORARY”,则为临时表 在一个已有数据库mysql_test中新建一个包含客户姓名、性别、地址、 联系方式等内容的客户基本信息表,要求将客户的id号指定为该表的 主键。
PRIMARY KEY(cust_id):指定主键 数据类型:
更新表(ALTER):使用ALTER TABLE语句,增加或删减列、创建或取消索引、更改原有列的 数据类型、重新命名列或表,更改表的评注和表的引擎类型,为表重新创 建触发器、存储过程、索引和外键等。 1、ADD COLUMN 例如:向数据库mysql_test的表customers中添加一列,并命名为 cust_city,要求其不能为NULL,默认值为字符串“Wuhan”,且该列位 于原表cust_sex列之后。 ALTER TABLE mysql_test.customers ->ADD COLUMN cust_city char(10)NOT NULL DEFAULT ‘Wuhan’ AFTER cust_sex; 2、CHANGE[COLUMN]子句 修改表中列的名称或数据类型
3、ALTER[COLUMN]子句 修改或删除表中指定列的默认值 ALTER TABLE mysql_test.customers ->ALTER COLUMN cust_city SET DEFAULT ‘Beijing’; 4、MODIFY[COLUMN]子句 只修改指定列的数据类型,不会干涉它的列名 ALTER TABLE mysql_test.customers ->MODIFY COLUMN cust_name char(20) FIRST; 5、DROP[COLUMN]子句 删除表中多余的列 ALTER TABLE mysql_test.customers ->DROP COLUMN cust_contact; 6、RENAME[TO]子句 为表重新赋予一个表名 ALTER TABLE mysql_test.customers ->RENAME TO mysql_test.backup_customers; 给表重命名表的第二种写法:RENAME TABLE db_a.old_table TO db_b.new_table; 7、DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [ ,tbl_name ] … [RESTRICT | CASCADE]
查看表结构: SHOW [FULL] COLUMNS {FROM | IN} tbl_name[{FROM | IN} db_name] [LIKE’pattern’ | WHERE expr] 例如:SHOW COLUMNS FROM t_role; {DESCRIBE | DESC} tbl_name [col_name | wild] 例如:DESC t_role; ********************************************索引**************************************** 索引:索引是提高数据文件访问效率的有效方法 索引存在的弊端: 1)索引是以文件的形式存储的,如果有大量的索引,索引文件可能比数据 文件更快达到最大的文件尺寸; 2)索引在提高查询速度的同时,会降低更新表的速度。 索引的分类:索引通常被创建成单列索引和组合索引
索引的创建 Create index
例如:在数据库mysql_test的表customers上,根据客户姓名列的前三个 字符创建一个升序索引index_customers。 create index index_customers on mysql_test.customers (name(3) ASC); 在数据库mysql_test的表customers上,根据客户姓名列和客户id 号创建一个组合索引index_cust。 create index index_cust on mysql_test.customers (cust_name,cust_id);
索引的创建:使用ALTER TABLE语句创建
例如:使用ALTER TABLE语句在数据库mysql_test中表seller的姓名上添加一列 非唯一的索引,取名为index_seller_name。 ALTER TABLE mysql_test.seller ADD INDEX index_seller_name(seller_name); 索引的查看(SHOW INDEX ) SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name ] [WHERE expr] SHOW index FROM t_test.tb_dept; 索引的删除:使用DROP INDEX语句 DROP INDEX index_name ON tbl_name; 索引的删除:使用ALTER TABLE语句
例如:使用ALTER TABLE语句删除数据库mysql_test中表customers的主键和索引 index_customers。
四、数据更新(数据操纵语言DML)插入数据
例如: 1、使用INSERT…VALUES语句向数据库mysql_test的表customers中 插入这样一行完整数据:(901,张三 ,F,北京市,朝阳区) INSERT INTO mysql_test.customers VALUES (901,’张三’,’F’,’北京市’,’朝阳区’); 2、使用INSERT…VALUES语句向数据库mysql_test的表customers中插入这样一行 数据,要求该数据目前只用明确给出cust_name列和cust_address列的信息,即分别为 ‘李四’‘武汉’,而cust_id由系统自动生成,cust_sex列选用表中默认值,另外 cust_contact列的值暂不确定,可不用指定 INSERT INTO mysql_test.customers VALUES (0,’李四’,DEFAULT,’武汉市’,NULL); ********************使用INSERT…SET语句插入部分列值数据*************************** 语法:INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},… 例如:使用INSERT…SET语句向数据库mysql_test的表customers中插入 数据:名为李四 ,地址为武汉,性别默认 insert into mysql_test.customers set cu_name="李四",cu_address="武汉",cu_sex=DEFAULT; ***********************使用INSERT…SELECT语句插入子查询数据**************************** 语法:INSERT [INTO] tbl_name [(col_name,…)] SELECT… 例句:INSERT INTO db1_name (field1,field2) SELECT field1,field2 FROM db2_name; 删除数据 语法:DELETE FROM tbl_name [WHERE where_condition ] [ORDER BY … ] [LIMIT row_count ] 例如:使用DELETE语句删除数据库mysql_test的表customers中客户名 为“李四”的客户信息。 delete from mysql_test.customers where cu_name="李四"; 修改数据 语法:UPDATE tbl_name SET col_name1={expr1|DEFAULT}[,col_name2={expr2|DEFAULT}]… [WHERE where_condition] [ORDER BY …] [LIMIT row_count] 例如:使用UPDATE语句将数据库mysql_test的表customers中姓名为“ 张三”的客户的地址更新为“武汉” UPDATE mssql_test.customers SET cust_address=‘武汉市’ WHERE cust_name=‘张三’; 五、数据查询SELECT语句
例如:查询数据库mysql_sest的表customers中各个客户的姓名、性别和地址信息 SELECT cust_name,cust_sex,cust_address FROM mysql_test.customers; 定义并使用列的别名:SELECT cust_name,cust_address AS 地址,cust_contact FROM mysql_test.customers; 替换查询结果集中的数据 SELECT CASE id WHEN 1 then "yf" when 2 then "cs" WHEN 3 THEN "yw" WHEN 4 THEN "jl" ELSE "qt" END AS NAME FROM tb_dept;
聚合函数通常是数据库系统中一类系统(内置函数) *******************FROM子句与多表连接查询********************** 交叉连接,又称笛卡尔积
内连接:SELECT * FROM tb_student INNER JOIN tb_score ON tb_student.studentNo=tb_score.studentNo
外连接:
问答题:写出在MySQL中,内连接的语法格式。
简述左外连接和右外连接的区别。
where子句
判定范围: 1、当查询的过滤条件被限定在值的某个范围时,可以使用关键字“BETWEEN”。 例如:SELECT * FROM mysql_test.customers ->WHERE cust_id BETWEEN 903 AND 912; 2、使用关键字“IN”可以指定一个值的枚举表,该表中会列出所有可能的值 判定空值: is null ;is not null 子查询—结合关键字“IN”使用的子查询:主要用于判定一个给定值是否存在于子查询的结果集中 子查询—结合关键字“EXISTS”使用的子查询:子查询的结果集不为空,则返回TRUE,否则返回FALSE GROUP BY子句与分组数据:
having 语句与实际有出入为了考试请按照书本上的来哪怕他错了
ORDER BY子句:排序 例句:在数据库mysql_test的表customers中依次按照客户姓名和地址的降序方式输出客户的姓名和性别 SELECT cust_name,cust_sex FROM mysql_test.customers -> ORDER BY cust_name DESC,cust_address DESC;
LIMIT:使用LIMIT子句限制被SELECT语句返回的行数
六、视图什么是视图:
使用视图的优点
语法;CREATE VIEW view_name[(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
在数据库mysql_test中创建视图customers_view,要求该视图包含客户信息表customers中所有男客户的信息,并且要求保证今后对该视图数据的修改都必须符合客户性别为男性这个条件 CREATE OR REPLACE VIEW mysql_test.customers_view AS SELECT*FROM mysql_test.customers WHERE cust_sex=‘M’ WITH CHECK OPTION; 使用DROP VIEW语句删除视图: DROP VIEW [IF EXISTS] view_name [,view_name]… [RESTRICT | CASCADE] 使用ALTER VIEW语句对已有视图的定义(结构)进行修改 ALTER VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL]CHECK OPTION] 使用SHOW CREATE VIEW语句查看已有视图的定义(结构) SHOW CREATE VIEW view_name 使用DELETE语句通过视图删除基本表的数据: 示例:删除视图customers_view中姓名为“周明”的客户信息 DELETE FROM mysql_test.customers_view -> WHERE cust_name=‘周明’ 在视图customers_view中查找客户id号为905的客户姓名及其地址 |
|