SQL分类:
DDL: 数据定义语言(DataDdefinition Language)
这些语句定义了不同的数据段,数据库,表,列,索引等数据库对象的定义.常用的关键字主要包括 create,drop, alter等
DQL: 数据查询语言(DataQuery Language)
主要用来对数据库中的各种数据对象进行查询。
SQL 查询语句的解析顺序:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、groupby子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、select 的字段;
8、使用orderby对结果集进行排序。
SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。
DCL: 数据控制功能(DataControl Language)
用于控制不同数据段直接的许可和访问级别的语句,这些语句定义了数据库,表,字段,用户的访问权限和安全级别,主要的语句关键字包括grant,revoke等
DML: 数据操纵语言(DataManipulation Language)
用于添加,删除,更新和查询数据库的记录,并检查数据完整性.常用的语句关键字主要包括 insert,delete,update和select等
数据库基本操作
链接数据库:在cmd下使用 mysql –u用户名 –p密码 进行链接结尾需要跟上英文下;结尾或\g 例:mysql–uroot –p123456
创建数据库: create databases 数据库名例:create databases mytest
查看所有的数据库:showdatabases
Information_schema:主要存储了系统中的一些数据库对象信息,比如用户表信息,列信息,权限信息,字符集信息,分区信息等
Cluster:存储了系统的集群信息
Mysql:存储了系统的用户权限信息
Test:系统自动穿件的测试数据库,任何用户都可以使用
选择数据库:use 数据库名 例:use mytest;
查看表:showtables 需要在执行完上一条命令后才能执行
删除数据库:drop databases 数据库名 例: drop databases mytest;
创建表:create table 表名(列名 类型,.....) 例:create table mytable(m_id int(10),m_name varchar(20) );
查看表详细信息:desc表名 例:desc mytable;
查看创建表的语句:show create table 表名 \G 例:show createtable mytable \G;
删除表:droptable 表名 例: drop table mytable;
修改表: altertable 表名 modify 列名 类型 例: altertable mytable modify m_name varchar(50);
增加表字段: alter table 表名 add columu 字段名 类型 例: alter table mytableadd columu age int(3);
删除表字段: altertable 表名 drop columu 字段名 例: altertable mytable drop columu age;
修改字段: altertable 表名 change 字段 新字段名 类型; 例: alter table mytable change age age1 int(4);
(注:change和modify都可以修改表的定义但是不同的是change后面需要写2次列名不方便,但是change的优点是可以修改列的名字,modify不可以)
修改字段顺序:字段的增加修改(add/change/modify)语法中都有一个可选项 first|after 列名 这个选项可以用来修改字段的位置 add默认是添加到后面修改语法不改变位置
例:将新字段添加在id后面
Alter table mytable add sex after m_id;
修改表名:altertable 表名 rename 新表名 例: altertable mytable rename mytable1;
DML语句
插入语句:insertinto 表名(字段名...) values(内容)
例:insert into mytable(id,name)values(1,’张三’)
可以一次插入多条
insert into mytable(id,name)values(1,’张三’),(...),(...)...
更新语句:update表名 set 字段=?? Where 字段=?
例:update mytable m_name=’李四’ where m_id=1;
删除语句:deletefrom 表名 where 字段=?
例: delete from table where m_id=1;
查询语句:select* from 表名
例:select * from mytable;
在数据不多的时候可以这样查询但是在数据多的时候这样查询会影响效率
建议将字段名直接写上,或查询建立索引的字段
查询后去重复:select distinct 列名 from 表名
例: select distinct m_name from mytable;
条件查询:select* from 表名 where 条件
例:select * from mytable where m_id=2;
多个条件可以用 or(或) 或者and拼接
排序:select* from 表名 order by 列名
例:select * from mytable order by m_id desc;
Desc|asc 是排序关键字 desc是降序排序 asc是升序排序
分段查询|分页查询:select * from 表名 limit 显示数量
例:select * from mytable limit 5; 显示前5个
Select * from mytable limit 5,10; 从第5个开始显示10个
Select * from mytable order by m_id limit5,10 查询出的结果在排序
聚合:sum(求和),count(*)记录数,max(最大数),min(最小数)
Group by 分组 withrollup 可选语法 对分组后的结果在汇总 having 对分类后的结果在过滤
(注:Having和where 去区别在于having是对聚合后的结果在过滤而where是在聚合前就对记录进行过滤,如果逻辑允许 先用where过滤在 这样结果集减小,对聚合效率提高)
例:
统计所有数量
Select count(1) from mytable;
统计叫相同名字的人数
Select m_name ,count(1) from mytable groupby m_name;
统计相同名字的人数和总的人数
Select m_name,count(1) from mytable groupby m_name with rollup;
统计相同名字大于3的名字
Select m_name,count(1) from mytable groupby m_name having count(1)>3;
统计年龄总和 和最大年龄最小年龄
Select sum(age),max(age),min(age) frommytable;
假设有员工表(emp)和部门表(dept)切相互关联
表链接:select 字段 from 表1,表二 where 表1.字段=表二.字段
例:select e_name,d_name from emp,dept whereemp.e_deptno=dept.id
(注:链接有左外链接右外链接如左外链接 就是讲左边表中不匹配的数据也查询出来右外链接这相反)
例:左外链接
Select e_name,d_name from emp left joindept on emp.deptno=dept.id;
右外链接
Select e_name,d_name from emp right joindept on emp.deptno=dept.id;
子查询:当查询是需要用到另个查询出来的结果
用于子查询的关键字有(in,not in, =,!=,exists,!exists等)
例:select * from emp where dept in(select idfrom dept)
如果子查询记录数唯一可以用=代替in
也可转换成表连接
Select emp.* from emp,dept whereemp.deptno=dept.id;
表连接在很多情况下用于优化子查询
记录联合:将两个表的查询结果合并在一起
Union 和union all
Union all是把结果集合并在一起而union是将结果集进行一次distinct去重复后显示
例:select e_name from emp union all selectd_name from dept;
DCL语句
一般的开发人员用的不多 需要的时候再去查一般是对数据库权限的控制
Mysql数据类型
数值类型
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
所有的整数类型都有一个可选属性unsigned(无符号),如果需要在字段里面保存非负数或者较大的上限值时,可以用此选项,它的取值范围是正常值的下限0,上限取原值的2倍,如 tinyint有符号的范围是-128~+127,而无符号的范围是0~255.如果一个列指定为zerofill,则mysql自动为该列添加unsigned属性;对于整型数据,mysql支持在类型名称后面的小括号内指定显示宽度如int(10)显示当前数值宽度小于10位的时候在数字前面填满宽度,默认为int(11).可以配合zerofill用0填满
另外,整数类型还有一个属性:auto_increment.在需要产生唯一标识符或顺序值时,可以利此属性,这个属性只用于整数类型,aotu_increment值一般从1开始,每行增加1,在插入null到下一个aotu_increment列时,mysql插入一个比该列中当前最大的值大一的值,一个表中只能有一个aotu_increment列
用法:createtable 表名(id int aotu_increment not null primary key);
日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
| 类型 | 大小 | 范围 | 格式 | 用途 |
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
| TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
插入时间可以用new()函数取当前时间或指定时间
Insert into 表 values(new());
TIMESTAMP 也是用来表示日期但是与DATETIME不同
在创建timestamp列时会给第一个字段设置默认值为系统日期,第二个的timestamp默认值为0
Timestamp与时区有关,当插入日期时,会先换成本地时区后存放;
Timestamp支持的时间范围较小,取值从19700101080001-2038某个时间,而datestamp是从1000-01-01 00:00:00 – 9999-12-3123:59:59 范围更大
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
| 类型 | 大小 | 用途 |
| CHAR | 0-255字节 | 定长字符串 |
| VARCHAR | 0-65535 字节 | 变长字符串 |
| TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
| TINYTEXT | 0-255字节 | 短文本字符串 |
| BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
| TEXT | 0-65 535字节 | 长文本数据 |
| MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
| LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
| LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。
运算符号
算术运算符:执行算术运算,例如:加、减、乘、除等。
比较运算符:包括大于、小于、等于或者不等于,等等。主要用于数值的比较、字符串的匹配等方面。例如:LIKE、IN、BETWEEN AND和ISNULL等都是比较运算符,还包括正则表达式的REGEXP也是比较运算符。
逻辑运算符:包括与、或、非和异或等逻辑运算符。其返回值为布尔型,真值(1或true)和假值(0或false)。
位运算符:包括按位与、按位或、按位取反、按位异或、按位左移和按位右移等位运算符。位运算必须先将数据转换为二进制,然后在二进制格式下进行操作,运算完成后,将二进制的值转换为原来的类型,返回给用户。
算术运算符
算术运算符是MySQL中最常用的一类运算符。MySQL支持的算术运算符包括:加、减、乘、除、求余。
加(+)、减(-)和乘(*)可以同时计算多个操作数。除号(/)和求余运算符(%)也可以同时计算多个操作数,但是这两个符号计算多个操作数不太好。DIV和MOD这两个运算符只有两个参数。进行除法和求余的运算时,如果x2参数是0或者null,计算结果将是空值(NULL)。
比较运算符
比较运算符是查询数据时最常用的一类运算符。SELECT语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的。
下面对几种较常用的比较运算符进行详解。
1.运算符“=”,“=”用来判断数字、字符串和表达式等是否相等。如果相等,返回1,否则返回0。
说明:在运用“=”运算符判断两个字符是否相同时,数据库系统都是根据字符的ASCII码进行判断的。如果ASCII码相等,则表示这两个字符相同。如果ASCII码不相等,则表示这两个字符不相同。注意,空值(NULL)不能使用“=”来判断。
2.运算符“<>”和“!=”,“<>”和“!=”用来判断数字、字符串、表达式等是否不相等。如果不相等,则返回1;否则,返回0。这两个符号也不能用来判断空值(NULL)。
3.运算符“>”,“>”用来判断左边的操作数是否大于右边的操作数。如果大于,返回1;否则,返回0。同样,空值(NULL)不能使用“>”来判断。
4.运算符“IS NULL”,“IS NULL”用来判断操作数是否为空值(NULL)。操作数为NULL时,结果返回1;否则,返回0。IS NOT NULL刚好与ISNULL相反。
说明:“=”、“<>”、“!=”、“>”、“>=”、“<”、“<=”等运算符都不能用来判断空值(NULL)。一旦使用,结果将返回NULL。如果要判断一个值是否为空值,可以使用IS NULL和IS NOT NULL来判断。注意:NULL和'NULL'是不同的,前者表示为空值,后者表示一个由4个字母组成的字符串。
5.运算符“BETWEEN AND”,“BETWEENAND”用于判断数据是否在某个取值范围内。
其表达式如下:
x1 BETWEEN m AND n
如果x1大于等于m,且小于等于n,结果将返回1,否则将返回0。
6.运算符“IN”,“IN”用于判断数据是否存在于某个集合中。
其表达式如下:
x1 IN(值1,值2,……,值n)
如果x1等于值1到值n中的任何一个值,结果将返回1。如果不是,结果将返回0。
7.运算符“LIKE”,“LIKE”用来匹配字符串。
其表达式如下:
x1 LIKE s1
如果x1与字符串s1匹配,结果将返回1。否则返回0。
8.运算符“REGEXP” ,REGEXP”同样用于匹配字符串,但其使用的是正则表达式进行匹配。
其表达式格式如下:
x1 REGEXP'匹配方式'
如果x1满足匹配方式,结果将返回1;否则将返回0。
说明:使用REGEXP运算符匹配字符串,其使用方法非常简单。REGEXP运算符经常与“^”、“$”和“.”一起使用。“^”用来匹配字符串的开始部分;“$”用来匹配字符串的结尾部分;“.”用来代表字符串中的一个字符。
逻辑运算符
逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回1。如果表达式是假,结果返回0。逻辑运算符又称为布尔运算符。MySQL中支持4种逻辑运算符,分别是与、或、非和异或。
1.“与”运算
“&&”或者“AND”是“与”运算的两种表达方式。如果所有数据不为0且不为空值(NULL),则结果返回1;如果存在任何一个数据为0,则结果返回0;如果存在一个数据为NULL且没有数据为0,则结果返回NULL。“与”运算符支持多个数据同时进行运算。
2.“或”运算
“||”或者“OR”表示“或”运算。所有数据中存在任何一个数据为非0的数字时,结果返回1;如果数据中不包含非0的数字,但包含NULL时,结果返回NULL;如果操作数中只有0时,结果返回0。“或”运算符“||”可以同时操作多个数据。
3.“非”运算
“!”或者NOT表示“非”运算。通过“非”运算,将返回与操作数据相反的结果。如果操作数据是非0的数字,结果返回0;如果操作数据是0,结果返回1;如果操作数据是NULL,结果返回NULL。
4.“异或”运算
XOR表示“异或”运算。当其中一个表达式是真而另外一个表达式是假时,该表达式返回的结果才是真;当两个表达式的计算结果都是真或者都是假时,则返回的结果为假。
位运算符
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。MySQL中支持6种位运算符,分别是:按位与、按位或、按位取反、按位异或、按位左移和按位右移。
运算符的优先级(由小到大)
3万+

被折叠的 条评论
为什么被折叠?



