mysql语法

Posted kkyl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql语法相关的知识,希望对你有一定的参考价值。

一、基本概念

SQL--Structured Query Language, 结构化查询语言,是关系型数据库通用的操作语言。是一种非过程性语言。

 

二、操作数据库

1.创建数据库:

  CREATE  DATABASE  [IF NOT EXISTS]  db_name  [create_specification [, create_specification] ...]  

  create_specification:

  [DEFAULT] CHARACTER SET charset_name  |  [DEFAULT] COLLATE collation_name

  其中charset_name是为数据库指定的默认字符集

  Collate是为数据库指定的默认校对规则

  校对规则是在字符集内用于比较字符的一套规则,可以控制select查询时where条件大小写是否敏感的规则

2.查看数据库:

   SHOW DATABASES

   SHOW CREATE DATABASE db_name

3.修改数据库:

  ALTER DATABASE [IF NOT EXISTS] db_name  [alter_specification [, alter_specification] ...]

4.删除数据库

  DROP DATABASE  [IF EXISTS]  db_name

5.选择数据库

  use db_name;

 

三、操作表1.sql中常见的数据类型:

  1)字符串型:varchar、char

  2)大数据类型:blob、text

  3)数值型:tinyint(占1个字节)、smallint(占2个字节)、int(占4个字节)、bigint(占8个字节)、float(占4个字节)、double(占8个字节)

  4)逻辑型:bit,位类型,可以存储指定位的值,可以指定位的个数,如果不指定则默认值为1位,即只能保存01,对应到java中可以是boolean

  5)日期型:date、time、datetime、timestamp

    **DATETIMETIMESTAMP的区别?

    * DATETIMETIMESTAMP显示的结果是一样的,都是固定的"YYYY-MM-DD HH:MM:SS"的格式

    * DATETIME支持的范围是‘1000-01-01 00:00:00‘‘9999-12-31 23:59:59‘TIMESTAMP的显示范围是‘1970-01-01 00:00:00‘2037年,且其实际的存储值为1970年到当前时间的毫秒数。

    * 在建表时,列为TIMESTAMP的日期类型可以设置一个默认值,而DATETIME不行。

    * 在更新表时,可以设置TIMESTAMP类型的列自动更新时间为当前时间。

2.字段约束

  1)定义主键约束:通常每张表都会有一个字段或多个字段联合起来唯一标识表记录,这样的字段称为这张表的主键。我们可以为这样的字段增加主键约束。主键约束要求字段必须不能为空且值必须唯一

    增加主键约束:PRIMARY KEY

  2)定义唯一约束:如果需要指定某个字段的值不能重复,可以为该字段指定唯一约束

    增加唯一约束:unique

  3)定义非空约束:如果需要指定某个字段的值不能为空,可以为该字段指定非空约束

    增加非空约束:not null

  4)外键约束:

3.操作表语句:

  1)新增表:

    CREATE TABLE table_name( field1  datatype, field2  datatype, field3  datatype)[character set 字符集] [collate 校对规则]field:指定列名 datatype:指定列类型

    注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。

  2)查看表: 

    查看表结构:desc tabName

    查看当前所有表:show tables

  3)修改表

    增加列:

    ALTER TABLE tabname ADD (column datatype [DEFAULT expr][, column datatype]...);

    修改列:

    ALTER TABLE tabname MODIFY (column datatype [DEFAULT expr][, column datatype]...);

    删除列:

    ALTER TABLE tabname DROP (column);

    修改表名:

    ALTER TABLE old_tabname RENAME TO new_tabname;

    或

    RENAME TABLE old_tabname TO new_tabname;

    修改列名称:

    ALTER TABLE tabname CHANGE [column] old_col_name new_col_name datatype

 

四、操作表记录

1.insert:

INSERT INTO tabname [(column [, column...])] VALUES (value [, value...]);

注意:

插入的数据应与字段的数据类型相同

数据的大小应在列的规定范围内

values中列出的数据位置必须与被加入的列的排列位置相对应

字符串和日期格式的数据要用单引号引起来

如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表

2.update

UPDATE tab_name SET col_name1=expr1 [, col_name2=expr2 ...]  [WHERE where_definition]  

UPDATE语法可以用新值更新原有表行中的各列。

SET子句指示要修改哪些列和要给予哪些值。

WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。

3.delete

delete from tab_name [WHERE where_definition]

where用来筛选要删除的记录,如果不使用where子句,将删除表中所有数据。

delete语句不能删除某一列的值(可使用update

delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。

TRUNCATE TABLE tab_name语句也可以删除表中数据,它和delete有所不同。delete条条删除记录,truncate是摧毁整表再重建相同结构的表,truncate效率更高。

4.select

1)基本查询 

  SELECT [DISTINCT] *|{column1, column2. column3..} FROM table;

  select 指定查询哪些列的数据。

  column指定列名。

  *号代表查询所有列。

  from指定查询哪张表。

  DISTINCT可选,指显示结果时,是否剔除重复数据

2)使用where字句查询

  Select *|列名 from tablename [WHERE where_definition]

3)排序查询

  SELECT column1, column2. column3.. FROM table order by column asc|desc;

4)聚合函数

  SQL提供的聚合函数有计数函数COUNT()、求和函数SUM()、平均值函数AVG()、最大值函数MAX()、最小值函数MIN()

5)分组查询

  SELECT column1, column2. column3.. FROM table group by column having ...

 

五、外键约束

1.外键概念:两个表存在一对多关系时,可以通过外键明确的通知数据库维系这种关系

2.建表时增加外键:foreign key(ordersid) references orders(id)

3.修改方式增加外键:

  alter table book add [constraint FK_BOOK] foreign key(pubid) references pub_com(id) [on delete restrict] [on update restrict];

4.删除外键:alter table 表名 drop foreign key 外键名

 

六、多表查询设计

1.内连接查询

只查询左边表有且右边表也有的数据,本质上是依据外键关系,在笛卡尔积查询的基础上过滤出正确的数据。通过观察结果,我们发现结果中只有两边都有对应数据的数据才能被查出来。

select * from dept ,emp where dept.id = emp.dept_id;

select * from dept inner join emp on dept.id = emp.dept_id;

2.外连接查询:

  (1)左外连接查询:在内连接的基础上增加上左边表有而有边表没有的记录

  select * from dept left join emp on dept.id = emp.dept_id;

  (2)右外连接查询:在内连接的基础上增加上右边表有而左边表没有的记录

  select * from dept right join emp on dept.id = emp.dept_id;

  (3)全外连接查询:在内连接的基础上增加左边表有而右边表没有的记录和右边表有而左边表没有的记录

  #mysql 不支持全外连接但是其他的数据库支持,比如SQL Server

  select * from dept full join emp on dept.id = emp.dept_id;

  #我们可以在mysql中使用union关键字模拟全外连接

  select * from dept left join emp on dept.id = emp.dept_id

  union

  select * from dept right join emp on dept.id = emp.dept_id;

 

七、乱码问题解决

查看当前数据库中字符集配置:

show variables like‘character%‘;

其中:

client是客户端使用的字符集。

connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。

database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。    

results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。       

server是服务器安装时指定的默认字符集设定。       

system是数据库系统使用的字符集设定。(utf-8不可修改)

set names xxx; 命令是客户端通知服务器和当前客户端交互时使用什么编码,但是这种方式每次新开客户端都需要通知服务器 很麻烦    

我们可以修改mysql/my.ini,default-character-set=gbk,这是修改服务器默认认为的客户端的字符集编码

这样一来,大部分人都是gbk的客户端,不需要设置任何东西,连进来就没乱码.如果有个别的人客户端不是gbk,也可以通过set names xxx;的方式声明自己的编码集,也没有乱码.

 

  

 

  

 

 

 

 

  

 

 


以上是关于mysql语法的主要内容,如果未能解决你的问题,请参考以下文章

mysql-5.7.9 shutdown 语法详解

MySQL 语法中 OVER 和 PARTITION 的语法错误

MySQL与Oracle的语法区别详细对比

MYSQL 简单语法

MySQL笔记--MySQL基本语法和查询

MySQL 触发语法错误