SQL语法

SQL语言的语法标准

SQL作为关系型数据库所使用的标准语言,最初是基于IBM的实现在1986年被批准的。1987年,SQL作为国际标准。

SQL的版本演变:

SQL-86, SQL-89, SQL-92, SQL-99, SQL-03

SQL语言的规范

1、在数据库系统中,SQL语句不区分大小写(建议用大写)

2、字符串常量区分大小写

3、SQL语句可单行或多行书写,以";"结尾

4、关键词不能跨多行或简写

5、用空格来和缩进提高语句的可读性

6、子句通常位于独立行,便于编辑,提高可读性

7、注释

SQL标准:/*注释内容*/ 多行注释

  -- 注释内容  单行注释,注意有空格

  MYSQL注释:#

数据库对象

1、数据库的组件(对象)

  数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器

2、命名规则

  必须以字母开头

  可包括数字和三个特殊字符(#_$)

  不要使用MYSQL的保留字

  同database(Schema)下的 对象不能同名

SQL语句构成

  keyword组成clause

  多条clause组成语句

示例

 select *               select子句

 from products       from子句

 where price>400       where子句

说明:一组SQL语句,由三个自居构成,select,from和where是关键字

数据库操作

1、创建库:

create database [if not exists] db_name; 创建数据库
character set 'character set name' 设置字符集类型
collate 'collate name' 设置排序规则

2、删除数据库

drop database 需删除的表名;

3、查看支持所有字符集:

 show character set;

4、查看支持所有排序规则:

show collation;

5、获取命令使用帮助:

MYSQL>help keyword;

6、查看数据库列表:

 mysql>show databases;
创建数据库db1:create database db1;

指定当前数据库db1:use db1

mysql 客户的的命令结束不用加‘;’而SQL标准语句中的需加‘;’

查看表的列表:show tables;

1、表的关系:二位关系

2、设计表:遵循规范

3、定义:字段,索引

  字段:字段名,字段数据类型,修饰符

  约束,索引:应该创建在经常用作查询条件的字段上

创建表

直接创建

create table tb1_name(create_definition,...)

create table students ( id tinyint unsigned not null primary key,name char(10) not null,sex char(1),phone char(11) );

(第一项为创建的id,采用最小的整数,不为空,且为主键;第二项为姓名;给定十个字符;第四个为性别,给一个字符;第五项为电话号码,设定为11个字符)

create table emp ( id int unsigned auto_increment primary key,name char(4) not null ,sex char(1) default ‘m’,adress char(20) );

auto_increment:数字自动递增;unsigned 放在int定义数字的后面

注意:一个汉字,字母数字在char里都算一个字符。primary key放在最后;添加各种修饰符要注意前后顺序,如上例中,如果将修饰符的顺序更改则会报错不能生成此表;

通过查询现存表创建;新表会被直接插入查询而来的数据

CREATE TABLE [IF NOT EXISTS] tbl_name select_statement

MariaDB [db1]> CREATE TABLE user SELECT user,host,password FROM mysql.user;

如果只想模仿查询旧表创建一个无记录的表我们可以加入条件 WHERE 0=1;

MariaDB [db1]> CREATE TABLE user SELECT user,host,password FROM mysql.user WHERE 1=0 ; 

通过复制现存的表的表结构创建,但不复制数据

CREATE TABLE [IF NOT EXISTS] tbl_name LIKE old_tbl_name

MariaDB [db1]> CREATE TABLE user3 LIKE mysql.user;

查看表

查看表结构:desc tbl_name;

查看创建表的命令:show create table tbl_name;

查看表状态:show table status like 'tbl_name';

查看指定库中所有表状态:show table status from dbl_name;

查看库里的表;(首先进入到此库中然后查看):show tables;

查看单个表状态:show table status like ‘tbl_name’\G; (表名必须要加引号)

删除库里的某个表: (首先还是要进入到存放此表的库里,查看后删除):drop table tbl_name;

数据类型

选择正确的数据类型对于获得高性能至关重要

三大原则: 

更小的通常更好,尽量使用可正确存储数据的最小数据类型 

简单就好,简单数据类型的操作通常需要更少的CPU周期 

尽量避免NULL,包含为NULL的列,对MySQL更难优化

1、整数的范围(找自己表合适的使用,使用越大的范围占用的内存空间越大)

tinyint            1个字节 范围(-128~127) 

smallint         2个字节 范围(-32768~32767) 

mediumint    3个字节 范围(-8388608~8388607) 

int                   4个字节 范围(-2147483648~2147483647) (无论是几都要占用4个字节)

bigint              8个字节 范围(+-9.22*10的18次方)   (无论是几都要占用8个字节)

取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~255) 取正整数。

 

2、浮点型(float和double),近似值 

float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位

double(m,d) 双精度浮点型16位精度(8字节) m总个数,d小数位 

设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是 123.457,但总个数还以实际为准,即6位

3、定点数 

在数据库中存放的是精确值,存为十进制  decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位

4 .字符串(char,varchar,_text)

char(n) 固定长度,最多255个字符 (常用的定义表字符的长度最少时4个字符,与下面的比效率高)

varchar(n)可变长度,最多65535个字符 (同上最少可以为一个字符减少空间的使用,但效率低)

tinytext 可变长度,最多255个字符

text 可变长度,最多65535个字符 

mediumtext 可变长度,最多2的24次方-1个字符 

longtext 可变长度,最多2的32次方-1个字符 

BINARY(M) 固定长度,可存二进制或字符,长度为0-M字节 

VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节

修饰符

• NULL 数据列可包含NULL值

• NOT NULL 数据列不允许包含NULL值

• DEFAULT 默认值 • PRIMARY KEY 主键

• UNIQUE KEY 唯一键

• CHARACTER SET name 指定一个字符集数值型

• AUTO_INCREMENT 自动递增,适用于整数类型   (数字自动增长不需要手动在添加了)

• UNSIGNED 无符号

DML: 数据操作语言

MariaDB [testdb]> DESC students;  #示例表
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| id     | tinyint(3) unsigned | NO   | PRI | NULL    | auto_increment |
| name   | varchar(30)         | NO   |     | NULL    |                |
| ages   | tinyint(2)          | NO   |     | NULL    |                |
| gender | enum('M','F')       | YES  |     | NULL    |                |
+--------+---------------------+------+-----+---------+----------------+

1、INSERT 插入数据

  • 单条记录插入

INSERT INTO tb_name (col1,col2,...) VALUES (val1,val2,...);

MariaDB [testdb]> INSERT students(id,name,ages,gender) VALUES (1,'tom',26,'M');
MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('jerry',19,'M'); 
MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('maria',19,'M');
MariaDB [testdb]> INSERT students SET name='ouyangfeng',ages=56,gender='M';
  • 多条记录插入

INSERT INTO tb_name (col1,col2,...) VALUES (val1,val2,...)[,(val1,val2,...),...];

MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('xiaolongnv',18,'F'),('dongfangbubai',28,'F');
MariaDB [testdb]> SELECT * FROM students;
+----+---------------+------+--------+
| id | name          | ages | gender |
+----+---------------+------+--------+
|  1 | tom           |   26 | M      |
|  2 | jerry         |   19 | M      |
|  3 | maria         |   19 | M      |
|  4 | xiaolongnv    |   18 | F      |
|  5 | dongfangbubai |   28 | F      |
|  6 | ouyangfeng    |   56 | M      |
+----+---------------+------+--------+
  • 从其他表查询数据保存到此表中
MariaDB [testdb]> ALTER TABLE students ADD address TEXT;  #加个字段做测试用
MariaDB [testdb]> INSERT students(name,address) SELECT user,host FROM mysql.user;
MariaDB [testdb]> SELECT * FROM students;
+----+---------------+------+--------+-----------+
| id | name          | ages | gender | address   |
+----+---------------+------+--------+-----------+
|  1 | tom           |   26 | M      | NULL      |
|  2 | jerry         |   19 | M      | NULL      |
|  3 | maria         |   19 | M      | NULL      |
|  4 | xiaolongnv    |   18 | F      | NULL      |
|  5 | dongfangbubai |   28 | F      | NULL      |
|  6 | ouyangfeng    |   56 | M      | NULL      |
|  7 | root          |    0 | NULL   | 127.0.0.1 |
|  8 | root          |    0 | NULL   | ::1       |
|  9 |               |    0 | NULL   | centos7   |
| 10 | root          |    0 | NULL   | centos7   |
| 11 |               |    0 | NULL   | localhost |
| 12 | root          |    0 | NULL   | localhost |
+----+---------------+------+--------+-----------+

2、UPDATE 修改数据

UPDATE tbl_name SET col1=value1,col2=value2,... WHERE col=value;

MariaDB [testdb]> UPDATE students SET gender='F' WHERE id=3;

3、DELETE 删除数据

MariaDB [testdb]> DELETE FROM students WHERE name='';  #删除名字为空的记录
MariaDB [testdb]> TRUNCATE TABLE user;  #快速删除整个表,且不可恢复
注意:

delete from students where id=4; (删除id=4的哪一行)

delete from students;如果不写where限定条件,默认会删除此表的所有内容,如果在配置文件里面添加

vim /etc/my.cnf.d/mysql-clients.cnf   #当然加限制条件是要退出mysql

[mysql]

safe-updates

添加此行内容就不会删除所有的内容了。

SELECT:数据查询

  • AS:别名
  • WHERE:指明过滤条件以实现“选择”的功能
  • +, -, *, /, %:算术操作符
  • =, !=, <>, >, <, >=, <=:比较操作符
  • between min_num AND max_num:在min_num和max_mun之间
  • IN (element1,element2,...):在element...中的
  • IS NULL:为空
  • IS NOT NULL:不为空
  • LIKE:做匹配,像。。。
    • %:任意长度的任意字符
    • _:单个任意字符
  • RLIKE:正则表达式,不建议用
  • REGEXP:同上
  • NOT, AND, OR, XOR:逻辑操作符
  • GROUP BY:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算
  • AVG() 平均数
  • MAX() 最大数
  • MIN() 最小数
  • COUNT() 统计
  • SUM() 求和
  • HAVING :对分组聚合运算后的结果指定过滤条件。类似WHERE的作用,但只能在分组中使用
  • ORDER BY:排序
  • ASC:正序,默认
  • DESC:倒序
  • -KEYWORD:在排序时在关键字前加-可以避免把NULL排在前边
  • LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制

1、选择

MariaDB [testdb]> SELECT * FROM students WHERE name='maria';  #查询maria的信息
MariaDB [testdb]> SELECT * FROM students WHERE id BETWEEN 2 AND 5;  #查询2到5号学生的信息
MariaDB [testdb]> SELECT * FROM students WHERE name IN ('jerry','xiaolongnv');  #查询jerry和xiaolongnv的信息
MariaDB [testdb]> SELECT * FROM students WHERE gender IS NOT NULL;  #查询年龄不为空的信息
MariaDB [testdb]> SELECT * FROM students WHERE name LIKE '%o%';  #查询姓名中包含'o'的信息

2、投影

MariaDB [testdb]> SELECT user AS 用户,host AS 主机,password AS 密码 FROM mysql.user;

3、分组

MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender;  #查询男生、女生年龄的平均值
MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender HAVING gender='M';  #只显示男生的平均年龄信息

4、排序

MariaDB [testdb]> SELECT * FROM students ORDER BY ages DESC;  #按年龄排序,倒序显示
MariaDB [testdb]> SELECT * FROM students WHERE ages > 0 ORDER BY ages LIMIT 3;  #按年龄排序,过滤年龄大于0的,正序排序,取前三条记录

多表查询

JOIN ON:交叉连接

INNER JOIN ON:内连接

LEFT OUTER JOIN ON:左外连接

RIGHT OUTER JOIN ON:右外连接

UNION ON:完全外连接

posted @ 2018-06-10 20:28  琼兔  阅读(225)  评论(0编辑  收藏  举报