数据库增删改查操作

目录

数据库操作

数据库类型

创建和删除数据表

表操作

高级操作

SQL 约束

SQL 日期

SQL 函数

总结

参考


数据库操作

登陆数据库: mysql -h xxx -uroot -p pass 数据库名称
创建数据库: CREATE DATABASE 数据库名;
删除数据库: drop database <数据库名>;
显示数据库: show databases;
使用数据库: use 数据库名;

数据库类型

Extra信息
数值类型: INT UNSIGNED、int(10) unsigned、float、
         int(size)  tinyint(size)
         tinyint(1、4) NOT NULL DEFAULT '1' COMMENT 'k8sservice端口标识'
         float NOT NULL DEFAULT '0' COMMENT 'cpu_quota',
日期和时间类型: `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:01' COMMENT '触发时间',
              `last_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最近修改时间',
字符串类型: `instance_type` varchar(128) NOT NULL DEFAULT '' COMMENT 'instance 类型',   varchar(256)\text类型 

创建和删除数据表

创建数据表: 
    CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   `runoob_title` VARCHAR(100) NOT NULL,
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
    CREATE TABLE IF NOT EXISTS `person` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'key',
  `name` varchar(65) NOT NULL DEFAULT '' COMMENT '名字',
  `city` varchar(1024) NOT NULL DEFAULT '' COMMENT '居住城市',
  `address` varchar(1024) NOT NULL DEFAULT '' COMMENT '居住地址',
  `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:01' COMMENT '触发时间',
  PRIMARY KEY ( `id` )
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='person';
​
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎,CHARSET 设置编码。
​
删除表:
   DROP TABLE table_name;
   TRUNCATE TABLE 表名称;
查看创建表: show create table xxx;
查看表结构: desc xxx;   
修改表操作: ALTER TABLE 语句 用于在已有的表中添加、修改或删除列。
   表中添加列: ALTER TABLE table_name ADD column_name datatype
   表中删除列: ALTER TABLE table_name DROP COLUMN column_name
   修改列: ALTER TABLE table_name ALTER COLUMN column_name datatype

表操作

插入数据: INSERT INTO 表名称 VALUES (值1, 值2,....)             // 必须全部指定
         INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) 指定列插入数据
         insert table_name set xxx='',xxx='',xxx='';
insert user set name="evanlixin",role="admin",token="0848a0cbcdde9a24e27a2e5f2918fd8b";
查询数据: SELECT 列名称 FROM 表名称   
         SELECT * FROM 表名称
distinct: SELECT DISTINCT 列名称 FROM 表名称 关键词 DISTINCT 用于返回唯一不同的值。
where 子句: SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
操作符 描述
=    等于
!=   不等于
>    大于
<    小于
>=   大于等于
<=   小于等于
BETWEEN   在某个范围内
LIKE      搜索某种模式
​
and 和 or运算符
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
​
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
SELECT Company, OrderNumber FROM Orders ORDER BY Company
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber  按照Company升序排,相同时按照OrderNumber排
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC 逆序排
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
注意:在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。
​
修改表中数据: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
删除表中行: DELETE FROM 表名称 WHERE 列名称 = 值
          DELETE FROM table_name

高级操作

limit语句: 
     LIMIT可以实现top N查询,也可以实现M至N(某一段)的记录查询
     SELECT * FROM MYTABLE ORDER BY AFIELD LIMIT offset, recnum
     其中offset为从第几条(M+1)记录开始,recnum为返回的记录条数。
     select * from person order by name limit 2;
     select * from person where id >= 1 and id <=3;
     
LIKE操作符: 用于在 WHERE 子句中搜索列中的指定模式  "%" 可用于定义通配符(模式中缺少的字母)
     SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
     SELECT * FROM Persons WHERE City LIKE 'N%'\'%g'\'%lon%'\ NOT LIKE '%lon%'
​
SQL 通配符:  必须与 LIKE 运算符一起使用。
            % 替代一个或多个字符
            _ 仅替代一个字符
            [charlist]  字符列中的任何单一字符   LIKE '[ALN]%'
            [^charlist]  [!charlist]   不在字符列中的任何单一字符
​
IN 操作符: 在 WHERE 子句中规定多个值
          SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
​
SQL 别名:  可以为列名称和表名称指定别名(Alias)  别名使查询程序更易阅读和书写
          SELECT column_name(s) FROM table_name AS alias_name
          SELECT column_name AS alias_name FROM table_name
          
          
SQL INNER JOIN 关键字: 两种写法 在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
      SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 
      ON table_name1.column_name=table_name2.column_name
      
我们希望列出所有人的定购      
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName      
​
内联合的两种写法:
SELECT podvm.id, podvm.group_id, podvm.task_id, podvm.name, podvm.hostname, podvm.gpu,podvm.cpu, podvm.memory, podvm.image_address, podvm.vm_index,
  podvm.pod_ip, podvm.binding_status, podvm.binding_target, podvm.status, podvm.op_user, podvm.region, podvm.create_time, podvm.tor, podvm.offline from
  podvm INNER JOIN podvmgroup ON podvm.group_id = podvmgroup.id
  where podvmgroup.service_ns = ?`
​
SELECT podvm.id, podvm.group_id, podvm.task_id, podvm.name, podvm.hostname, podvm.gpu,podvm.cpu, podvm.memory, podvm.image_address, podvm.vm_index, podvm.pod_ip, podvm.binding_status, podvm.binding_target, podvm.status, podvm.op_user, podvm.region, podvm.create_time, podvm.tor, podvm.offline from podvm,podvmgroup where podvm.group_id = podvmgroup.id and podvmgroup.service_ns="evan-test.didicloud.op.didi.com"\G
​
​
SELECT podvm.id, podvm.group_id, podvm.task_id, podvm.name, podvm.hostname, podvm.gpu, podvm.cpu, podvm.memory, podvm.image_address, podvm.vm_index,
  podvm.pod_ip, podvm.binding_status, podvm.binding_target, podvm.status, podvm.op_user,podvm.host_ip, podvm.region, podvm.create_time, podvm.tor, podvm.offline from
  podvm INNER JOIN podvmgroup ON podvm.group_id = podvmgroup.id
  where podvmgroup.service_ns = ? and podvmgroup.region = ? and podvmgroup.name =? `
  
LEFT JOIN 关键字
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
SELECT column_name(s) FROM table_name1  LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name
​
现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
​
RIGHT JOIN 关键字
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name
​
我们希望列出所有的定单,以及定购它们的人 - 如果有的话。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons
RIGHT JOIN Orders  ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
​
FULL JOIN 关键字
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

SQL 约束

约束用于限制加入表的数据的类型。

可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。

我们将主要探讨以下几种约束:

  • NOT NULL

  • UNIQUE

  • PRIMARY KEY

  • FOREIGN KEY

  • DEFAULT

NOT NULL 约束
    NOT NULL 约束强制列不接受 NULL 值。
    NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
DEFAULT 约束
DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。    
PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
   主键必须包含唯一的值。
   主键列不能包含 NULL 值。
   每个表都应该有一个主键,并且每个表只能有一个主键。
   创建表时通过 PRIMARY KEY ( `runoob_id` ) 进行主键约束。
UNIQUE 约束
   UNIQUE 约束唯一标识数据库表中的每条记录。
   UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
   PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
   请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
   UNIQUE KEY `uniq_token` (`token`)
FOREIGN KEY 约束
   一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。   
   FOREIGN KEY 约束用于预防破坏表之间连接的动作。
   FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。   

SQL 日期

当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。

只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。

MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:

  • DATE - 格式 YYYY-MM-DD

  • DATETIME - 格式: YYYY-MM-DD HH:MM:SS

  • TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS

  • YEAR - 格式 YYYY 或 YY

数据库增删改查操作_第1张图片

`create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:01' COMMENT '触发时间',
`last_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最近修改时间',
CURRENT_TIMESTAMP 表示当前的时间戳



SELECT NOW(),CURDATE(),CURTIME()  返回当前的日期和时间
DATE() 函数返回日期或日期/时间表达式的日期部分。 DATE(date)
EXTRACT() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
     EXTRACT(unit FROM date)
DATE_ADD() 函数向日期添加指定的时间间隔。DATE_ADD(date,INTERVAL expr type)
     date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。
DATE_SUB() 函数从日期减去指定的时间间隔。 DATE_SUB(date,INTERVAL expr type)
DATEDIFF() 函数返回两个日期之间的天数。 DATEDIFF(date1,date2)
​
数据库表统计七天之内的数据:
select count(*) from task where category_type="xxx" and task_type="xxx" and date_sub(NOW(),INTERVAL 7 DAY) <= last_update_time

SQL 函数

拥有很多可用于计数和计算的内建函数。   SELECT function(列) FROM 表
​
AVG 函数返回数值列的平均值。NULL 值不包括在计算中。 SELECT AVG(column_name) FROM table_name
COUNT() 函数返回匹配指定条件的行数. 
    SELECT COUNT(column_name) FROM table_name
    SELECT COUNT(*) FROM table_name
    SELECT COUNT(DISTINCT column_name) FROM table_name
MAX 函数返回一列中的最大值。NULL 值不包括在计算中。 SELECT MAX(column_name) FROM table_name
MIN 函数返回一列中的最小值。NULL 值不包括在计算中。 SELECT MIN(column_name) FROM table_name
SUM 函数返回数值列的总数(总额)。 SELECT SUM(column_name) FROM table_name
​
GROUP BY 语句
    GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
SELECT column_name, aggregate_function(column_name) FROM table_name
WHERE column_name operator value  GROUP BY column_name
区别:
SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
SELECT Customer,SUM(OrderPrice) FROM Orders
解释如下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。"SUM(OrderPrice)" 返回一个单独的值("OrderPrice" 列的总计),而 "Customer" 返回 6 个值(每个值对应 "Orders" 表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY 语句解决了这个问题。
​
HAVING 子句
    在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。主要是对合计结果做过滤
    SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
​
LEN 函数返回文本字段中值的长度。 SELECT LEN(column_name) FROM table_name
ROUND 函数用于把数值字段舍入为指定的小数位数。  SELECT ROUND(column_name,decimals) FROM table_name
NOW 函数返回当前的日期和时间。 SELECT NOW() FROM table_name

总结

都是些基本操作,也算是回顾复习了吧!!!

参考

http://www.w3school.com.cn/sql/sql_quiz.asp

你可能感兴趣的:(数据库)