5 Kasım 2018 Pazartesi

MySQL

Sütun Tipleri
MySQL Sütun Tipleri yazısına taşıdım.

Constraint
Şöyle yaparız.
CONSTRAINT my_table_ibfk_1 FOREIGN KEY (group_id) REFERENCES groups (id)
Primary Key 
Şöyle yaparız.
PRIMARY KEY (id)
Unique Key
Şöyle yaparız.
UNIQUE KEY uix_key1 (name,group_id),
Key 
Şöyle yaparız.
KEY group_id (group_id),

Case + When
gender alanı 'Male' değilse ne döner bilmiyorum. Şöyle yaparız.
SELECT
  year_added,
  COUNT(case when gender='Male' then 1 end) as malecount,
  COUNT(case when gender='Female' then 1 end) as femalecount,
  COUNT(*) as totalcount
FROM tbl WHERE status = 1 GROUP BY year_added
Case + When + Else
Şöyle yaparız.
CASE 
  WHEN qty_1 <= '23' THEN price
  WHEN ... THEN ...
  WHEN ... THEN ...
  WHEN ... THEN ...
  ELSE 1
END

Charset
Tabloyu yaratırken verilir. Şöyle yaparız.
CREATE TABLE StationTimezone (
...
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Şöyle yaparız.
CREATE TABLE file_server (
  ...
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Şöyle yaparız.
CREATE TABLE my_table (...)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
Cross Join
MySQL Join yazısına taşıdım.

Comment
Tabloya veya sütuna verilir.  Şöyle yaparız.
CREATE TABLE StationTimezone (
  Timezone varchar(50) NOT NULL COMMENT 'Name of the timezone',
  ...
  
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='CityCode to Timezone mapping';
Concat
İki veya üç string'i birleştirir. Şöyle yaparız.
SELECT CONCAT('MY NUMBER ', T.NUM, ' IS MINE') AS 'ERR'
FROM YourTable T
WHERE ...
Concat_Ws
Açıklaması şöyle
CONCAT_WS() does not skip empty strings. However, it does skip any NULL values after the separator argument.
Girdi null ise birleştirme yapmaz. Şöyle yaparız.
SELECT 
    id, 
    CONCAT_WS(',',
              IF(`field1` = 'no', 'field1', null),
              IF(`field2` = 'no', 'field2', null),
              IF(`field3` = 'no', 'field3', null)
    ) AS fields
FROM  `your_table`
Count (*)
Açıklaması şöyle
The COUNT() function returns the number of rows that matches a specified criteria.
Şöyle yaparız.
select count(*) from tab1;
Create Event
Şöyle yaparız.
DELIMITER $$
CREATE EVENT test ON SCHEDULE EVERY 2 MINUTE
DO 
BEGIN
  SELECT 1;
  SELECT 2;
END $$
DELIMITER;
Delimiter'ın neden kullanıldığının açıklaması şöyle
If you use the mysql client program to define a stored program containing semicolon characters, a problem arises. By default, mysql itself recognizes the semicolon as a statement delimiter, so you must redefine the delimiter temporarily to cause mysql to pass the entire stored program definition to the server.
Create Trigger
Yeni eklenen kayıt dosyaya şöyle yazılır.
create trigger ins_transaction AFTER INSERT ON tbl 
 select new into outfile filename.txt;
Create View
Şöyle yaparız.
create view SalesData as
select orders.order_id, items.item_id from orders
join order_details
on orders.order_id = order_details.order_id
...;
Date_Format
MySQL Date ve Time Metodları yazısına taşıdım.

Date_Sub 
MySQL Date ve Time Metodları yazısına taşıdım.

Exists
Inner Join yerine kullanılabilir. Şöyle yaparız.
DELETE FROM dataproc e 
WHERE EXISTS(SELECT 1 FROM unsubscribers j WHERE e.EMAIL = j.EMAIL);
Explain
Sorguların Execution Plan detayını gösterir. Şöyle yaparız.
mysql> EXPLAIN SELECT * FROM sentence WHERE sentence_lang_id = "AMH"\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sentence
         type: ref
possible_keys: sentence_lang_id
          key: sentence_lang_id
      key_len: 153
          ref: const
         rows: 442
        Extra: Using where
Type sütunu - eqref
Bu alanın eqref olması iyi bir şeydir. Belirtilen kaydı aramak için Primary Key veya Unique Key kullanıldığını gösterir. Yani nokta atışı yapılıyor. rows sütununun 1 görünmesi gerekir.

Type sütunu - index
Bu alanın index olması her zaman çok iyi bir şey değildir. Tüm index'in dolaşıldığı anlamına gelir. rows sütunu ile birlikte bakılarak kaç tane satırın index ile dolaşıldığı görülebilir.

Rows Sütunu
Kaç tane satırın dolaşıldığını gösterir.

Grant All
Şöyle yaparız.
GRANT All ON *.* TO 'root'@'localhost';
Grant Execute
Şöyle yaparız.
GRANT EXECUTE ON dbname.* TO 'username'@'localhost';
Grant - Uzaktan bağlanma
MySQL genellikle sadece localhost'tan bağlanılacak şekilde ayarlı oluyor. Uzaktan bağlanma imkanı tanımak için şöyle yapabiliriz.
GRANT ALL PRIVILEGES ON database.*
TO 'youruser'@'%'
IDENTIFIED BY 'yourpassword';
Group By + Having Count
Having Count gruplama yapılan sütun için kullanılabilir. Şöyle yaparız.
SELECT group_id FROM my_table GROUP BY group_id HAVING count(group_id) > 100;
Having Count başka sütunlar için de kullanılabilir. Şöyle yaparız.
Select student_id from STUDENT group by student_id having count(assignment_done) =
 max(assignment_done);
Insert Into
Söz dizimi şöyle
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    {VALUES | VALUE} (value_list) [, (value_list)] ...
    [ON DUPLICATE KEY UPDATE assignment_list]
Örnek
Aynı anda birden fazla satır eklemek için şöyle yaparız.
insert into user(username,password,email,created,last_updated) 
values
('...','...','...',current_timestamp(),current_timestamp()), 
('...','...','...',current_timestamp(),current_timestamp());
Left Join
MySQL Join yazısına taşıdım.

Load Data
Şöyle yaparız.
mysql> LOAD DATA LOCAL INFILE 'Desktop/tr.txt'  INTO TABLE employee_data;
Lock Tables
Şöyle yaparız.
use mydb ;
lock table user write;
insert into user(username,password,email,created,last_updated) values
  ('...','...','...',current_timestamp(),current_timestamp())

unlock tables;
Sum ve Group By
Elimizde şöyle bir tablo olsun
TABLE orders
userid |  theorder  |   price  
-------------------------------
  20   | Cigar      |  5.00
  20   | Beer       |  6.00
  20   | Whiskey    |  20.00
  20   | Bacon      |  10.00
  21   | Beer       |  10.00
  21   | Bacon      |  10.00
  22   | Cigar      |  10.00
Gruplayıp toplamı görmek için şöyle yaparız.
SELECT
    GROUP_CONCAT(theorder SEPARATOR ', '),
    userid,
    sum(price)
FROM orders
GROUP BY userid
Çıktı olarak şunu alırız.
userid |             list            |   price
-------------------------------------------------
   20  | Cigar, Beer, Whiskey, Bacon |  41.00
   21  | Beer, Bacon                 |  20.00
   22  | Cigar                       |  10.00
If
MySQL If Koşulu yazısına taşıdım.

In
Şöyle yaparız.
SELECT * FROM sentence WHERE sentence_lang_id in ("AMH")
Inner Join
Inner Join yerine Exists kullanılabilir. Şöyle yaparız.
DELETE e FROM dataproc e 
INNER JOIN unsubscribers j ON e.EMAIL = j.EMAIL;
Insert Into
Şöyle yaparız.
insert into T(...,...) select ...,... from S where ...; 
Bu cümle S tablosunun tüm satırlarına kilit koyar.
Is Null
Şöyle yaparız.
select * from table where (order_id != 1 or order_id is null)
Left ve Right
İlk 4 ve sonr 4 karakteri seçip birleştirmek için şöyle yaparız.
select concat(left(col, 4), right(col, 4))
Like
Aranacak metin %...% karakterleri arasına alınır. Eğer aranacak metin içinde de % karakteri varsa \% şeklinde escape edilir. 1% şöyle yapılır.
ProductName LIKE '%1\%%'
Limit
Şöyle yaparız.
SELECT * 
FROM   receipts AS R
WHERE  R.date_id IS NOT NULL
ORDER  BY R.id ASC 
LIMIT  20 
Offset
5. sıradan başlayarak 10 satırı dönmek için şöyle yaparız.
select * from template_master
     where  status='active' and id >= 5  
     order by id asc LIMIT 10 OFFSET 5;
Order By
Sıralama yönü belirtilmiyorsa ASC olduğu kabul edilir.
ORDER BY average, votes DESC
Şuna çevrilir.
ORDER BY average ASC, votes DESC
ASC kullanıyorsak null değerler önce gelir. Açıklaması şöyle
"When doing an ORDER BY, NULL values are presented first if you do ORDER BY ... ASC and last if you do ORDER BY ... DESC."
İki sütüna göre sıralamak için şöyle yaparız.
ORDER BY NAME ASC, EMAIL ASC
Replace
Belirtilen string'i başka bir şey ile değiştirir. 1% string'indeki % karakterini \% ile değiştirmek için şöyle yaparız.
WHERE data LIKE CONCAT('%',REPLACE('1%', '%', '\%'),'%');
Set Session
Şöyle yaparız.
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
Substr
İlk 4 ve sonr 4 karakteri seçip birleştirmek için şöyle yaparız.
select concat( substr(yourField, 1, 4 ), substr(yourField, -4 ) )
Sum
MySQL Aggregate Meodları yazısına taşıdım.

Tables tablosu
Şöyle yaparız
SHOW TABLES WHERE Tables_in_db REGEXP '^table_2[0-9]'
TimeStampDiff metodu
MySQL Date ve Time Metodları yazısına taşıdım.

Truncate
Tüm tabloyu siler. Ayrıca AUTO INCREMENT alanları da sıfırlar. Şöyle yaparız.
TRUNCATE TABLE yourTable;
Union All
Şöyle yaparız.
SELECT * from sales a
UNION ALL
SELECT times,payment_amount from transaction
User Defined Variable
Örnek 1
Şöyle bir tablo olsun çıktısı isteyelim.
+-----------+--------------+---------------+
 |    DEBIT  |    CREDIT    |    BALANCE    |
 +-----------+--------------+---------------+
 |      0.00 |       700.00 |       -700.00 |
 |      0.00 |       700.00 |      -1400.00 |
 |    400.00 |         0.00 |      -1000.00 |
 |   2000.00 |       500.00 |        500.00 |
 +-----------+--------------+---------------+
Yeni bir değişkeni sütun olarak hesaplamak için şöyle yaparız.
SELECT debit,credit, @balance := debit - credit AS balance
 FROM balancetable,
Örnek 2
row_id özelliğini kendimiz yapmak isteyelim. Şöyle yaparız.
select 
   @i:=@i+1 as iterator, t.* 
from 
   big_table as t, (select @i:=0) as foo



Hiç yorum yok:

Yorum Gönder