SQL必知必会(第五版)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL必知必会(第五版)相关的知识,希望对你有一定的参考价值。
参考技术A去重 :使用DISTINCT关键字,它必须直接放在列名的前面。
检索前5行数据:
LIMIT 5 OFFSET 5指示mysql等DBMS返回从第5行起的5行数据。第一个数字是检索的行数,第二个数字是指从哪儿开始。
2.1 排序数据
注意: ORDER BY 子句的位置在指定一条ORDER BY子句时,应该保证它是 SELECT语句中最后一条子句 。如果它不是最后的子句,将会出错。
ORDER BY 2, 3表示先按prod_price,再按prod_name进行排序。
好处在于不用重新输入列名。
缺点。首先,不明确给出列名有可能造成错用列名排序。其次,在对SELECT清单进行更改时容易错误地对数据进行排序(忘记对ORDER BY子句做相应的改动)。最后,如果进行排序的列不在SELECT清单中,显然不能使用这项技术。
DESC 是DESCENDING的缩写,这两个关键字都可以使用。与DESC相对的是 ASC (或ASCENDING),在升序(A→Z)排序时可以指定它。但实际上,ASC没有多大用处,因为升序是默认的(如果既不指定ASC也不指定DESC,则假定为ASC)。
DESC关键字只应用到直接位于其前面的列名。如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出。
在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。
提示: 单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号。
操作符(operator) 用来联结或改变WHERE子句中的子句的关键字,也称为逻辑操作符(logicaloperator)。
AND 用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
一个AND子句,只有两个过滤条件。可以增加多个过滤条件,每个条件间都要使用AND关键字。
ORDER BY子句,放在WHERE子句之后。
OR: WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。
SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。
圆括号具有比AND或OR操作符更高的优先级。
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。
IN:WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。
IN操作符一般比一组OR操作符执行得更快。
IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。
NOT: WHERE子句中用来否定其后条件的关键字。
通配符(wildcard) 用来匹配值的一部分的特殊字符。
搜索模式(search pattern) 由字面值、通配符或两者组合构成的搜索条件。
说明:区分大小写根据DBMS的不同及其配置,搜索可以是区分大小写的。如果区分大小写,则’fish%’与Fish bean bag toy就不匹配。
除了能匹配一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。
\'%’不会匹配名称为NULL的行。
下划线的用途与%一样,但它只匹配单个字符,而不是多个字符。
与%能匹配多个字符不同,_总是刚好匹配一个字符,不能多也不能少。
此语句的WHERE子句中的模式为’[JM]%\'。这一搜索模式使用了两个不同的通配符。[JM]匹配方括号中任意一个字符,它也只能匹配单个字符。因此,任何多于一个字符的名字都不匹配。[JM]之后的%通配符匹配第一个字符之后的任意数目的字符,返回所需结果。
也可以使用NOT操作符得出类似的结果。^的唯一优点是在使用多个WHERE子句时可以简化语法:
例如:
拼接(concatenate)
将值联结到一起(将一个值附加到另一个值)构成单个值。
操作符可用加号(+)或两个竖杠(||)表示。
说明:是+还是||?SQL Server使用+号。DB2、Oracle、PostgreSQL和SQLite使用||。在MySQL和MariaDB中,必须使用特殊的函数。
说明: TRIM函数 大多数DBMS都支持 RTRIM() (去掉字符串右边的空格)、 LTRIM() (去掉字符串左边的空格)以及 TRIM() (去掉字符串左右两边的空格)。
SQL支持列别名。 别名(alias) 是一个字段或值的替换名。别名用 AS 关键字赋予。
AS关键字可选,最好用它。
提示:如何测试计算
SELECT语句为测试、检验函数和计算提供了很好的方法。虽然SELECT通常用于从表中检索数据,但是省略了FROM子句后就是简单地访问和处理表达式,例如SELECT 3*2;将返回6,SELECT Trim(\' abc \');将返回abc,SELECT Curdate();使用Curdate()函数返回当前日期和时间。
UPPER()函数: 将文本转换为大写。
SQL函数不区分大小写,因此upper(), UPPER(), Upper()都可以,substr(), SUBSTR(), SubStr()也都行。
MySQL必知必会
姊妹篇——Hive必知必会(数据仓库):https://hiszm.blog.csdn.net/article/details/119907136
文章目录
- 第一章:数据库基础
- 第二章:MySQL 简介
- 第三章:了解数据库和表
- 第四章:检索数据
- 第五章:排序检索数据
- 第六章:过滤数据
- 第七章:数据过滤
- 第八章:用通配符进行过滤
- 第九章:用正则表达式进行搜索
- 第十章:创建计算字段
- 第十一章:使用数据处理函数
- 第十二章:汇总数据
- 第十三章:分组数据
- 第十四章:使用子查询
- 第十五章:联结表
- 第十六章:创建高级联结
- 第十七章:组合查询
- 第十八章:全文本搜索
- 第十九章:插入数据
- 第二十章:更新和删除数据
- 第二十一章:创建和操纵表
- 补充
- 第二十二章:使用视图(适用于MySQL 5及之后的版本)
- 第二十三章:存储过程(适用于MySQL5及之后的版本)
- 第二十四章:使用游标(适用于MySQL5及以上版本)
- 第二十五章:使用触发器
- 第二十六章:管理事务处理
- 第二十七章:全球化和本地化
- 第二十八章:安全管理
- 第二十九章:数据库维护
- 第三十章:改善性能
第一章:数据库基础
基本概念
- 数据库(
database
)保存有组织的数据的容器(通常是一个文件或一组文件)。 - 表(
table
)某种特定类型数据的结构化清单。 - 模式(
schema
)关于数据库和表的布局及特性的信息。 - 列(
column
)表中的一个字段。所有表都是由一个或多个列组成的。 - 数据类型(
datatype
)所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。 - 行(
row
)表中的一个记录 - 主键(
primary key
)一一列(或一组列),其值能够唯一区分表中每个行。
我的理解可以将 数据库 比作一个书柜 ,然后里面的表 看作一本本书,每本书的名字是不同的。模式 可以看作你在书柜里面摆放书的方式不同,而列 你可以看作书的每一章,数据类型 比作书的页面,是文字还是插图,行就是书的内容,主键,可以看作是找到一段话的方法,常见的是页码。
什么是SQL
SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language
)的缩写。SQL是一种专门用来与数据库通信的语言。
第二章:MySQL 简介
$ mysql -u root -p
-u
用户名,-p
输入密码, -h
主机名, -P
端口,注意此时的大小写。
mysql --help
命令行选项和参数列表
连接到数据库需要:主机名(本地为localhost)、端口(如果使用默认端口3306之外的端口)、合法的用户名、用户口令(如果需要)
下载create.sql
和populate.sql
两个sql脚本文件,其中,create.sql
包含创建6个数据库表的MySQL
语句,populate.sql
包含用来填充这些表的INSERT语句。执行下列操作:
-- 创建数据库
CREATE DATABASE testdb;
-- 使用数据库
-- 必须先使用USE打开数据库,才能读取其中的数据。
USE testdb;
-- 执行sql脚本
以上为准备工作。
create.sql
########################
# Create customers table
########################
CREATE TABLE customers
(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL ,
cust_address char(50) NULL ,
cust_city char(50) NULL ,
cust_state char(5) NULL ,
cust_zip char(10) NULL ,
cust_country char(50) NULL ,
cust_contact char(50) NULL ,
cust_email char(255) NULL ,
PRIMARY KEY (cust_id)
) ENGINE=InnoDB;
#########################
# Create orderitems table
#########################
CREATE TABLE orderitems
(
order_num int NOT NULL ,
order_item int NOT NULL ,
prod_id char(10) NOT NULL ,
quantity int NOT NULL ,
item_price decimal(8,2) NOT NULL ,
PRIMARY KEY (order_num, order_item)
) ENGINE=InnoDB;
#####################
# Create orders table
#####################
CREATE TABLE orders
(
order_num int NOT NULL AUTO_INCREMENT,
order_date datetime NOT NULL ,
cust_id int NOT NULL ,
PRIMARY KEY (order_num)
) ENGINE=InnoDB;
#######################
# Create products table
#######################
CREATE TABLE products
(
prod_id char(10) NOT NULL,
vend_id int NOT NULL ,
prod_name char(255) NOT NULL ,
prod_price decimal(8,2) NOT NULL ,
prod_desc text NULL ,
PRIMARY KEY(prod_id)
) ENGINE=InnoDB;
######################
# Create vendors table
######################
CREATE TABLE vendors
(
vend_id int NOT NULL AUTO_INCREMENT,
vend_name char(50) NOT NULL ,
vend_address char(50) NULL ,
vend_city char(50) NULL ,
vend_state char(5) NULL ,
vend_zip char(10) NULL ,
vend_country char(50) NULL ,
PRIMARY KEY (vend_id)
) ENGINE=InnoDB;
###########################
# Create productnotes table
###########################
CREATE TABLE productnotes
(
note_id int NOT NULL AUTO_INCREMENT,
prod_id char(10) NOT NULL,
note_date datetime NOT NULL,
note_text text NULL ,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
) ENGINE=MyISAM;
#####################
# Define foreign keys
#####################
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products (prod_id);
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers (cust_id);
ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-84Rh0Lg7-1628496025724)(https://github.com/Jeanhwea/mysql-crash-course/raw/master/mysql_crash_course_ER_diagram.png)]
populate.sql
##########################
# Populate customers table
##########################
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10001, 'Coyote Inc.', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'Y Lee', 'ylee@coyote.com');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES(10002, 'Mouse House', '333 Fromage Lane', 'Columbus', 'OH', '43333', 'USA', 'Jerry Mouse');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10003, 'Wascals', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'rabbit@wascally.com');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10004, 'Yosemite Place', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Y Sam', 'sam@yosemite.com');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES(10005, 'E Fudd', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'E Fudd');
########################
# Populate vendors table
########################
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1001,'Anvils R Us','123 Main Street','Southfield','MI','48075', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1002,'LT Supplies','500 Park Street','Anytown','OH','44333', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1003,'ACME','555 High Street','Los Angeles','CA','90046', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1004,'Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1005,'Jet Set','42 Galaxy Road','London', NULL,'N16 6PS', 'England');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1006,'Jouets Et Ours','1 Rue Amusement','Paris', NULL,'45678', 'France');
#########################
# Populate products table
#########################
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV01', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV02', 1001, '1 ton anvil', 9.99, '1 ton anvil, black, complete with handy hook and carrying case');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV03', 1001, '2 ton anvil', 14.99, '2 ton anvil, black, complete with handy hook and carrying case');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('OL1', 1002, 'Oil can', 8.99, 'Oil can, red');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FU1', 1002, 'Fuses', 3.42, '1 dozen, extra long');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SLING', 1003, 'Sling', 4.49, 'Sling, one size fits all');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT1', 1003, 'TNT (1 stick)', 2.50, 'TNT, red, single stick');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT2', 1003, 'TNT (5 sticks)', 10, 'TNT, red, pack of 10 sticks');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FB', 1003, 'Bird seed', 10, 'Large bag (suitable for road runners)');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FC', 1003, 'Carrots', 2.50, 'Carrots (rabbit hunting season only)');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SAFE', 1003, 'Safe', 50, 'Safe with combination lock');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('DTNTR', 1003, 'Detonator', 13, 'Detonator (plunger powered), fuses not included');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP1000', 1005, 'JetPack 1000', 35, 'JetPack 1000, intended for single use');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP2000', 1005, 'JetPack 2000', 55, 'JetPack 2000, multi-use');
#######################
# Populate orders table
#######################
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20005, '2005-09-01', 10001);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20006, '2005-09-12', 10003);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20007, '2005-09-30', 10004);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20008, '2005-10-03', 10005);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20009, '2005-10-08', 10001);
###########################
# Populate orderitems table
###########################
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 1, 'ANV01', 10, 5.99);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 2, 'ANV02', 3, 9.99);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 3, 'TNT2', 5, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 4, 'FB', 1, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20006, 1, 'JP2000', 1, 55);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20007, 1, 'TNT2'MySQL必知必会