一、构建测试用数据库
这里自己学习的材料是经典教材《Sql必知必会》,对于自己熟悉常用的sql命令足够了,计划用两到三天的时间来完成这个部分的学习。为了随时验证所学的东西,这里采用书中提供的数据库作为测试用例。官方提供的是mdb格式的文件,默认应当使用Access来打开,但是自己安装了Ubuntu的虚拟环境,配置了MySql,因此决定利用脚本在MySql中搭建数据库,方法比较简单,执行创建初始化脚本即可:
Create脚本:
点击(此处)折叠或打开
- --------------------------------------------
- -- Sams Teach Yourself SQL in 10 Minutes
- -- http://www.forta.com/books/0672325675/
- -- Example table creation scripts for MySQL.
- --------------------------------------------
- -------------------------
- -- Create Customers table
- -------------------------
- CREATE TABLE Customers
- (
- cust_id char(10) NOT NULL ,
- 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
- );
- --------------------------
- -- 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
- );
- ----------------------
- -- Create Orders table
- ----------------------
- CREATE TABLE Orders
- (
- order_num int NOT NULL ,
- order_date datetime NOT NULL ,
- cust_id char(10) NOT NULL
- );
- ------------------------
- -- Create Products table
- ------------------------
- CREATE TABLE Products
- (
- prod_id char(10) NOT NULL ,
- vend_id char(10) NOT NULL ,
- prod_name char(255) NOT NULL ,
- prod_price decimal(8,2) NOT NULL ,
- prod_desc text NULL
- );
- -----------------------
- -- Create Vendors table
- -----------------------
- CREATE TABLE Vendors
- (
- vend_id char(10) NOT NULL ,
- 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
- );
- ----------------------
- -- Define primary keys
- ----------------------
- ALTER TABLE Customers ADD PRIMARY KEY (cust_id);
- ALTER TABLE OrderItems ADD PRIMARY KEY (order_num, order_item);
- ALTER TABLE Orders ADD PRIMARY KEY (order_num);
- ALTER TABLE Products ADD PRIMARY KEY (prod_id);
- ALTER TABLE Vendors ADD PRIMARY KEY (vend_id);
- ----------------------
- -- 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);
点击(此处)折叠或打开
- ----------------------------------------------
- -- Sams Teach Yourself SQL in 10 Minutes
- -- http://www.forta.com/books/0672325675/
- -- Example table population scripts for MySQL.
- ----------------------------------------------
- ---------------------------
- -- 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('1000000001', 'Village Toys', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'John Smith', 'sales@villagetoys.com');
- INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
- VALUES('1000000002', 'Kids Place', '333 South Lake Drive', 'Columbus', 'OH', '43333', 'USA', 'Michelle Green');
- INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
- VALUES('1000000003', 'Fun4All', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'jjones@fun4all.com');
- INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
- VALUES('1000000004', 'Fun4All', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Denise L. Stephens', 'dstephens@fun4all.com');
- INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
- VALUES('1000000005', 'The Toy Store', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'Kim Howard');
- -------------------------
- -- Populate Vendors table
- -------------------------
- INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
- VALUES('BRS01','Bears R Us','123 Main Street','Bear Town','MI','44444', 'USA');
- INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
- VALUES('BRE02','Bear Emporium','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('DLL01','Doll House Inc.','555 High Street','Dollsville','CA','99999', 'USA');
- INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
- VALUES('FRB01','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('FNG01','Fun and Games','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('JTS01','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('BR01', 'BRS01', '8 inch teddy bear', 5.99, '8 inch teddy bear, comes with cap and jacket');
- INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
- VALUES('BR02', 'BRS01', '12 inch teddy bear', 8.99, '12 inch teddy bear, comes with cap and jacket');
- INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
- VALUES('BR03', 'BRS01', '18 inch teddy bear', 11.99, '18 inch teddy bear, comes with cap and jacket');
- INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
- VALUES('BNBG01', 'DLL01', 'Fish bean bag toy', 3.49, 'Fish bean bag toy, complete with bean bag worms with which to feed it');
- INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
- VALUES('BNBG02', 'DLL01', 'Bird bean bag toy', 3.49, 'Bird bean bag toy, eggs are not included');
- INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
- VALUES('BNBG03', 'DLL01', 'Rabbit bean bag toy', 3.49, 'Rabbit bean bag toy, comes with bean bag carrots');
- INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
- VALUES('RGAN01', 'DLL01', 'Raggedy Ann', 4.99, '18 inch Raggedy Ann doll');
- INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
- VALUES('RYL01', 'FNG01', 'King doll', 9.49, '12 inch king doll with royal garments and crown');
- INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
- VALUES('RYL02', 'FNG01', 'Queen doll', 9.49, '12 inch queen doll with royal garments and crown');
- ------------------------
- -- Populate Orders table
- ------------------------
- INSERT INTO Orders(order_num, order_date, cust_id)
- VALUES(20005, '2004-05-01', '1000000001');
- INSERT INTO Orders(order_num, order_date, cust_id)
- VALUES(20006, '2004-01-12', '1000000003');
- INSERT INTO Orders(order_num, order_date, cust_id)
- VALUES(20007, '2004-01-30', '1000000004');
- INSERT INTO Orders(order_num, order_date, cust_id)
- VALUES(20008, '2004-02-03', '1000000005');
- INSERT INTO Orders(order_num, order_date, cust_id)
- VALUES(20009, '2004-02-08', '1000000001');
- ----------------------------
- -- Populate OrderItems table
- ----------------------------
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20005, 1, 'BR01', 100, 5.49);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20005, 2, 'BR03', 100, 10.99);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20006, 1, 'BR01', 20, 5.99);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20006, 2, 'BR02', 10, 8.99);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20006, 3, 'BR03', 10, 11.99);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20007, 1, 'BR03', 50, 11.49);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20007, 2, 'BNBG01', 100, 2.99);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20007, 3, 'BNBG02', 100, 2.99);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20007, 4, 'BNBG03', 100, 2.99);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20007, 5, 'RGAN01', 50, 4.49);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20008, 1, 'RGAN01', 5, 4.99);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20008, 2, 'BR03', 5, 11.99);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20008, 3, 'BNBG01', 10, 3.49);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20008, 4, 'BNBG02', 10, 3.49);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20008, 5, 'BNBG03', 10, 3.49);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20009, 1, 'BNBG01', 250, 2.49);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20009, 2, 'BNBG02', 250, 2.49);
- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
- VALUES(20009, 3, 'BNBG03', 250, 2.49);
mysql -u username -p > password;
show databases;
use database_name; //这里创建了example数据库作为测试
show tables;
desc(ribe) table_name; //此命令可以查看表结构,如各列的名称和类型等
二、基本的select语句
在继续介绍基本语句之前,先来列出自己感觉重要的几个要点:
1. DBMS会管理着多个数据库,每个数据库由表组成,表由一条一条的记录构成,每条记录则是不同数据类型的集合;
2. 每个表中都有一个主键,用于唯一标识每条记录,因此要求主键列具有以下属性:
-‘1-1’对应:每条记录都有一个唯一主键,不同的记录主键不同;
- 不能使用update命令对记录的主键更新修改;
- 可以delete记录,但是删掉的记录的主键永远不可在表中复用,即新纪录不能使用用过的主键,不管该主键对应的记录是否还存在;
3. 书写规则:
- Sql语句不区分大小写,因此select和SELECT效果是一样的,一般为了便于阅读,建议关键词(如SELECT/UPDATE等)大写,其余小写;
- Sql语句不区分空格,因此column = 1与column=1是相同的;
- Sql语句一般要求使用';'作为每条语句的结束,有些DBMS可能不要求,但是为了统一考虑,一般建议都使用';'作为命令结束;
4. 排序语句:
- Order by一般放置在SELECT语句的末尾,对于已经进行过各种条件过滤之后的语句再排序;
- Order by默认是升序排列,即数字大小或字母表顺序,可以使用DESC指定为降序,仅仅对向前修饰的最近Order by有效;
- Order by可以同时使用多列排序,依次排序,如Order by A, B,C 则先按A排序,A相同的再按B排序,依次类推;
5. 条件过滤-WHERE:
- WHERE使用时,如果与字符串关键词比较,必须使用''标识字符串;数字关键字不需要,''仅仅用来表示字符串;
- Between A and B范围语句包含起点和终点A和B;
- IS NULL用来筛选列值为空的记录;
- WHERE column IN (SET);
【基本的语句结构:SELECT 查什么:列名1,列名2,列名... FROM 从哪查:table_name WHERE IS NULL/NOT 条件 ORDER BY 指标列集合 DESC】