SQL语句使用入门

SQL使用入门

总结自:PHP从入门到精通——含基础入门、MySQL、项目实战,孙胜利

数据库基本概念

  • 数据库:信息存储的仓库,包括一系列的关系措施!
  • 表:一个数据库中可以有若干张表,形式上可以看出我们日常生活中建立的表。
  • 字段:表里面的信息会分若干个栏目来存,这些栏目我们在数据库中叫“字段”,栏目里面存的具体信息叫“字段值”
  • 记录:一条信息我们叫一条记录
  • 一个数据库管理系统中可以建立若干个数据库,每个数据库中又可以建立若干张表,每张表中可以有若干条记录。

MySQL支持的数据类型

数值类型
  • 类型
    整数类型 字节 范围(有符号) 范围(无符号)
    TINYINT 1 -128,127 0,255
    SMALLINT 2 -32768,32767 0,65535
    MEDIUMINT 3 -8388608,8388607 0,16777215
    INT,INTEGER 4 -2147483648,2147483647 0,4294967295
    BIGINT 8 -9223372036854775808,9223372036854775807 0,18446744073709551615
  • zerofill: 显示宽度,在定义类型的时候,在类型名称后面的小括号内指定显示宽度,例如int(5)表示当数值宽度小于5位的时候,在数字前面填满宽度,如果不显示置顶宽度则默认int(11)。一般配合zerofill使用,用"0"填充。如果插入大于宽度限制的值,并不会有任何影响,还是按照类型的实际精度进行保存。
  • unsigned:所有的整数类型都有一个可选属性unsigned(无符号)。如果需要在字段里保存非负数或者需要较大上限值时,可以用此选项。如果一个列指定为zerofill,则mysql自动为该列添加unsigned属性。
  • auto_increment:需要产生唯一标识符或者顺序值时,可用此属性,这个属性只能用于整数类型。auto_increment值一般从1开始,每行增加1。在插入null到一个auto_increment列时,mysql插入一个比该列中当前最大值大1的值。一个表中最多只能有一个auto_increment列。对于auto_increment列,应该定义为not null,并且定义为primary key或者定义为unique键。
  • 主键:可以唯一标识某条记录的一个字段或者多个字段
    • 注意点:
      - 主键最好不要设置在某个与实际信息相关的字段上,主键的作用应该明确且单一
      - 主键最好设置在整数类型的字段上面(处理或查询起来效率较高)
      - 主键必须不同,并且不能为null
      - 既然主键必须不同所以我们会配合 auto_increment属性
      - 一个表只能有一个主键,最好只设置在一个字段上
      - 根据主键的值来查询记录时可以获得极快的速度(因为设置了主键的字段已经创建了索引)!
    • 设置方法:
      在创建表的时候
      primary key(字段)
      primary key(字段1,字段2)
      例如:create table 表名(字段名称1 类型,…,primary key(字段名称1));
      也可以直接写在需要创建主键的字段后面
      create table 表名(字段名称 类型 primary key,…);
      如果忘了设置,可以alter table 表名 add primary key (字段名称);
    • 删除:alter table 表名 drop primary key;注意:如果字段具有auto_increment属性必须先删除auto_increment属性;
  • not null:规定字段的值是否可以为null,not null即不可以为null,该属性也可用于其他类型字段。
  • default:设置默认值,default值,该属性也可用于其他类型字段。
    • 例如:create table t10(id int auto_increment primary key, name int not null default 1111);
  • 小数的表示
    • 浮点数:分为单精度FLOAT[(M,D)][UNSIGNED][ZEROFILL]和双精度DOUBLE[(M,D)][UNSIGNED][ZEROFILL]。M是小数总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。如果指定UNSIGNED,不允许负值。
    • 单精度(float):单精度的浮点数精确到大约7位小数位(整数部分加上小数部分的位数)
    • 双精度精度(double):双精度的浮点数精确到大约15位小数位(整数部分加上小数部分的位数)
    • 定点数:只有decimal一种表示,DECIMAL(M,D) 占M+2个字节。定点数在MySQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
日期类型
日期和时间类型 字节 最小值 最大值
DATE 4 1000-01-01 9999-12-31
DATETIME 8 1000-01-01 00:00:00 9999-12-31 23:59:59
TIMESTAMP 4 1970-01-01 00:00:00 2038 年某时
TIME 3 -838:59:59 838:59:59
YEAR 1 1901 2155
  • DATETIME是常用的日期类型。
字符串类型
类型 说明
CHAR(M) M为0~255之间的整数,表示可以存M个字符(不管是中文还是英文字符总共个数是M个就OK)
VARCHAR(M) M为0~65535之间的整数,表示可以存M个字符,具体M最大多大和字符集有密切关系。注意:varchar列的最大的存储空间是65,532字节,如果是英文字符集(一个英文字符占1个字节)就是可以放65532个英文字符。自己在实际开发的过程中M设置的值,应该从自己的实际需求去考虑,而不是最大能存多少个字符,因为超过最大能设定的字符数会自动报错或者警告!
TINYTEXT 允许长度0~255字符
TEXT 允许长度0~65535字符
MEDIUMTEXT 允许长度0~16,777,215字符
LONGTEXT 允许长度0~4,294,967,295字符
  • 注意点
    • char类型的字符所占的存储空间是固定,不管你用的时候存了几个字符,它所占的空间都是你当初设定的字符空间。比如char(255) 哪怕你存的只是1个a,那么它也是占255个字符长度的空间!
    • varchar列所占的存储空间是可变的,根据存入的字符长度来确定实际占多少的空间! varchar(255) 实际所占的空间就是实际字符的长度+1个字节!varchar(超过255) 实际所占的空间就是实际字符的长度+2个字节!更节省空间!
    • 在检索时,char列删除尾部的空格,因为当字符数不够时后面补充空格,取出时会自动去掉所有尾部空格,而varchar则保留这些空格。
    • 选择:由于char是固定长度,所以它的处理速度比varchar快,但是缺点是浪费存储空间。所以对于那些长度变化不大的数据可以选择此列
    • 保存少量字符串的时候,选择char或者varchar,保存大文本的时候通常会选择使用text。
BLOB类型
  • blob类型是用来保存二进制数据的,比如照片。
ENUM类型
  • 枚举类型,它的值范围需要在创建表时,通过枚举方式显示指定,对1~255个成员的枚举需要1个字节存储;对于256~65535个成员,需要2个字节存储。最多有65535个成员。
  • 例如:
    • create table t1(flag enum('a','b','c','d'));
    • insert into t1 values('a'),('a'),('f');
  • 往enum类型里存储的数据是忽略大小写的。
  • 另外enum类型只允许从值集合中选取单个值,不能一次取多个值。
SET类型
  • set和enum类型非常类似,也是一个字符串对象,里面可以包含0~64个成员。根据成员的不同,存储上也有所不同。
    • 1~8成员的集合,占1个字节
    • 9~16成员的集合,占2个字节
    • 17~24成员的集合,占3个字节
    • 25~32成员的集合,占4个字节
    • 33~64成员的集合,占8个字节
  • set类型可以从允许值集合中选择任意一个或者多个元素进行组合。所以对于输出的值只要在允许的组合范围内,都可以正确地注入到set类型的列中。
  • 对于超出允许值范围的值,将不允许注入,对于包含重复的成员的集合将只取一次进行注入。
  • 使用FIND_IN_SET函数对set类型的数据进行查询是比较好的选择。
    • 例如:select * from t16 where find_in_set('man', sex);

SQL分类

  1. DDL(Data Definition Languages)语句
    • 数据定义语句,通过这类语言可以对数据库进行创建,删除,修改等操作的语言,DDL语句更多的是由数据库管理员(DBA)使用,开发人员一般很少使用。
  2. DML (Data Manipulation Languages)语句
    • DML操作是指对数据库中表记录的操作,主要包括表记录的插入,更新,删除和查询,是开发人员日常使用最频繁的操作。
  3. DCL(Data Control Languages)语句
    • DCL语句主要是DBA用来管理系统中的对象权限时使用的,一般开发人员很少使用。

DDL语句

  1. 登录数据库 msyql -u 用户名 -p敲回车,然后输入密码即可
  2. 退出数据库 exit;
  3. 命令结束符用;\g
  4. 客户端的连接ID,这个数字记录了MySQL服务到目前为止的连接次数,每个新连接都会自动加1
  5. 查看数据库列表 show databases;
  6. 查看所有警告 show warnings;
  7. 创建数据库 create database;
  8. 选择数据库use 数据库;
  9. 查看数据库中的数据表 show tables;
  10. 查看创建指定的表信息show create table table_name;
  11. 删除数据库 drop database 数据库;
  12. 创建表
	create table 表名(
		字段1名 字段1类型 列的约束条件,
		字段2名 字段2类型 列的约束条件,
	);
  1. 创建完表之后可以查看表的定义desc 表名;
  2. 查看创建表的SQL语句show create table 表名 \G, \G选项使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录,\G后面无需在加分号。
  3. 删除表 drop table 表名;
  4. 修改表
    • 修改表字段 alter table 表名 modify [column] 字段名 字段定义 [first|after 字段名];
    • 增加表字段 alter table 表名 add [column] 字段名 字段定义 [first|after 字段名];
    • 删除表字段 alter table 表名 drop [column] 字段名;
    • 字段改名 alter table 表名 change [column] 旧的字段名 字段名 字段定义 [first|after 字段名]; change与modify都可以修改表的定义,不同的是change后面需要接两次列名,不方便,但是优点是change可以修改字段名称。
    • 修改字段的排列排序 前面介绍的字段增加和修改语法(add/change/modify)中,都有一个可选项first|after 字段名,这个选择可以用来修改字段在表中的位置,新增的字段默认是加载在表中最后位置,而change/modify默认都不会改变字段得位置。
    • change/first|after 字段名 这些关键字都是属于MySQL在标准SQL上的扩展,在其他数据库上不一定适用。
    • 更改表名 alter table 表名 rename [to] 新的表名;

DML语句

  1. 插入记录insert into 表名 (字段1,字段2,... , 字段n) values (值1, 值2, ... ,值n); 也可以不用指定字段名,但是values后面的顺序应该和字段的排序一致。
  2. 一次性插入多条记录 insert into 表名 (字段1,字段2,... , 字段n) values (值1, 值2, ... ,值n), (值1, 值2, ... ,值n), (值1, 值2, ... ,值n),...;
  3. 更新记录
    • 更新一个表 update 表名 set 字段1=值1,字段2=值2,...字段n=值n [where 条件];
    • 更新多个表中的数据 update 表1,表2,... 表n set 表1.字段1=表达式1,表2.字段2=表达式2,...表n.字段n=表达式n [where 条件]; 多表更新更多的用在根据一个表的字段来动态更新另外一个表的字段。
  4. 删除记录
    • 删除单表数据 delete from 表名 [where 条件];
    • 删除多个表中的数据 delete 表1, 表2, ... , 表n from 表1, 表2, ... 表n [where 条件]; 不管是单表还是多表,不加where条件,将会把表中的所有记录删除。
  5. 查询记录 select 字段名|* from 表名;
    • 查询不重复记录 select distinct field1, field2 from 表名; 只要filed1,field2任何一个地方有不同就会被选择,一般使用distinct只筛选一个字段。
    • 条件查询 =,<,>,>=,<=,!=,等比较运算符,多个条件之间可以使用or,and等。where后面接条件,select * from 表名 where 条件;
    • 排序和限制,
      • 排序:select * from 表名 order by 字段1 asc|desc,字段2 asc|desc,... 字段n asc|desc;, asc:由低到高,desc:由高到低。
      • 限制:在语句的最后面加上limit 数字,数字来进行查询数量的限制。limit 数字1, 数字2; 数字1代表从第几条记录开始取(是从0开始的),数字2代表取几条。
    • 聚合:
      • sum求和 select sum(字段名) from 表名;
      • count记录总数 select count(*|字段名) from 表名;
      • max最大值 select max(字段名) from 表名;
      • min最小值 select min(字段名) from 表名;
      • group by 表示要进行的分类聚合(上面的这些函数)的字段。select [字段2],sum(字段1) from 表名 group by 字段2;
      • with rollup 是可选语法,表名是否对分类聚合后的结果进行再汇总,select sum(字段1) from 表名 group by 字段2 with rollup;
      • having 关键字表示对分类后的结果在进行条件的过滤,having和where的区别在于,having是对聚合后的结果进行条件过滤,where是在聚合前就对记录进行过滤,应该尽可能的对记录进行先过滤。select sum(字段1) from 表名 group by 字段2 having sum(字段1) > 1000;
    • 表连接
      • 显示多个表中的字段的时候即可使用表连接
      • 连接分类
        • 内连接:选取两张表中相互匹配的记录 select 表.字段, ... from 表1,表2,...表n where [匹配的条件 表1.字段=表2.字段];select语句可以给字段和表起别名,直接写在需要查询显示的字段后面。 select 表.字段 [字段别名], ... from 表1 [表别名],表2 [表别名],...表n [表别名] where [匹配的条件 表1.字段=表2.字段];
        • 外连接:不仅仅选取两张互相匹配的记录,并且会选出其他不匹配的记录。
        • 外连接包括:左连接和右连接
        • 左连接: 包含左边表中的所有记录(包括右表中没有和它匹配的记录)select 字段1, 字段2 from 左表 left join 右表 on 左表.字段=右表.字段;
        • 右连接:包含右边表中的所有记录(包括左表中没有和它匹配的记录)select 字段1, 字段2 from 左表 right join 右表 on 左表.字段=右表.字段;
        • 左连接和右连接是可以相互转换的。
    • 子查询 : 一个查询需要另外一个查询的结果参与的时候
      • 用于子查询的关键字:in , not in, exists, not exits。
      • in select * from 表1 where 字段1 in (select 字段2 from 表2); in后面的子语句必须只返回一个字段,若查询结果唯一(只有一条)可以使用=代替in。
      • not in 与in相反
      • exits select 语句 where exists(select 语句); exits:后面子语句有没有查询出记录来,如果查询出记录(不管是不是null)则返回true,否则就是false。
      • not exits 于exits相反
    • 记录联合 : 我们常常会碰到需要将两个表或者多个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示,这时就需要用到记录联合。
      • 多个select语句用union或者union all连接即可实现
      • 区别:union 会将多个查询结果合并后并且进行去除重复后返回。union all 则直接合并并不去重复。
      • 联合条件: 查询的列个数要相等。

补充知识

  1. 查看所有可用字符集show character set;或者查看information_schema.character_sets也可以。
  2. MySQL的字符集包括字符集(character)和校对规则(collation)两个概念。
    • 字符集用来定义MySQL存储字符串的方式
    • 校对规则用来定义 字符串比较的方式
    • 字符集和校对规则是一对多的关系,一个字符集有多个校对规则供你选择!
    • 校对规则命名约定:它们以相关的字符集名开始,通常包括一个语言名,并且以
      • _ci(忽略大小写)
      • _cs(大小写敏感)
      • _bin(二元,即比较是基于字符编码的值而与language无关)结束。
    • 查看字符集的校对规则:show collation like '字符集前缀%';
  3. MySQL内部的字符集和校对规则设置
    1. 服务器字符集和校对规则设置 略
    2. 数据库字符集和校对规则设置
      CREATE DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
      
      查看当前数据库的字符集和校对规则:
      show variables like 'character_set_database';
      show variables like 'collation_database';
      
      更改字符集和校对规则:
      ALTER DATABASE db_name
      	[[DEFAULT] CHARACTER SET charset_name]
      	[[DEFAULT] COLLATE collation_name]
      
      1. 表字符集和校对规则设置
      	CREATE TABLE tbl_name (column_list)
      	[DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
      
      	ALTER TABLE tbl_name
      	[DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]
      
      4.字段(列)字符集和校对规则
      遇到这种情况概率比较小,这只是MySQL提供给我们一个灵活设置的手段
  4. MySQL连接字符集设置
    过程中要设置正确,诚实守信,这样子如果全部设置正常,服务器端会自动的去按照你设置的字符集转换,但是也要避免转换的过程,最好都设置成一样的编码!
    连接字符集设置:客户端和服务器之间交互的字符集
    1. 对于客户端和服务器段的交互操作,MySQL提供了3个不同的参数:

      • character_set_client:客户端来源数据使用的字符集
      • character_set_connection:连接层字符集
      • character_set_results:返回结果字符集
        知识拓展:数据在客户端和服务器之间交互的过程中字符集转换的大概过程
      • MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
      • 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,内部操作字符集的确定方法如下:
        • 使用每个数据字段设定的字符集;
        • 若上述值不存在,则使用对应数据表设定的字符集;
        • 若上述值不存在,则使用对应数据库设定的字符集;
        • 若上述值不存在,则使用服务器设定的字符集。
      • 将操作结果从内部操作字符集转换为character_set_results。
    2. 这3个参数设定的字符集应该相同,并且客户端使用的字符集确实是参数character_set_client的值,才可以确保用户的数据可以正确的返回且输出。

    3. 查看当前设置:show variables like ‘character_set%’;
      修改:
      set names 字符集,可以同时修改3个参数的值,对本次有效
      也可以在配置文件中设置:
      [mysql]
      default-character-set=字符集

    4. 客户端使用字符,连接层使用的字符集,内部使用的字符集,返回使用的字符集,最好都设置层一样的,并且客户端使用的字符集确实是character_set_client参数的值,这样就绝对不会出现问题!

  5. MySQL提供了一些运算符号供我们在SQL语句中使用,比如我们需要对SQL语句中的某个值,或者某个字段做运算操作的时候,就可以使用这些运算符
1.算数运算符
  运算符		作用
  +		加法
  -		减法
  *		乘法
  /,DIV		除法,返回商
  %,MOD		取余数
2.比较运算符
  运算符		作用
  =		等于
  <>或!=		不等于
  <=>		可以用于null值的比较
  <		小于
  <=		小于等于
  >		大于
  >=		大于等于
  BETWEEN		存在指定范围
  IN		存在于指定集合
  IS NULL		为NULL
  IS NOT NULL	不为NULL
  LIKE		通配符匹配
  REGEXP或RLIKE	正则表达式匹配
3.逻辑运算符
  逻辑运算符又称为布尔运算符,用来确认表达式的真和假
  运算符		作用
  NOT或!		逻辑非
  AND或&&		逻辑与
  OR或||		逻辑或
  XOR		逻辑异或
4.运算符的优先级
  在实际运行的时候,实际上很少有人能够将运算符的优先级熟练记忆
  很多情况下我们都是用“()”来将需要优先的操作括起来,这样既起到了优先的作用,又使得其他用户看起来更易于理
  解
  1. 常用函数
1.字符串函数
  函数			功能
  CONCAT(S1,S2,...Sn)	连接S1,S2,...Sn为一个字符串
  INSERT(str,x,y,instr)	将字符串str从第x位置开始,y个字符长的字符串换位字符串instr
  LOWER(str)		将字符串str中所有字符变为小写
  UPPER(str)		将字符串str中所有字符变为大写
  LEFT(str,x)		返回字符串str最右边的x个字符
  RIGHT(str,x)		返回字符串str最右边的x个字符
  LPAD(str,n,pad)		用字符串pad对str最左边进行填充,直到长度为n个字符长度
  RPAD(str,n,pad)		用字符串pad对str最右边进行填充,直到长度为n个字符长度
  LTRIM(str)		去掉字符串str左侧的空格
  RTRIM(str)		去掉字符串str行尾的空格
  REPEAT(str,x)		返回str重复x次的结果
  REPLACE(str,a,b)		用字符串b替换字符串str中所有出现的字符串a
  STRCMP(s1,s2)		比较字符串s1和s2
  TRIM(str)		去掉字符串行尾和行头的空格
  SUBSTRING(str,x,y)		返回从字符串str x位置起y个字符长度的字符串
  LENGTH(str)		返回字符串长度
2.数值函数
  函数			功能
  ABS(x)			返回x的绝对值
  CEIL(x)			返回大于x的最小整数值
  FLOOR(x)			返回小于x的最大整数值
  MOD(x,y)			返回x/y的模
  RAND()			返回0-1内的随机值
  ROUND(x,y)		返回参数x的四舍五入的有y位小数的值
  TRUNCATE(x,y)		返回数字x截断为y位小数的结果			
3.日期和时间函数
  函数			功能
  CURDATE()		返回当前日期
  CURTIME()		返回当前时间
  NOW()			返回当前的日期和时间
  UNIX_TIMESTAMP(date)	返回日期date的UNIX时间戳
  FROM_UNIXTIME()		返回UNIX时间戳的日期值
  WEEK(date)		返回日期date为一年中的第几周
  YEAR(date)		返回日期date的年份
  HOUR(time)		返回time的小时值
  MINUTE(time)		返回time的分钟值
  MONTHNAME(date)		返回date的月份名
  DATE_FORMAT(date,fmt)	返回按字符串fmt格式化日期date值
  DATE_ADD(add,INTERVAL expr type) 返回一个日期或时间值加上一个时间间隔的时间值
  DATEDIFF(expr,expr2)	返回起始时间expr和结束时间expr2之间的天数		
4.流程函数
  函数			功能
  IF(value,t,f)		如果value是真,返回t,否则返回f
  IFNULL(value1,value2)	如果value1不为null,返回value1,否则返回value2
  CASE WHEN [value1] THEN [result1]...ELSE[default]END	如果value1是真,返回result1,否则返回default
  CASE [expr] WHEN [value1] THEN[result1]...ELSE[default]END  如果expr等于value1,返回result1,否则返回
						default	
5.其他常用函数
  函数			功能
  DATABASE()		返回当前数据库名
  VERSION()		返回当前数据库版本
  USER()			返回当前登录用户名
  INET_ATON(IP)		返回IP地址的数字表示
  INET_NTOA(num)		返回数字代表的IP地址
  PASSWORD(str)		返回字符串str的加密版本
  MD5()			返回字符串str的MD5值

猜你喜欢

转载自blog.csdn.net/sinat_25259461/article/details/90340470