您的位置:首页 > 数据库 > MySQL

SQL语句基础MySQL版

2018-03-14 23:08 330 查看
一、关系型数据库中
1.基本概念
Row是行,也叫元组,包含数据记录。
Column是列,表示某属性。
其中,元组个数称为”基数“(Arity),属性的个数称为”元数“(Cardinality)。

即有多少行可以说有多少个基数,包含多少条记录
有多少列可以说有多少个元数。

2.引号的使用
请注意,我们在例子中的条件值周围使用的是单引号。
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
文本值:
这是正确的:
SELECT * FROM Persons WHERE FirstName='Bush'

这是错误的:
SELECT * FROM Persons WHERE FirstName=Bush

二、单表SQL语句
1.创建数据库  
 create database persons;

2.使用/切换到某数据库 (直接use数据库的名字就可以,use database persons用法是错误的)
 use persons;

3.创建表 如创建persons表
create table peosons(
Id int,
LastName varchar(20),
FirstName varchar(20),
Address varchar(20),
City varchar(20)
)

3.1 表创建后设置主键和自增主键的命令
设置主键   alter table table_name add primary key (col_name);
设置自增长 alter table table_name modify id int auto_increment;

4.DELETE 语句 DELETE FROM 表名 WHERE 列名 = 某值。列名=某值的行有N行,这N行都删除

删除某行
delete from persons where lastname='zhao'

删除所有行
在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的。
DELETE FROM table_name或者DELETE * FROM table_name

5.INSERT 向表中插入数据
5.1 向表中插入完整行,即给所有列赋值。INSERT INTO 表名 (列1, 列2,...) VALUES (值1, 值2,....)。
values()括号里的值必须每个依次写上,没有的写null。
递增主键赋值为null时依然递增,递增主键被赋值按赋的值,递增时从被赋的值开始计算
insert into persons val
4000
ues (1,'Gates','Bill','XuanWuMen 10','Beijing');

5.2 向表中指定列插入数据
INSERT INTO 表名 (列A, 列E,...) VALUES (值a, 值e,....)
insert into persons (lastname,address) values ('cat','Beijing');

6.查询 SELECT语句
6.1 选取某列的数据,查询某列的数据,显示某列的数据. 
select 某些列 from 某表; 显示某些列的数据
select lastname,firstname from persons;

select * from 表名; 显示全部列的数据,*代表全部列
select * from persons;

6.2 SELECT DISTINCT 语句。用于返回唯一不同的值。修饰列。显示 规定列 属性不同的行,某些属性相同的行只显示一次
select distinct 某些列 from 某表 显示的是 规定列 属性不同的行,规定列属性全相同的行只显示一次
select distinct address,city from persons; 显示的是adderss和city列属性值全不同的行,address和city完全相同的只显示一次
一般distinct一列的情况比较多

7.WHERE子句。
7.1有条件地从表中选取数据。
  SELECT 列名称 FROM 表名称 WHERE 列 运算符 值。where表示选取某些列中,属性的取值满足某些要求的行数据
  运算符的取值如下
 运算符 描述
= 等于
<> 不于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN    在某个范围内
LIKE 搜索某种模式
   注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。

   SELECT 列名称 FROM 表名 WHERE 列 运算符 值
   select * from persons where city='beijing' 显示city属性为‘beijing’的行数据的所有列
 
   select lastname from persons where city='beijing' 显示city属性为‘beijing’的行数据的lastname列
 
7.2 AND和OR运算符。 在where子句中把多个where条件结合起来。and连接的是多个属性的不通值,in连接的是单个属性的多个值

and

select * from persons where 属性1='某具体值' and 属性2='某具体值' 返回属性值1为‘’且属性值2为‘’的行数据的所有列
select * from persons where firstname='thomas' and lastname='carter' 返回firstname='thomas'并且lastname='carter'的所有列的行数据

or
select * from persons where 属性1='某具体值' or 属性2='某具体值' 返回属性值1为‘’和属性值2为‘’的行数据的所有列
select * from persons where firstname='thomas' or lastname='bush'

and和or结合使用 需要约束在一起的条件用括号括起来
select * from persons where (属性1='某具体值' or 属性2='某具体值') and 属性3='某具体值' 返回属性值1为‘’或者属性值2为‘’且属性值为‘’的行数据的所有列
select * from persons where (firstname='thomas' or firstname='william') and lastname='carter'返回(firstname='thomas' 或者 firstname='william') 并且 lastname='carter'的所有列的行数据

8.ORDER BY 语句 根据指定的列对结果集进行排序。
 order by 列名 默认升序 升序时null值为最高序,即按null时最小的算
      order by 列名 desc 降序
 
8.1 单个升序排序
select 列名1 from 表名 order by 列名称2 按列名称2排序显示列名1的行数据,如果列名2为数值,按值大小,为字符按字母顺序
select * from persons order by id 按id值升序显示所有列的行数据
 
8.2 单个降序排序
select * from persons order by lastname desc 按lastname的字母顺序降序显示所有列的行数据
 
8.3 按多个属性排序。列名声明降序的降序,不声明的为默认升序
select 列名1 from 表名 order by 列名a,列名b   列名a在前,先按a列排好,再在排好序的a中把b按b的规则排好
 
两个列都按升序
select 列名1 from 表名 order by 列名A,列名B
select * from persons order by lastname ,id  按lastname升序,在lastname升序的前提下,id升序的顺序显示所有列的行数据
 
一个升序,一个降序,哪个降序哪个声明desc,哪个升序可默认,可声明asc。两个都声明desc才可以都降序
select 列名1 from 表名 order by 列名A desc,列名B
select * from persons order by lastname desc ,id asc 按lastname降序,在lastname降序的前提下,升序显示所有列的行数据
 
 
9.UPDATE 语句 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

更新某一行的某一列
update persons set firstname='tom' where lastname='cat'

更新某一行中的若干列
update persons set firstname='tom',address='chaoyang',city='beijing' where lastname='cat'

10. TOP语句  select 列名 from 表名 limit m,n  从第m+1条数据开始显示,显示n条某列的行数据
select * from persons limit 3,2 从第4条数据开始显示,显示2条所有列的行数据
select id from persons limit 3,2 从第4条数据开始显示,显示2条id列的行数据

11.LIKE 操作符 在where子句中搜索列中的指定模式
11.1select * from 表名 where 列名A like 'n%'。返回A列属性值开头为n的所有列的行数据
其中%为通配符,表示模式中缺少的字母
select * from persons where city like 'n%' 返回city属性中,以字母'n'开头的所有列的行数据

11.2
select * from persons  where city like '%g' 返回city属性值结尾是'g'的所有列的行数据

11.3
select * from persons  where city like '%on%' 返回city属性值包含‘on’的所有列的行数据

11.4 not like 显示不包含某些条件的数据
select * from persons  where city not like '%on%' 返回city属性值不包含'on'的所有列的行数据
select * from persons  where city not like 'n%'   返回city属性值不以'n'开头的所有列的行数据

12.通配符 主要有 %、_、[charlist]、[^charlist]或[!charlist] 
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或者[!charlist]  不在字符列中的任何单一字符

12.1 ‘%’ 使用
select * from persons  where city like '%on%' 。举例和释义11中有

12.2 '_' 使用
select * from persons where lastname like 'C_r_er' 返回在firstname属性值中,标有'_''_'不计较的所有列的数据行

12.3[charlist] 使用 教程例子有误,回头研究

13. IN 操作符 在where子句中给某一个属性规定多个值。区别and和or是给多个属性规定值
select 列名 from 表名 where 属性名 in('属性值1','属性值2')
select * from persons where firstname in('thomas','tom') 返回firstname值为thomas和tom的所有列的行数据

14.BETWEEN 操作符 
14.1 between..and,选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
select * from persons where 属性值 between '具体值1' and '具体值2'
select * from persons where lastname between 'bush' and 'cat' 返回lastname介于bush和cat之间的所有列的行数据

14.2 not between..and 选取不在两者之间范围的数据。
select * from persons where id not between 3 and 6 返回id值不在3到6这个范围的所有列的行数据

15. Alias指定别名 可以给多个表指定别名,也可以给表中的属性指定别名
SELECT column_name AS alias_name FROM table_name
select lastname as faimly,firstname as name from persons 指定lastname名为family,firstname为name,显示family和name列的行数据

指定表名的返回值的意义还需要思考
SELECT
po.OrderID, p.LastName, p.FirstName
FROM 
Persons AS p, Product_Orders AS po
WHERE 
p.LastName='Adams' AND p.FirstName='John'    

三、多表查询SQL语句
1.创建关联表
1.1 创建关联表
create table orders(
oid int primary key not null auto_increment,
item varchar(20),
onumber varchar(20),
id int,
index(id),
foreign key(id)references persons(id)on delete cascade
)engine innodb

1.2 关联查询。如下例子表示,从persons表和orders两个表中以主键相同为条件,查询persons表中lastname的人在orders中买了什么item
SELECT
p.lastname,o.item
FROM
pe
112b4
rsons as p,
orders as o
WHERE
p.id = o.id
2.JOIN。 关联
 有时为了得到完整的结果,我们需要从两个表中获取结果。我们就需要执行 join。
 数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。
 在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

2.1 inner join。内连接。 inner join=join。查询出左表右表都有属性值的行数据。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行
SELECT
p.lastname,o.item
FROM
persons as p inner join orders o
on
p.id = o.id
主键相同,表示整理归一。以上语句表示返回同一个人的lastname列和item列的行数据。

2.2 left join。左连接。左表的属性值要展示全。以左表为依据,从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有=pid的oid的行。
SELECT
persons.firstname,
persons.LastName,
orders.onumber
FROM
persons
LEFT JOIN orders ON persons.id = orders.id
只要有这个人就显示,这个人有订单显示订单号,没有订单订单就显示null

2.3 right join 右连接。右表的属性值要展示全。以右表为依据,从右表 (orders) 那里返回所有的行,即使在左表 (persons) 中没有=oid的pid的行。
SELECT
persons.*, orders.onumber
FROM
persons
RIGHT JOIN orders ON persons.id = orders.id
只要有订单号就显示,这个订单号对应了人就显示,不对应人就显示null(由于主从关系,应该基本不会有订单号没有人)

2.4 全连接。只要其中某个表存在匹配,FULL JOIN 关键字就会返回行
但是mysql中不存在全连接
3.UNION。合并。合并两个或多个 SELECT 语句的结果集。
 UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同
 UNION 默认选取不同的值
 UNION ALL 允许相同的值需要使用UNION ALL。相同是指动id到city都相同
SELECT
id,firstname
FROM
persons
UNION
SELECT
id,firstname
FROM
people  
 
返回persons表的id和firstname列,返回people表的id和firstname列。把两个列粘一起返回一张更多行的表。

4.SELECT INTO。把一个表的列的行数据全部插入到另一个新?表中。常用来制作备份附件。SQL语句可以,但是mysql中不可以。
 4.1 备份全部表内容到新数据表
 SELECT *
 INTO Persons_backup
 FROM Persons  
 
 4.2 IN 子句可用于向另一个数据库中拷贝表
 SELECT *
 INTO Persons IN 'Backup.mdb'
 FROM Persons
 
 4.3 也可以添加 WHERE 子句。备份某属性值满足某条件的行数据
 SELECT LastName,Firstname
 INTO Persons_backup
 FROM Persons
 WHERE City='Beijing'
 
 4.4从一个以上的表中选取数据也是可以做到的
 SELECT Persons.LastName,Orders.OrderNo
 INTO Persons_Order_Backup
 FROM Persons
 INNER JOIN Orders
 ON Persons.Id_P=Orders.Id_P

四、SQL约束
1.NOT NULL 被约束列不接受 NULL 值
2.UNIQUE   约束唯一标识数据库表中的每条记录。被约束的属性,其值是唯一的,不能有重复的。提供值的唯一性保证
 PRIMARY KEY 拥有自动定义的 UNIQUE 约束。每个属性可以有多个列做unique约束,只能有一个属性做primary key 约束。每个属性可以有多个列做unique约束,只能有一个属性做primary
 2.1当表已经被创建,添加或删除unique约束
添加unique约束
    ALTER TABLE 表名 ADD UNIQUE (属性名)
删除unique约束
ALTER TABLE 表名 DROP INDEX 约束名
3.primary key
 mysql中创建时声明主键。(如果使用 ALTER TABLE 语句添加主键,必须在首次建表时即把主键属性声明为不包含 NULL 值(在表首次创建时))
CREATE TABLE Persons
(
Id int NOT NULL,
LastName varchar(255) NOT NULL,
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
)  
 mysql中表已经存在的情况下创建主键
 ALTER TABLE Persons ADD PRIMARY KEY (Id_P)
 
4.foreign key 一个表中的 FOREIGN KEY 用来指向另一个表中的 PRIMARY KEY
 "Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。
 "Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。
 "Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。
 FOREIGN KEY 约束用于预防破坏表之间连接的动作。
 FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一
 
 4.1 MySQL中创建时声明外键
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)  

命名foreign key 
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
)
 4.2 MySQL中表已经存在的情况下把某属性声明为外键
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
 4.3 需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)

 4.4 MySQL中撤销 FOREIGN KEY 约束
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

5.CONSTRAINT 用于限制列中的值的范围
 如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
 如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

5.1 MySQL中表创建时创建约束
以下语句表示约束id_p的取值范围为>0
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)

5.2 MySQL中命名 CHECK 约束,以及为多个列定义 CHECK 约束
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)

5.3 MySQL中表已经存在的情况下为某列定义check约束
ALTER TABLE Persons ADD CHECK (Id_P>0)

5.4 MySQL中撤销check约束
ALTER TABLE Persons DROP CHECK chk_Person

6. default 用于向列中插入默认值。有规定其他的值,那么会将默认值添加到所有的新记录
6.1 MySQL中表创建时添加default约束
city属性,在没有可以规定其他值得情况下,默认为'Sandnes'
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)

6.2 MySQL中表已经存在时,添加default约束
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'

6.3 MySQL中撤销default约束
ALTER TABLE Persons ALTER City DROP DEFAULT

7.INDEX 索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据
为lastname列和firstname列创建索引
CREATE INDEX PersonIndex ON Person (LastName,firstname) 

删除索引
ALTER TABLE table_name DROP INDEX index_name

8. drop和truncate
  drop 删除表
  truncate 删除表中的数据,不删除表结构

9.alter table 用于在已有的表中添加、修改或删除列
9.1 在表中添加列
ALTER TABLE PersonsADD Birthday date 在表 "Persons" 中添加一个名为 "Birthday"且其属性值为date的新列

9.2 修改数据类型实例
ALTER TABLE Persons ALTER COLUMN Birthday year 修改Birthday属性的数据类型为year

9.3 删除列
ALTER TABLE Person DROP COLUMN Birthday 把person表中的Birrhday列删除

10.AUTO INCREMENT 自增主键。AUTO_INCREMENT用于修饰主键。默认开始值是1,然后递增+1.
10.1 把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
10.2 让 AUTO_INCREMENT 序列以其他的值起始
ALTER TABLE Persons AUTO_INCREMENT=100

五、视图 视图是基于 SQL 语句的结果集的可视化的表。也就是可以把视图看成是一个假表。对真表的操作很多可以用到假表上。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
1.创建视图
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

创建一个叫做pview的视图,视图的列是persons.*,行是满足city=北京的行数据
create view pview as select persons.* from persons where city='beijing' 

2.更新视图
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

3.删除视图
DROP VIEW view_name

六、SQL函数 SELECT function(列) FROM 表。可以看出,函数是针对列的属性值做计算的。
SQL函数包含  
合计函数(Aggregate functions)。 Aggregate 函数的操作面向一系列的值,并返回一个单一的值
Scalar 函数。  Scalar 函数的操作面向某个单一的值,并返回基于输入值的一个单一的值。

1.AVG()
SELECT AVG(属性)FROM 表
select AVG(shop_price)from product 从product表中查询shop_price的平均价格

取比平均值高或低的值
select 属性 from 表 where shop_price>(求平均值公式)
select * from product where shop_price>(select avg(shop_price)from product)

2.COUNT() 可以加条件语句where
 
2.1 count(属性名) 返回某属性的行数,null不算
SELECT COUNT(column_name) FROM table_name
SELECT COUNT(cid) FROM product; 返回product中属性cid的行的数目

2.2 count(*)
SELECT COUNT(*) FROM table_name
SELECT COUNT(*) FROM product;   返回product表的行数

2.3 count(distinct 属性名) 返回指定列的不同值的数目
SELECT COUNT(DISTINCT column_name) FROM table_name
select count(DISTINCT cid) from product 返回cid值不同的行数

3.GROUP BY 语句。合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

select item,sum(price) from orders group by item 把item属性分类求和。group是把指定行相同的属性值归类分组。是把行归组。

4.HAVING子句。 having可以group by 分出来的组提条件。SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用
select item,sum(price) from orders group by item having sum(price)<100
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: