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

MYSQL 的SQL 语句用法大全

2016-04-22 20:04 579 查看
1、创建表

create table 表名



字段1 字段类型,

字段2 字段类型,

. ..

字段n 字段类型,

----------------------------

约束定义1.

约束定义2

。 。。

约束定义n



2、定义非空约束:

create tableT_student

(

FNumber varchar(20)notnull,

age int
not  null,

university varchar(20) notnull

)

 3、定义默认值

create  table T_student

(

FNumber  varchar(20)notnull,

age int
default  20,

university varchar(20) default ' ShangHai University '

)

4、定义主键

create  table T_student

(

FNumber  varchar(20)notnull,

age int
default  20,

university varchar(20) default ' ShangHai University ',

primary key (FNumber)

)

5、定义联合主键

create  table T_student

(

FNumber  varchar(20)notnull,

age int
default  20,

university varchar(20) default ' ShangHai University ',

primary key (FNumber,age
)

)

6、定义外键
FOREIGN KEY 外键字段名称 REFERENCES 目标表名(被关联的字段名称)

CREATE TABLE T_Department 
(
FId VARCHAR(20),
FName VARCHAR(20),
FLevel INT,
PRIMARY KEY (FId)
)

CREATE TABLE T_Employee

 (

FNumber VARCHAR(20),

FName VARCHAR(20),

FDepartmentId VARCHAR(20),
FOREIGN KEY (FDepartmentId) REFERENCES T_Department(FId)

)
7、修改已有的数据表

ALTER TABLE 待修改的表名 ADD 字段名 字段类型
例:ALTER TABLE T_PERSON ADD FFavorite VARCHAR(20)

8、删除数据表

drop table 表名

exa:drop
table T_person

9、插入数据

insert  into 表名(字段,...) values(字段对应的值,...)

注:字符要用单引号,整数可用可不用

若按照表逐列插入数据可用下面语句

insert into 表名 values(字段值,...)

若字段约束为非空,则插入时不能插入空值

若字段约束为主键,则插入时不能与之前重复

若插入的是外键,则此外建必须存在于目标表中。如果插入的数据在目标表中不存在会导致违反外键约束异常。

10、更新数据

update 表名  set 字段=' 字段值 '(将会更新一列值)

带where子句可以定位到某行

update 表名  set 字段x=' 字段值 ' where 字段y='字段值'

还可以使用OR ,NOT,等逻辑词实现更复杂的过滤

若字段约束非空,不能将此字段更新为NULL

若字段为主键,不能讲主键更新为与其他重复并且不能为NULL

11、数据的删除

DELETE FROM表名

DELETE FROM T_Debt;
DELETE FROM T_Person;
由于 T_Debt 表中 FPerson 字段是指向表 T_Person 的 FName 字段的外键,所以必须首
先删除 T_Debt 表中的数据后才能删除 T_Person 中的数据。

带where子句的删除,删除行

delete from 表名 where Age>20 or name='Jack'

12、select
从表中查询数据

查询所有数据:
select * from table

13、查询列

select name from table

select name,age from table

14、别名

select name as nm ,age as ag from  table

也可以省略as

15、条件查询

select name from table where age=20 or name=‘Rose’

16、聚合函数MAX

select MAX(salary) from table

select MAX(salary) as slar from table where salary>5000

此类函数还有min,sum,count

17、排序

select * from table order by age ASC(升序ASC可省略)

select * from table order by age DESC(降序)

两次排序:

SELECT*FROM
T_Employee
ORDER BY FAgeDESC,FSalaryDESC

带where子句,order by 要放在where之后

SELECT * FROM T_Employee WHERE
FAge>23 ORDER BY FAge DESC,FSalary DESC 

18、通配符查询

用 like 代替where 

'_' 可匹配一个单字符

SELECT*FROM
T_Employee WHEREFNameLIKE
'_erry'

多字符匹配的通配符为半角百分号“%”
,它匹配任意次数(零或多个)出现的
任意字符
SELECT
*
FROM T_Employee WHEREFNameLIKE
'T%'

SELECT*FROM
T_Employee WHEREFNameLIKE
'%n%'

SELECT*FROM
T_Employee WHEREFNameLIKE
'%n_'

19、集合匹配
集合匹配只在 MSSQLServer 上提供支持,在 MYSQL、 Oracle、 DB2 等数据库中不支持,必须采用变通的手段来实现。
进行集合匹配的通配符为“[]” ,方括号中包含一个字符集,它匹配与字符集中任意一个字符相匹配的字符

SELECT*FROM
T_Employee WHEREFNameLIKE
'[^SJ]%'

20、空值检测

select * from table where name is NULL

select * from table where name is not NULL

SELECT*FROM
T_Employee WHEREFNAMEIS NOT NULL
AND
FSalary <5000

21、反义运算符

“=”、“<”、“>”等运算符都是用来进行数值判断的,有的时候则会想使用这些运算符
的反义,比如“不等于”、“不小于”或者“不大于”,MSSQLServer、DB2提供了“!”运算
符来对运算符求反义,也就是“!=”表示“不等于”、“!<”表示“不小于”,而“!>”表示
“不大于”。

SELECT*FROM
T_EmployeeWHEREFAge!=22ANDFSALARY!<2000

同时SQL提供了通用的表示“不等于”的运算符“<>”
SELECT
*
FROM T_Employee WHEREFAge<>22ANDFSALARY>=2000

NOT运算符用来将一个表达式的值取反,也就是将值为“真”的表达式结果变为“假”、 将
值为“假”的表达式结果变为“真”,使用方式也非常简单“NOT (表达式)”

SELECT*FROM
T_Employee WHERE NOT(FAge=22)AND
NOT
(FSALARY<2000)
而采用NOT运算符的方式能比较容易的表达要实现的需求,而且能够实现复杂的嵌套,最重要的是避免了潜在的应用程序的Bug,所以除了“<>”这种方式之外,我们推荐使用NOT运算符的方式来表示“非”的语义。

22、多值检测 (IN)

SELECTFAge,FNumber,FNameFROM
T_Employee WHEREFAge=23ORFAge=25ORFAge=28

SELECT
FAge,FNumber,FName
FROM T_Employee WHEREFAgeIN
(23,25,28)

23、范围检测

SELECT*FROM
T_Employee WHEREFAGE>=23ANDFAGE
<=27

SELECT*FROM
T_EmployeeWHEREFAGEBETWEEN
23AND
27
SELECT*FROM
T_Employee WHERE(FSalaryBETWEEN
2000AND
3000) OR(FSalaryBETWEEN
5000AND
8000)

24、数据分组 group by

SELECT COUNT(*)FROMT_Employee WHEREFAge=23
SELECTFAgeFROM
T_Employee GROUP BYFAge
需要注意的是GROUP BY子句的位置,GROUP BY子句必须放到SELECT语句的之后,如果SELECT语句有WHERE子句,则GROUP BY子句必须放到WHERE语句的之后
SELECT
FAge
FROM T_Employee WHEREFSubCompany ='Beijing' GROUP
BY
FAge
SELECTFSubCompany,FDepartmentFROM
T_Employee GROUP BYFSubCompany,FDepartment

25、having 语句

聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替
SELECT
FAge,COUNT(*)ASCountOfThisAgeFROMT_Employee GROUP
BY
FAge HAVING COUNT(*)>1
SELECTFAge,COUNT(*)ASCountOfThisAgeFROMT_Employee GROUP
BY
FAge HAVING COUNT(*) =1OR
COUNT
(*) =3
SELECTFAge,COUNT(*)ASCountOfThisAgeFROMT_Employee GROUP
BY
FAge HAVING COUNT(*)IN(1,3)
having 语句不能含有未分组的列名

SELECTFAge,COUNT(*)ASCountOfThisAgeFROMT_Employee GROUP
BY
FAge HAVINGFNameIS NOT NULL
执行的时候数据库系统会提示类似如下的错误信息:
HAVING 子句中的列 'T_Employee.FName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

26、限制结果集limit 

格式:LIMIT 首行行号,要返回的结果集的最大数目

SELECT*FROM
T_EmployeeORDER BY
FSalaryDESC
LIMIT2,5

MSSQLServer2000中提供了TOP关键字用来返回结果集中的前N条记录,其语法为“SELECT TOP 限制结果集数目 字段列表 SELECT语句其余部分”
ROW_NUMBER()函数可以计算每一行数据在结果集中的行号(从1开始计数),其使用语法
如下:
ROW_NUMBER OVER(排序规则)
比如我们执行下面的SQL语句:
SELECT ROW_NUMBER()OVER(ORDER
BY
FSalary),FNumber,FName,FSalary,FAge FROMT_Employee
ROW_NUMBER()不能用在WHERE语句中。我们可以用子查询来解决这个问题,下面
的SQL语句用来返回第3行到第5行的数据:
SELECT *FROM
(
SELECT ROW_NUMBER()OVER(ORDER
BY
FSalary
DESC)
AS rownum,
FNumber,FName,FSalary,FAge
FROM T_Employee
)
AS a
WHERE a.rownum>=3ANDa.rownum<=5

27、抑制数据的重复

DISTINCT关键字是用来进行重复数据抑制的最简单的功能,而且所有的数据库系统都支持DISTINCTDISTINCT的使用也非常简单,只要在
SELECT之后增加DISTINCT即可,DISTINCT是对整个结果集进行数据重复抑制的

SELECT DISTINCTFDepartmentFROM
T_Employee
28、常量字段

SELECT 'CowNew集团',918000000,FName,FAge,FSubCompany FROM T_Employee
29、字段间的计算

SELECTFNumber,FName,FAge * FSalaryFROMT_Employee

SELECT
125+521,FNumber,FName,FSalary/(FAge-21)ASFHappyIndex FROMT_Employee
SELECT*FROM
T_Employee WHERE FSalary/(FAge-21)>1000

30、数据处理函数

MYSQL、Oracle、DB2:

length(字符字段):计算字符长度

MSSQLServer:len()

SUBSTRING:

主流系统都提供了取得字符串的子串的函数,在MYSQL、MSSQLServer中这个函数名
称为SUBSTRING,而在Oracle、DB2这个函数名称为SUBSTR。这个函数接受三个参数,第
一个参数为要取的主字符串,第二个参数为字串的起始位置(从1开始计数) ,第三个参数为
字串的长度。 下面的SQL语句取得每一个名称不为空的员工的名字以及名字中从第二个字符
开始、长度为3的字串:
MYSQL、MSSQLServer:
SELECT FName, SUBSTRING(FName,2,3) FROM T_Employee
WHERE FName IS NOT NULL
Oracle、DB2:
SELECT FName, SUBSTR(FName,2,3) FROM T_Employee
WHERE FName IS NOT NULL

正弦函数值的函数SIN和计算绝对值的函数ABS,它们都接受一个数值类型的参数
SELECT
FName,FAge, SIN(FAge) , ABS(SIN(FAge))FROMT_Employee

字符串拼接:

当用 +连接两个数字字符串时mysql会尝试转化为数值所以会导致连接失败

在MYSQL中进行字符串的拼接要使用CONCAT函数,CONCAT函数支持一个或者多个
参数, 参数类型可以为字符串类型也可以是非字符串类型, 对于非字符串类型的参数MYSQL
将尝试将其转化为字符串类型, CONCAT函数会将所有参数按照参数的顺序拼接成一个字符
串做为返回值。比如下面的SQL语句用于将用户的多个字段信息以一个计算字段的形式查询
出来:
SELECT
CONCAT('工号为:',FNumber,'的员工的幸福指数:',FSalary/(FAge-21))
FROM T_Employee
SELECTCONCAT_WS(',',FNumber,FAge,FDepartment,FSalary)FROMT_Employee

与MYSQL不同,MSSQLServer中可以直接使用加号“+”来拼接字符串。比如执行下面
的SQL语句:
SELECT '工号为'+FNumber+'的员工姓名为'+FnameFROMT_Employee
WHERE FNameIS NOT NULL

Oracle中使用“||”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样。
比如执行下面的SQL语句:
SELECT '工号为'||FNumber||'的员工姓名为'||FNameFROMT_Employee
WHERE FNameIS NOT NULL
除了“||” ,Oracle还支持使用CONCAT()函数进行字符串拼接,比如执行下面的SQL语
句:
SELECT CONCAT('工号:',FNumber)FROMT_Employee
与MYSQL的CONCAT()函数不同,Oracle的CONCAT()函数只支持两个参数,不支持两
个以上字符串的拼接,比如下面的SQL语句在Oracle中是错误的:
SELECT CONCAT('工号为',FNumber,'的员工姓名为',FName)FROMT_Employee
WHERE FNameIS NOT NULL
如果要进行多个字符串的拼接的话,可以使用多个CONCAT()函数嵌套使用,上面的SQL可以
如下改写:
SELECT CONCAT(CONCAT(CONCAT('工号为',FNumber),'的员工姓名为'),FName)FROM
T_Employee
WHERE FNameIS NOT NULL
DB2中使用“||”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样。比
如执行下面的SQL语句:
SELECT '工号为'||FNumber||'的员工姓名为'||FNameFROMT_Employee
WHERE FNameIS NOT NULL

31、联合结果集

联合结果集不必受被联合的多个结果集之间的关系限制,不过使用UNION仍然有两个
基本的原则需要遵守:

一是每个结果集必须有相同的列数;

二是每个结果集的列必须类型相容。

只要用UNION操作符连接这两个查询语句就可以将两个查询结果集联合为一个结果
集,SQL语句如下:
SELECT FNumber,FName,FAge FROM table1
UN
ION
SELECT FIdCardNumber,FName,FAge FROM table2
可以加上where,order by ,group by等子句

UNION运算符合并了两个查询结果集,其中完全重复的数据行
被合并为了一条。如果需要在联合结果集中返回所有的记录而不管它们是否唯一,则需要在
UNION运算符后使用ALL操作符,比如下面的SQL语句:
SELECT FName,FAgeFROMT_Employee
UNION ALL
SELECT FName,FAgeFROMT_TempEmployee
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql 技术