1. 程式人生 > >sql語句實現查詢

sql語句實現查詢

    說明:此內容銜接上一次的內容,所有的語句是屬於sqlite,並且都經過除錯,結果都是正確的;

    十八、資料的插入

    建立一個actor_name表,將actor表中的所有first_name以及last_name匯入改表。 actor_name表結構如下:

    實現語句:

  create table if not exists actor_name(
    first_name varchar(45) not null,
    last_name varchar(45) not null
     );
   insert into actor_name select first_name,last_name from actor;

技術要點:

     1. 用create table 語句建立actor_name 表      2. 用inset into actor select插入子查詢的結果集(不需要用values(),()這種形式。這種形式是手工插入單條資料或多條資料時用圓括號分割。插入結果集是不需要)      即,插入單條資料或是多條資料時,需要使用values語句進行資料的插入      例如:insert into table (ziduan1,ziduan2)                 values ('100','aa'),                             ('200','bb');
        若是插入的結果集,則不需要使用values,直接插入即可;        例如:insert into table                   select *                    from table2;      十九、建立表的索引      針對如下表actor結構建立索引:
CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,

last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))
對first_name建立唯一索引uniq_idx_firstname,對last_name建立普通索引idx_lastname     實現語句: create unique index uniq_idx_firstname on actor(first_name);
   create index idx_lastname on actor(last_name);
  注意:唯一索引:unique index    普通索引:index     二十、SQL語句實現檢視的建立     針對actor表建立檢視actor_name_view,只包含first_name以及last_name兩列,並對這兩列重新命名,fist_name為first_name_v,last_name修改為last_name_v:
CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))     實現語句:      create view actor_name_view as
     select first_name as fist_name_v, last_name as last_name_v
     from actor;
     或者是:     create view actor_name_view(fist_name_v,last_name_v) as
    select first_name,last_name
    from actor;
   二十一、使用強制索引實現查詢     針對salaries表emp_no欄位建立索引idx_emp_no,查詢emp_no為10005, 使用強制索引。     實現語句:  select  *    from salaries     indexed by idx_emp_no    where emp_no=10005;   二十二、向已經存在的表中新增、刪除、修改欄位   實現語句:   1.增加一個欄位
alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一個欄位,預設為空
alter table user add COLUMN new2 VARCHAR(20) NOT NULL;  //增加一個欄位,預設不能為空  www.2cto.com  

2.刪除一個欄位
alter table user DROP COLUMN new2;   //刪除一個欄位

3.修改一個欄位
alter table user MODIFY new1 VARCHAR(10);  //修改一個欄位的型別

alter table user CHANGE new1 new4 int;  //修改一個欄位的名稱,此時一定要重新指定該欄位的型別
   二十三、SQL語句實現建立觸發器    構造一個觸發器audit_log,在向employees_test表中插入一條資料的時候,觸發插入相關的資料到audit中。
CREATE TABLE employees_test(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE audit(
EMP_no INT NOT NULL,
NAME TEXT NOT NULL
);   實現語句: create trigger audit_log   AFTER INSERT ON employees_test
  FOR EACH ROW
  BEGIN
     insert into audit(EMP_no,NAME) values(new.ID,new.NAME);
  END;
   二十四、SQL語句實現記錄刪除   刪除emp_no重複的記錄,只保留最小的id對應的記錄。
CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);
  實現語句:   delete from titles_test
  where id not in(
  select min(id)
  from titles_test
  group by emp_no
);
  二十五、資料的更新   實現語句:   update table    set ziduan=''   where ziduan2='';    將id=5以及emp_no=10001的行資料替換成id=5以及emp_no=10005,其他資料保持不變,使用replace實現。    實現語句:    UPDATE titles_test  
  SET emp_no = REPLACE(emp_no,10001,10005) 
  WHERE id = 5;
   注意:replace(欄位名,被替換掉的,替換的)函式的用法;    二十六、資料庫更改表名    實現語句:     alter table table1     rename to ss;(ss表示新的表名)    二十七、建立完整的表(包括索引、外來鍵、主鍵)     實現語句:     create table table1( no INTNOTNULL AUTO_INCREMENT,
product_category INT NOT NULL,product_id INT NOT NULL,customer_id INT NOT NULL,PRIMARY KEY(no),INDEX (product_category, product_id),FOREIGN KEY(product_category, product_id) REFERENCES product(category, id)ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (customer_id), FOREIGN KEY (customer_id) REFERENCES customer(id));    二十八、建立表的外來鍵約束    在audit表上建立外來鍵約束,其emp_no對應employees_test表的主鍵id。    實現語句:     drop table audit;     create table audit(       EMP_no INT NOT NULL,
    create_date datetime NOT NULL,
    FOREIGN KEY(EMP_no) REFERENCES employees_test(ID));
   二十九、實現字串的連線     注意:在sqlite中是通過||實現字串的連線    實現語句:    select  last_name ||  "'" first_name     from  employees;   三十、查詢字串中的逗號的個數   解題技巧:巧用length函式以及replace函式;   實現語句:    select  length('10,A,B')-length(replace('10,A,B',',',"")) as cnt;    三十一、replace與substring結合使用(MySQL語句實現)    查詢資料型別為varchar型別的日期(2001-09-09)獲取其年份    實現語句:    select SUBSTRING(REPLACE(book_date,'-',''),1,4)
   from book_info;
   輸出結果為:2001    知識點:MySQL語句中substr與substring函式的區別:    同樣,select SUBSTR(REPLACE(book_date,'-',''),4)
                from book_info;(輸出結果為:10909)
    同理,select SUBSTR(REPLACE(book_date,'-',''),-4)
                from book_info;(輸出結果為:0909)
  注意:在substr中正、負數,表示從左右開始數;   三十二、group_concat的用法    按照dept_no進行彙總,屬於同一個部門的emp_no按照逗號進行連線,結果給出dept_no以及連接出的結果employees    實現語句:  select dept_no,group_concat(emp_no) as employess    from  emp_dept    group by dept_no;   三十三、查詢平均工資   查詢排除當前最大、最小salary之後的員工的平均工資avg_salary。   語句實現:   select avg(s.salary) as avg_salary
  from salaries s
  where s.salary <> (select max(salary) from salaries)
  and s.salary <> (select min(salary) from salaries) 
  and s.to_date='9999-01-01';
  三十四、利用limit函式顯示分頁查詢   分頁查詢employees表,每5行一頁,返回第2頁的資料   實現語句:    select *
   from employees
   limit 5,5;
  解題技巧:此題巧妙利用limit函式實現分頁技術;